CF1392(div1+div2)
A
sb 题。
B
sb 题。
C
NOIp 2018 D1T1
D
特判题,烦人。
E [* easy]
给定 \(n\),你需要构造一个大小为 \(n\times n\) 的棋盘,每个元素的值由你指定。
接下来做 \(q\) 次查询,每次规定一个路线,然后从 \((1,1)\) 走到 \((n,n)\),告诉你经过的元素的权值和,你需要还原这个路线。
棋盘内元素的值有你指定,不大于 \(10^{16}\)。
\(n\le 25\)
Solution
观察到 \(2^{50}\le 10^{16}\),所以考虑逐位确定。
考虑每条对角线,每条对角线上 \(0,2^k\) 交替填就可以了。
F [* medium]
结论题,枯了。
CF1392G [* hard]
给定一个长度为 \(k\) 的 01
串 \(s,t\),给定 \(n\) 个操作,第 \(i\) 个操作为交换 \(s\) 中的 \(u_i\) 和 \(v_i\)
然后你选择一个区间的操作依次执行,这个区间的长度不能小于 \(m\)。
最大化 \(s\) 和 \(t\) 相同的位置数量。
\(m,n\le 10^6,k\le 20\)
Solution
神仙题。
设 \(w(s,t)\) 表示 \(s\) 和 \(t\) 得到的答案。
\(p(l,r)\) 表示顺序操作 \(l\to r\)
\(p(r,l)\) 表示顺序操作 \(r\to l\)
- 性质 1
若 \(s\xrightarrow{p(l,r)}s',t\xrightarrow{p(l,r)}t',w(s,t)=w(s',t')\)
注意到每一位是独立被操作了相同的,不会改变。
所以设 \(s\xrightarrow{p(l,r)}s'\),那么若 \(s'\xrightarrow{p(r+1,n)}s'',t\xrightarrow{p(r+1,n)}t''\),则 \(w(s',t)=w(s'',t'')\)
同理,答案也等价于 \(s'\xrightarrow{p(l-1,1)}s'',t\xrightarrow{p(r,1)}t''\) 情况下的答案。
所以我们得到了 \(n\) 个字符串 \(s'\) 和 \(n\) 个字符串 \(t'\),我们发现问题等价于选两个下标差大于等于 \(m\) 的字符串并得到答案。
还是不好做。
然后观察到,所有 \(s/t\) 的二进制下 \(1\) 的个数固定,设 \(\textrm{bit}(s)\) 为 \(a\),\(\textrm{bit}(t)=b\),\(\textrm{bit}(s~\mathbf{and}~t)=c\),那么有答案为 \(k-(a-c)-(b-c)=k-a-b+2c\),所以问题等价于最大化 \(c\)
然后维护 \(f_{0,x}\) 表示所有 \(s_i=x\) 中最小的 \(i\),维护 \(f_{1,x}\) 表示所有 \(t_i=x\) 中最大的 \(i\)
然后将他们进行子集转移,对于某个 \(x\),如果 \(f_{1,x}-f_{0,x}\ge m\),那么就可以更新答案,即存在两个字符串满足其并大于等于 \(\textrm{bit}(x)\)。
复杂度为 \(\mathcal O(nk+2^kk)\)
H [* hard]
给定 \(n\) 张数字牌 \(1\sim n\),\(m\) 张鬼牌,每次随机抽一张牌,现有一个集合 \(S\):
- 若其为数字牌,那么给 \(S\) 中加入其,并移除。
- 若其为鬼牌,则将被移除的牌加回来,如果此时 \(S\) 构成了全集,那么 GG
求期望操作次数。
- 请注意 \(S\) 不会删减。
\(n,m\le 2\times 10^6\)
Solution
好仙啊!
考虑答案可以怎么计算,实际上我们可以认为我们每次的操作为一直抽牌直到抽到鬼牌。
于是答案就是期望抽牌的次数乘以单次抽牌的轮数。
单次抽牌的轮数可以转换为操作 \(i\) 次后仍没有抽到鬼牌的概率和,即:
接下来考虑抽卡轮数的期望,这个本身不太好算,但我们可以考虑 \(\min-\max\) 容斥,现在只需要考虑期望操作多少轮之后可以得到 \(S\) 中的一张牌。
仍然考虑转换期望,变成操作了 \(i\) 次之后没有抽到牌的概率和,同时不难发现每轮的操作独立,同一轮的操作只需要关注操作了剩余的 \(n-|S|\) 张牌。
设 \(p\) 为操作一轮后没有 D 到集合 \(S\) 中的牌的概率,不难得到期望的操作轮数为:
即:
同时,设 \(k=n-|S|\),不难发现 \(p\) 为:
回代得到答案:
最后得到最终答案:
然后我们就可以得到答案了。
I [* hard]
给定 \(n\times m\) 的矩形,给定长度为 \(n,m\) 的数列 \(\{a\},\{b\}\),对于 \((i,j)\),其权值定义为 \(a_i+b_j\)
对于常数 \(x\),按照此规则:
- 假设一个点的权值大于等于 \(x\),那么设为 "红色"。
- 否则设为 "蓝色"。
对于一个同色连通块,假设其触碰到了边界,那么其贡献为 \(1\),否则为 \(2\)。
求红色连通块的权值和减去蓝色连通块的权值和。
多组查询,每次给定 \(x\)
\(n,m,q,a_i,b_i\le 10^5,x\le 2\times 10^5\)
Solution
对于某个 \(x\),如果一个点的权值大于等于 \(x\) 那么设为红色,否则设为蓝色,接下来对于全体红色点构成的图称为 \(G_1\),对于全体蓝色点构成的图称为 \(G_2\)
先尝试表达出两个图上的连通块的数量,由于图为平面图,根据欧拉公式:
即点数减去边数加上面数为连通块数 \(+1\)
由于没有触碰到边界的连通块和触碰到了边界的连通块对答案的贡献不同,所以直接处理是非常麻烦的。
考虑 \(G_1\) 的每个连通块,不难发现内部一定是由若干个四连通块构成(或者不存在面)
每个四连通块都代表着一个面,设其数量为 \(f_1\),接下来通过一定的观察,我们发现 \(G_1\) 中的面除去此类四连通块和 "外面",每个面均代表着 \(G_2\) 中的一个没有碰到边界的连通块。
设没有碰到边界的连通块数量分别为 \(g_1,g_2\),那么就有 \(g_1=F_2-f_2-1,g_2=F_1-f_1-1\)
于是我们实际上想要统计的答案为:
等价于:
(这里提前把 \(+1/-1\) 均消去了)
即:
于是我们最终只需要统计点数差,边数差,四连通块数量差即可。
对于某个 \(x\),点数差即有多少对 \((i,j)\) 满足 \(a_i+b_j\ge x\),这个可以通过 FFT 卷积处理 \(x=a_i+b_j\) 的点对 \((i,j)\) 数量,然后做后缀和得到结果。
对于某个 \(x\),竖着的边为红色当且仅当 \(a_i+b_j\ge x,a_{i+1}+b_j\ge x\),等价于 \(\min\{a_i,a_{i+1}\}+b_j\ge x\),也可以通过卷积处理,横着的边类似。
对于某个 \(x\),四连通块的贡献也可以类似处理\((\min(a_i,a_{i+1})+\min(b_j,b_{j+1})\ge x)\)。
小于的情况就反过来即可。
复杂度为 \(\mathcal O(w\log w+q)\),其中 \(w\) 为值域,即 \(10^5\)。
会附带 FFT 的本身的常数,和你需要做 \(13\) 次 FFT 的常数。