19
https://www.luogu.com.cn/problem/P9261
考虑刻画连通块数量:它等于 \(1\times 1\) 的矩形数量减去 \(1\times 2\) 的矩形数量减去 \(2\times 1\) 的矩形数量加上 \(2\times 2\) 的矩形数量,这是欧拉平面图定理。一个矩形存在的条件是,\(l\) 在一段前缀内,\(r\) 在一段后缀内。所以直接扫描线,需要支持区间加减,并对 \(1\le k\le v\) 的每个数,查询其在区间内的出现次数。这个看起来很不能做,但注意到连通块数量始终 \(>0\),所以只需在线段树上维护区间的 \(\min\),以及 \(\min,\min+1,\dots,\min+k\) 的出现次数。复杂度 \(O(nk\log n)\)。
http://xsy.gdgzez.com.cn/JudgeOnline/problem.php?cid=2383&pid=1
考虑用树剖维护动态 dp,设 \(f_i\) 表示 \(i\) 的子树的答案,对于每个点 \(i\),用对顶堆维护它的轻儿子的 \(f\) 的前 \(b_i-1\) 大值,然后就可以把所有 \(f\) 的转移写成 \(f_i=\max(f_{son_i},x)+y\) 的形式。这个转移的形式是有结合律的,并且一次对 \(a\) 的修改也只会改变 \(O(\log n)\) 个点的转移方程,直接套个线段树,复杂度 \(O(n\log^2n)\)。
http://xsy.gdgzez.com.cn/JudgeOnline/problem.php?cid=2382&pid=0
这个题太难了!
设 \(\log(x)\) 表示 \(x\) 在二进制表示下的最高位 \(1\) 的位置。设 \(b_i=\log(a_i)\),初始 \(\log(w)\) 为 \(k\)。答案有一个很显然的下界,叫做 \(\sum[b_i<k]\)。其实答案的上界至多是下界 \(+1\)。这是因为在整个过程中,\(\log(w)\) 是不增的,并且异或了一个 \(b=\log(w)\) 的数之后,\(\log(w)\) 一定会变小,所以不可能选到两个 \(b=k\) 的数。
接下来只需要 check 能不能选到一个 \(b=k\) 的数即可。枚举这个数。取出它后面所有 \(b\) 的后缀最大值的位置,然后非常神奇地,所有对合法性的判断都可以写成 \([\log(w\operatorname{xor}x)=y]\) 的形式。感觉这个讲不清楚,不如看代码。
代码
void init(int k) {
st[top = 1] = n + 1; mp.clear();
for (int i = 0; i <= 30; i++) hg[i].clear();
for (int i = 1; i <= n; i++) {
s[i] = s[i - 1];
if (b[i] < k) s[i] ^= a[i];
}
for (int i = n; i >= 1; i--) {
if (b[i] > k) continue;
if (b[i] >= b[st[top]]) st[++top] = i;
if (b[i] < k) continue;
for (int j = top; j >= 1; j--) {
for (int x = b[st[j]] - 1; x > b[st[j - 1]]; x--)
if (!((a[st[j]] >> x) & 1)) hg[x][(s[st[j]] ^ a[i] ^ (1 << x)) >> x << x] = 1;
if ((a[st[j]] >> b[st[j - 1]]) & 1) break;
if (j == 1) mp[s[n] ^ a[i]] = 1;
}
top--;
}
}
int chk(int x) {
if (mp.count(x)) return 1;
for (int i = 0; i <= 30; i++)
if (hg[i].count(x >> i << i)) return 1;
return 0;
}
总结:要非常细心地想。
http://xsy.gdgzez.com.cn/JudgeOnline/problem.php?cid=2393&pid=2
这个题太难了!
考虑怎么 check 一个二分图有没有完美匹配。给邻接矩阵上每个 \(1\) 的位置随机赋权,然后只需要判 \(\det\) 是否为 \(0\)。
考虑如果不能修改边的颜色怎么做。在矩阵的每个位置上维护一个多项式,初始是 \(x^{2^{w_{i,j}}}\),然后求或卷积意义下的 \(\det\)。实现的时候,需要先把每个多项式做一遍 fwt,对每一次项的系数求出 \(\det\) 之后,再 ifwt 回去。
考虑能修改边的颜色怎么做。在多项式上再加一个元 \(y\),它的次数表示修改边颜色的次数。那么矩阵上初始的多项式就是 \(x^{2^{w_{i,j}}}y^0+(x^{2^{w_{i,j}-1}}+x^{2^{w_{i,j}+1}})y^1\),求 \(\det\) 对 \(y^2\) 取模的结果。还是像上面这么做,复杂度 \(O(n^32^k)\)。
https://newoj.daimayuan.top/p/4782?tid=69a0095a405b535261a12cae
称左部点为黑点,右部点为白点。给边定向,指向父亲,最后把答案除以 \(2\)。
从大到小加入黑点,在加入一个黑点的同时也加入所有它可达的点。设 \(dp_{i,j,k}\) 表示加入了所有编号 \(\ge i\) 的黑点,加入了 \(j\) 个白点,以及 \(k\) 个编号 \(<i\) 的黑点(这些黑点还未被确定编号)。转移的时候,考虑点 \(i\) 是接在已有的一棵基环树上,还是新开一棵基环树。直接做是 \(O(n^4)\),前缀和优化即可 \(O(n^3)\)。
https://newoj.daimayuan.top/p/4794?tid=69a15d22405b535261a58a75
求区间的区间并,是可以扫描线的,用颜色段均摊+线段树维护。

浙公网安备 33010602011771号