11月15日 Educational Codeforces Round 56 题目链接:https://codeforces.com/contest/1093
D - Beautiful Graph
思路: 一个简单的计数题。
首先根据题意可以得知,一条边两端的奇偶性一定要是不同的,因此只有二分图是存在可行方案的。考虑计数,先二分图染色(假设染成黑白两色),那么对于每一个连通块可行的方案就是 $2^{白色点数}+2^{黑色点数}$,然后总方案就是每个连通块方案的乘积。
代码:
1 |
|
E -Intersection of Permutations
思路: E 题就是个这么毒瘤的数据结构。。正解似乎是树套树,但是 CDQ 显然能做。
先可以将问题转化一下,处理出数组 $b$ 中的数字在数组 $a$ 中的位置记为数组 $c$,那么询问操作就是询问 $c[lb~rb]$ 中有多少个数的值在 $la~ra$ 内。这是一个二维数点问题,可以使用树状数组维护,由于有修改操作,那么就用 CDQ 基于时间一维进行分治就好了。时间复杂度也是 $O((n+m)log^2n)$。
代码:
1 |
|
F - Vasya and Array
思路: 是一个很有趣的 DP。
如果不考虑限制可以得到转移:$f[i][j]=\sum_{x=1}^{k} f[i-1][x]$,其中如果 $a[i]=-1$ 那么 $j$ 可以取 $1~k$ 所有数,否则 $j$ 只能取 j。接下来就是要把不合法的状态减去,我们记录一个数组 $pre[i]$ 表示从下标 $pre[i]$ 开始全可以取数字 $i$,由此我们就可以判断一个状态是否合法。如果数字 $j$ 在位置 $i$ 上不合法,那么我们就应该减去 $\sum_{x!=j} f[i-len][x]$。
代码:
1 |
|
G - Multidimensional Queries
思路: G 题与 E 题比反而是一个比较简单的数据结构题。
考虑 $k$ 比较小,于是我们可以对一个点枚举在每一维上对答案的贡献情况,即在公式 $\sum \limits_{i = 1}^{k} |a_{x, i} - a_{y, i}|$ 去掉绝对值时的符号。对于我们枚举的每一种情况,由于去掉了绝对值,答案便是求一个区间内最大值与最小值之差,这个可以很简单的用线段树去维护。
为了减小码量,对于每一棵线段树可以只维护最小值。而最大值与最小值之差就是当前状态下的最小值与相反状态下最小值的和。
代码:
1 | Copy |