做题笔记19
10.11
#8185. Emerging Tree
每个点维护其儿子的相对顺序,记 \(L(u)\) 和 \(R(u)\) 两个有序集合,存储 \(u\) 的儿子的顺序,\(L(u)\) 表示在 \(u\) 的前面,\(R(u)\) 表示在 \(u\) 的后面,为了方便 倒序存储,记 \(L(u)\) 的大小为 \(kl\),\(R(u)\) 的大小为 \(kr\),那么我们最终的序列形如 \(L(u)_{kl},L(u)_{kl-1},\cdots,L(u)_1,u,R(u)_1,R(u)_2,\cdots,R(u)_{kr}\),以此顺序做 dfs 输出就是答案
现在考虑假如 \(u\rightarrow v\) 这条边,如果 \(u\) 目前 dfs 出来的序列是 \([x_1,x_2,\cdots,x_{k_1}]\),\(v\) 目前 dfs 出来的序列是 \([y_1,y_2,\cdots ,y_{k_2}]\),那么我们肯定是让 \(x_1\) 或 \(x_{k_1}\) 和 \(y_1\) 或 \(y_{k_2}\) 拼在一起,也就是说要么让 \(v\) 拼在目前 \(u\) 所有儿子的最右边,要么拼在最左边,否则拼在中间肯定就爆了,因为这样就不满足之前的限制了
假如两个端点分别是 \(x\) 和 \(y\),\(x\) 和 \(y\) 在其对应联通块的左边还是右边并无关系,因为我们可以通过翻转一棵子树来使其合法,其中 \(x\) 在 \(u\) 的儿子 \(u'\) 的子树中,\(y\) 在 \(v\) 的儿子 \(v'\) 的子树中,我们发现。\(u'\) 的子树此时必须是满的,即 \(u'\) 子树中的点都已经在同一个连通块里,或者 \(x=u\),要不然你再拼东西的时候就爆了,同理,\(v'\) 的子树此时也必须是满的,或者 \(y=v\)
直接维护即可,我们还要注意如果我们拼上了 \(u+v\),此时多出来一条边 \(v\rightarrow w\),那么我们就不能拼 \(w+v\),所以需要打个标记来记录 \(v\) 的哪边不能再拼东西了
复杂度线性
#6546. Greedy Bipartite Matching
扫描 \(w\),每次加入权值为 \(w\) 的边,求出当前的最大匹配,然后把之后所有包含当前点覆盖的边都去掉,当前所有两端点都在点覆盖中的边去掉,再接着这个过程做就行,答案即为每次最大匹配的前缀和
为啥是对的,对于每种边权,其最小点覆盖和原图中的肯定一样,匹配大小也相同,所以只需要求 \(q\) 次最大匹配
每次的残量网络相当于一张 \(\mathcal{O}(m_i)\) 个点 \(\mathcal{O}(m)\) 条边的图,故复杂度 \(\mathcal{O}(\sum m\sqrt m_i)\le \mathcal{O}(m\sqrt {qm})\)
可以匈牙利分析到 \(\mathcal{O}(matching(n,m)+nq)\)
匈牙利咋跑最小点覆盖?将左部点中没有匹配的点的集合称作 \(U\),那么从 \(U\) 中每个点出发跑一边 bfs,每条 bfs 的路径都沿着组交错路,记经过的点集为 \(Z\),就能得到点覆盖 \(C=(L/ Z)\cup(R\cap Z)\)
#8184. Different Summands Counting
考虑贡献,二项式反演,答案即为
后面那个组合数前缀和是一个最多 \(m\) 次多项式,拉插即可
#8086. Cloyster
!?强强?!
考虑所有行的 \(\max\),我们发现这些最大值是单峰的,即存在一个行 \(i\) 使得 \([1,i]\) 行的最大值单调递增,\([i,n]\) 行的最大值单调递减,所以我们可以考虑分治,具体来说,询问中间行,并找到其最大值,查询它周围的 \(6\) 个点,如果比他大的在上面就向上递归,否则向下递归
如果直接递归子矩形,会出现大问题,因为这时候边界上的点周围会没有比它大的,咋办,我们把我们已知的那一圈拿出来,然后从那一圈的最大值 \(x\) 开始,顺次给每个点赋权值 \(x-i\times \epsilon\),这样子矩形内一圈周围肯定有比它大的,再询问中间行最大值的时候也算上最大值的那一圈,这样就对完了
每问 \(\frac{3}{2}n+12\) 个数可以让矩形缩小到原来的四分之一,总次数最多就是 \(3n+12\log n\),随便过
#1840. K-onstruction
考虑增量,如果当前集合中所有正数的和为 \(ps\),所有负数的和为 \(ng\),和为 \(0\) 的子集数量为 \(x\),不妨设 \(|ps|>|ng|\),现在考虑加入若干个 \(ps\) 的倍数,记这些数的集合为 \(S\),如果 \(S\) 中为 \(0\) 的子集数量为 \(A\),和为 \(-ps\) 的子集数量为 \(B\),那么新的和为 \(0\) 的子集数量就是 \(Ax+B\)
所以可以考虑随很多元素和 \(\ge 0\) 的小集合,记录他们和为 \(0\) 和 \(-1\) 的子集个数,直接和原来的组合起来,就很有可能构造出来小的方案
所以我们可以取大小 \(\le 10\) 且元素 \(\in\left\{-3,-2,-1,1,2,3\right\}\) 的集合作为小集合,如果 \(0\) 和 \(-1\) 的子集数量一样就放在一起,记 \(F_x\) 为元素和为 \(0\) 的子集个数为 \(x\) 的最小的集合,然后跑一个最短路就行了
10.12
敲敲代码
敲了两道就不愿意敲了,太懒了
P2483 【模板】k 短路 / [SDOI2010] 魔法猪学院
我操了,K 短路也写不动,虽然可能写起来挺唐的,但我就是写不动
P4119 [Ynoi2018] 未来日记
序列分块,并查集维护每个值有几个数
再上个值域分块帮助查询,复杂度 \(\mathcal{O}(n^{1.5})\)
#6551. Forever Young
我们先把序列看成完全单调的,对于每一个 \(i\) 都有 \(a_i>a_{i+1}\),然后考虑用一个 \(01\) 序列去刻画它,在 \(a_i\) 的位置放 \(0\),其他的位置放 \(1\),然后把左边补上无穷多个 \(0\),右边补上无穷多个 \(1\),那我们的操作就变成了,每次必须交换一对相邻的 \(01\),然后考虑把 \(0\) 看成石子,\(1\) 看成空地,每次操作就是把石子挪到相邻的空地上
那么我们记一个字符串 \(S\subseteq\left\{L,R\right\}^{k}\),其中 \(L\) 表示把石子往左挪,\(R\) 表示把石子往右挪,记 \(f(S)\) 为所有这样的字符串对应的操作序列的方案数,我们可以观察到结论:\(f(RL)=f(LR)+f(\emptyset)\),因为你考虑到 \(f(LR)\) 和 \(f(RL)\) 唯一的区别在于把同一个石子连着挪两次,否则肯定可以直接交换一下顺序,那初始情况下,\(f(RL)\) 能挪的是所有 \(01\) 的位置,而 \(f(LR)\) 能挪的是所有 \(10\) 的位置,由于 \(01\) 和 \(10\) 必定交替出现,而开头和结尾都是 \(01\),所以 \(01\) 的位置正好比 \(10\) 多以,于是结论得证
那我们可以扩展到 \(f(xRLy)=f(xLRy)+f(xy)\),所以我们可以不停的把 \(RL\) 变成 \(LR\) 以生成一个形如 \(LL\cdots LLRR\cdots RR\) 的串,不妨称其为简单串,如果我们能算出来所有简单串的答案,就能快速计算所有操作串的答案了
现在考虑怎么计算一个简单串的答案,我们发现简单串 \(L\) 和 \(R\) 的差值是一定的,也就是说如果知道了 \(L\) 的个数就一定会知道 \(R\) 的个数,而一个简单串就相当于,所有石子必须先向左挪一些距离再向右挪一些距离,并且不能存在某个时刻两个石子的路径相交,这引导我们考虑 LGV
不妨钦定一个排列 \(p\),原来为位于 \(ka_i\) 的石子挪到位于 \(kb_{p_i}\) 的地方,我们枚举中间点 \(x\),乘上容斥系数,其贡献就是
其中 \(S=\sum ka_i-x_i\),\(T=\sum kb_i-x_i\),即 \(L\) 的数量和 \(R\) 的数量
那么我们可以直接考虑生成函数 \(G_{x,y}(z)=\sum_{i}z^i\frac{1}{(x-i)!(y-i)!}\),有 \(m\) 个 \(L\) 的简单串的方案 \(g_m\) 就是
总方案咋算?每一个操作串都能通过每次交换或者删除相邻字符以得到一个简单串,考虑简单串的贡献,我们不妨枚举删了几对 \(RL\) 得到了一个简单串,那么答案就是
其中 \(l=\frac{k-sumb+suma}{2}-i\),\(r=k-2i-l\),\(f_{i}\) 是所有长度为 \(2i\) 的被删除的 \(LR\) 的方案,满足相匹配的 \(R\) 在 \(L\) 的前面,则有 \(f_{0}=1\),\(f_{n}=f_{n-1}\times(2(n-1)+1)\),即先在最后加入一个 \(L\),然后从前面 \(2n-1\) 个空里找一个放 \(R\)
这样就做完了,多项式的次数只有 \(\max(n,m)\),直接 NTT 可以求点值,\(L\) 和 \(R\) 不超过 \(suma\) 和 \(sumb\),复杂度 \(\mathcal{O}(\max(n,m)^3\max(\sum a_i,\sum b_i)+K)\)
#6555. Sets May Be Good
考虑把问题转化成求解膜 \(2\) 意义下 \(P(x_1,x_2,\cdots,x_n)=0\) 的解,其中所有的项都是形如 \(a_{i,j}x_ix_j\),满足 \(i\ne j\),考虑摘出来某一项,考虑 \(x_1\),那么 \(P\) 可以被拆成 \(x_1L(x_2,x_3,\cdots,x_n)+Q(x_2,x_3,\cdots,x_n)\) 的形式,\(L\) 只有 \(x_2,x_3,\cdots,x_n\) 的一次项,下面分讨一下 \(x_1,L,Q\) 的取值
当 \(L=1\) 时
- 若 \(x_1=1\),有 \(P=Q\)
- 若 \(x_1=0\),有 \(P=1-Q\)
当 \(L=0\) 时 - 有 \(P=Q\)
可以发现 \(L=1\) 的时候 \(P=0\) 和 \(P=1\) 的解的个数是相同的,我们只需要计算 \(L=1\) 的解,那就是有一个位不自由的,那解的个数差不多就是一个 \(2\) 的几次方,那我们只需要计算 \(L=0\) 且 \(Q=0\) 的情况的解的个数,处理 \(L=0\) 可以直接消元,那么我们便能递归子问题了
#7415. Fast Spanning Tree
!?强强?!
记 \(C_i\) 为 \(i\) 所在连通块的大小,若 \(C_a+C_b\ge S\),则 \(C_a\) 和 \(C_b\) 至少有一个 \(\ge \frac{S}{2}\),所以我们可以把 \((a,b,s)\) 拆成两个事件 \((a,\left\lceil\frac{S}{2}\right\rceil)\) 和 \((b,\left\lceil\frac{S}{2}\right\rceil)\),若 \(C_a\) 或者 \(C_b\) 超过 \(\left\lceil\frac{s}{2}\right\rceil\),就 check 一下是否 \(C_a+C_b\ge S\),否则将 \(S-C_a-C_b\) 再均分到两边,也就是更新为 \((a,C_a+\left\lceil\frac{S-C_a-C_b}{2}\right\rceil)\) 和 \((b,C_b+\left\lceil\frac{S-C_a-C_b}{2}\right\rceil)\),这样每个 \(S\) 最多更新 \(\mathcal{O}(\log S)\) 次,用一个堆维护当前能够合并的最小编号,再每个点开一个堆维护最小的更新的限制,直接启发式合并即可,复杂度 \(\mathcal{O}(n\log^2n)\)
#7417. Honorable Mention
可以直接串一串然后流出来,所以关于 \(k\) 是凸的
考虑线段树维护,记 \(f_{0/1/2,0/1/2,cnt}\) 表示左端点的状态,右端点的状态,有多少段,其中 \(0/1/2\) 分别表示当前点不选/选了且不是一段的开头/选了且是一段的开头,这样 \(cnt\) 就好维护了,直接维护有多少 \(2\) 就行了
线段树上闵和合并,询问的时候拉出来 \(\mathcal{O}(\log n)\) 个区间,直接闵和太唐了,所以可以外层 wqs 二分,每个区间分别二分凸包上的答案再合并,这样复杂度是 \(\mathcal{O}(n\log^3n)\) 的
于是考虑整体 wqs 二分,发现分治树里,每一层我们所二分的 \(mid\) 都是单调的,于是对于每一层可以把 \(mid\) 挂在线段树的节点上然后做询问,直接维护一个指针扫一遍,这样避免了在线段树的节点上二分,整个线段树全扫一遍的复杂度是 \(\mathcal{O}(n\log n)\) 的,而总共二分 \(\log n\) 层,所以总复杂度 \(\mathcal{O}(n\log^2n)\)
10.13
2077 真好玩
10.14
模拟赛
T1
有点弱,,,
T2
这么强?!
T3
我草原
T4
记 \(nxt_i\) 为 \(i\) 后面第一个和他颜色相同的,那么我们要算的就是前缀的 \(maxnxt-i\) 的最大值,这个可以直接单侧递归维护
#2605. Soccer Match
考虑随便给所有点红蓝染色,假如我们找到了一种方案,至少有 \(\frac{1}{2}M\) 条边其两端分别是红色和蓝色,那么此时由 \(M\ge2KN\) 可以得到 \(\frac{1}{2}M\ge KN\),即异色边的数量至少是有颜色的顶点的 \(K\) 倍,现在考虑调整,我们找到一个点,其异色邻居 \(\le K\),可以把他调整成白色,这样有颜色的顶点会减一,而异色边的数量最多减 \(K\),所以始终有异色边的数量至少是有颜色的顶点的 \(K\) 倍
这样调整不会寄吗?如果寄了,我们肯定会调整到还剩一个有色点,这时候有 \(0\) 条异色边,和上面的结论相矛盾,所以这样调整一定正确
那么我们现在的目标就是找到一种方案,使得异色边的数量至少为 \(\frac{1}{2}M\)
考虑随机化,我们给每个点随一个颜色,那么此时期望有 \(\frac{1}{2}M\) 条异色边,为啥呢,考虑一个一个加点的过程,这时候当前点是蓝或者红的两种情况中,边的情况正好相反,所以我们可以认为每条边都是独立染色的,记有 \(m\) 条边的期望为 \(f_m\),那么有 \(f_{m}=f_{m-1}+\frac{1}{2}\),考虑 \(E(X^2)\),有 \(g_{m}=\frac{1}{2}g_{m-1}+\frac{1}{2}(g_{m-1}+2f_{m-1}+1)=g_{m-1}+\frac{m}{2}=\frac{m(m+1)}{4}\),那么有 \(\sigma^2=DX=E(X^2)-E(X)^2=\frac{m}{4}\),如果我们最后至少会操作 \(k\) 轮,则有
如果直接取 \(k=c\sqrt m\),概率就是 \(\frac{1}{4c^2}\),那可以说 \(k\) 大概率是 \(\mathcal{O}(\sqrt m)\) 级别的(?总感觉这样说不太舒服啊)
但是直接积出来是一个 \(\mathcal{O}(1)\) 的东西,我其实没懂
#12302. Unfair Card Deck
考虑求出任意的 \(\frac{a_iX_i}{a_jX_j}\),我们可以把这两种牌拉出来,其他的牌显然是不影响这两个牌的,所以可以统计第一次出现这两种中的一个的花色的频率,然后就能算这个比值了
但是在比值很悬殊的情况下这个算的不准,于是考虑先给 \(a_iX_i\) 排序,可以每次找到第一次出现的次数最多的卡牌,把这个看作 \(a_iX_i\) 最大的,然后把这个东西删掉递归子问题就行了
复杂度 \(\mathcal{O}(nm)\)
#7412. Counting Cactus
记 \(f_{i,S}\) 为根为 \(i\) 的方案
记 \(g_{i,S}\) 为根为 \(i\),根上只接了一个环的方案
记 \(h_{i,j,S}\) 为环的起点为 \(i\),终点为 \(j\) 的方案
有转移:
- \(f_{i,S}\times g_{i,T}\rightarrow f_{i,S\cup T}\),其中 \(S\cap T=\emptyset\) 且 \(\text{lowbit}(S\cup T)\in S\)
- \(h_{i,j,S}\rightarrow g_{i,S},f_{i,S/\{j\}}\rightarrow g_{i,S},g_{i,S}\times\frac{1}{2}\rightarrow g_{i,S}\),其中 \(\exists (i,j)\in E\)
- \(f_{j,S/\{j\}}\times h_{i,k,T}\rightarrow h_{i,j,S\cup T}\),其中 \(S\cap T=\emptyset\) 且 \(\exists(k,j)\in E\)
复杂度 \(\mathcal{O}(n^33^n)\)
#6104. Building Bombing
你转置牛魔呢
前面的不用管,后面的考虑一个 \(dp_{k,i}\) 表示 \(i\) 是第 \(k\) 个前缀 \(\max\) 的最小代价,直接线段树优化转移即可,复杂度线性对数
10.15
#1844. Cactus
考虑一个环怎么做,此时这个环上所有点的度数都是偶数,考虑执行一次 \(2\) 操作再删点,如果环长 \(n\) 为偶数,则我们可以构造出删掉 \(2,4,6,\cdots,n,n+3,n+5,n+7,\cdots,2n-1,n+1\),如果 \(n\) 是奇数,我们可以构造 \(2,4,6,\cdots ,n-1,n+3,n+5,n+7,\cdots,2n,n,n+2,n+1\)
发现这样可以把边删完,而且最后会删掉 \((1,n+1)\),于是考虑对于原仙人掌,找到一个环,其仅有一个点和其他环相连,记这个交点为 \(u\),则可以执行上面的操作使得这个环只剩下 \((u,u+n)\) 这条边,如果这条边可以直接删了,我们就能递归子问题,但是如果 \(u\) 在原图上的度数为奇数,直接爆了,所以我们可以在最开始进行 \(1\) 操作删掉度数为奇数的边,如果我们能够证明,每次删掉一个环之后仍然满足所有点度数为偶数,那就做完了
接下来证明这个结论,给出引理:一个仙人掌上所有点都是偶数 \(\Leftrightarrow\) 这个仙人掌上没有割边
证明:
不存在割边 \(\Rightarrow\) 所有点度数都是偶数
- 此时所有点都在若干个环上,而一个环有进有出,所以所有点度数都是偶数
所有点度数都是偶数 \(\Rightarrow\) 不存在割边 - 考虑证明其逆否命题,即存在一条割边 \(\Rightarrow\) 存在一个点度数为奇数,考虑数学归纳法,缩边双,则每一个边双内每个点度数都是偶数,我们考虑缩出来的树的一个叶子,其割边连到叶子的那个点肯定度数为奇
所以结论得证,那直接做就行了,复杂度线性
#10092. Interactive Primality
如果问出了一个质数,他有什么影响,可以发现此时对于任意的 \(p<x+y\),都有 \(p\not\mid x+y\),也就是 \(x\not\equiv -y\pmod p\)
所以可以考虑一些小的质数 \(p_1,p_2,\cdots,p_k\),如果我们确定了 \(x \bmod p_i\) 的值,跟据中国剩余定理,只要 \(x\in [1,\prod p_i]\),我们就可以解出 \(x\) 的唯一的值,于是可以取 \(p_1=2,p_2=3,\cdots,p_k=53\),满足其乘积 \(>10^{18}\),我们问出一个质数,就能对于所有的 \(p_i\),排除一个 \(x \bmod p_i\) 的可能,那么只需要排除 \(p_i-1\) 轮就能确定 \(x\bmod p_i\) 的值
先随便问一问,问出来一个 \(x+y\) 是质数,然后再随机问就太唐了,如果我们已经排除了一些空位,那么后面肯定在没有排除的位置中随机是更优的,那我们要问 \(p_k-1\) 次质数就能确定 \(x\) 的值了
每次问出来质数的概率是多少,首先所有没问出来 \(\equiv -x\pmod p\) 的概率是 \(\prod_{p_j>i} \frac{p_j-i}{p_j-i+1}\),但是这个并没有考虑 \(>p_k\) 的质数的影响,所以我们还要乘上其是质数的概率,为 \(\frac{1}{\ln n}\prod _{j}\frac{p_j}{p_j-1}\),那大概 \(860\) 轮就能做完了,\(10\) 组不超过 \(8750\)
#10094. Slot Machine
我会 \(n^3\)!记 \(f_{l,r,v}\) 为机器里的数在 \([l,r]\) 中,显示的数为 \(v\) 的最小代价,则有两种转移,\(f_{l,r,v}\rightarrow f_{l,r,v'}\) 以及 \(\max(f_{l,v-1,v},f_{v+1,r,v})\rightarrow f_{l,r,v}\),其中 \(s_v=1\),这个状态太唐了,我们发现转移时要么满足 \(v=l+1\) 要么满足 \(v=r-1\),所以第三维可以直接记 \(0/1\),仍然难以维护,考虑有没有单调性
引理:\(\forall l<r\),有 \(f_{l,r,0}\ge f_{l,r-1,0}\) 且 \(f_{l,r,1}\ge f_{l+1,r,1}\)
证明考虑归纳,考虑证明 \(f_{l,r,0}\) 的情况,另一种情况对称,对于只有一个 \(x\in[l,r]\) 满足 \(s_{x}=1\),则结论显然成立,否则考虑其最小的转移点 \(v\),有 \(f_{l,r,0}=\max(f_{l,v-1,1},f_{v+1,r,0})+c(l-1,v)\),其中 \(c(x,y)\) 是 \(x\) 和 \(y\) 不同的数位个数,此时转移到 \(r-1\) 应该不小于 \(\max(f_{l,v-1,1},f_{v+1,r-1,0})+c(l-1,v)\),而由归纳假设有 \(f_{v+1,r-1,0}\le f_{v+1,r,0}\),所以有 \(f_{l,r-1,0}\le f_{l,r,0}\)
引理:\(f_{l,r,t}\le k\left\lceil\log_2(r-l+1)\right\rceil\)
考虑在 \(\frac{l+r}{2}\) 处转移,每次转移最多加 \(k\),这样最多 \(\log\) 个 \(k\)
于是考虑记状态 \(R_{l,v}\) 表示最大的 \(r\) 满足 \(f_{l,r,0}\le v\),记 \(L_{r,v}\) 表示最小的 \(l\) 满足 \(f_{l,r,1}\le v\),从小到大扫 \(v\),考虑 \(f_{l,r,0}\le v\),需要存在 \(x\in[l,r]\),满足 \(\max(f_{l,x-1,1}+f_{x+1,r,0})+c(l-1,x)\le v\),也就是满足 \(l\ge L_{x-1,v-c(l-1,x)},r\le R_{x+1,v-c(l-1,x)}\),所以对于 \(c(l-1,x)\) 相等的 \(l\),\(x\) 可以转移到其一段前缀,所以考虑枚举 \(c(l-1,x)\) 的具体情况,我们钦定一些位置不变,而另一些位置任选,这样能够转移到的数我们可以用一个十一进制数来表示,某一位上是 \(10\) 表示这一位可以随便填,由于转移到的是前缀,所以做一个后缀 \(\min\) 就行了,两种转移是类似的
状态数 \(\mathcal{O}(10^kk\log k)\),转移复杂度 \(\mathcal{O}(2^{k})\),总复杂度 \(\mathcal{O}(20^kk\log k)\)
#4241. Angle Beats 2.0
考察每一个 \(L\),发现其相当于上下选一个左右选一个,连边,那不同连通块的贡献是独立的
考察一个连通块,如果其边数大于点数,爆了,如果其边数等于点数,则基环树的环上有两种方案定向,贡献为 \(2\),如果是树可以随便定根,贡献为连通块大小
复杂度线性
#4243. Good Coloring
!?强强?!
考虑给每个点一个权值 \(v\) 为其邻居颜色的 \(\text{mex}\),如果 \(v\) 小于其当前颜色就把当前颜色替换掉,那么一直这样做下去,每个点的邻居中肯定有一个点的颜色为他的颜色减一
那么我们给所有的点按原颜色排序,做一遍上述过程就行了,复杂度线性
#962. Thanks to MikeMirzayanov
把操作看成给整个序列翻转,再把若干个连续段翻转,那整个序列翻转的操作无关紧要,我们只需要关注每次翻转一个段
考虑分治,尝试按 \(\le \frac{n}{2}\) 和 \(>\frac{n}{2}\) 分类,那现在就是给 `01 排序
考虑把每一段相同的合并起来,那可以看成 01010101010101...,如果第一段是 1,就给第一段前面加上 0,每次把第 \(2i\) 和第 \(2i+1\) 段合起来翻转一下,这样可以令段数减半,那么总操作次数是 \(\sum_{i=1}^{\log n}i\le 120\)
P5416 [CTSC2016] 时空旅行
也就出出这种傻逼题
拆到 dfn 序上,每个点贡献到 \(\mathcal{O}(1)\) 个 dfn 区间,所有直线按斜率在外面排序,所有询问也在外面排序,询问的时候扫一遍,复杂度 \(\mathcal{O}(n\log n)\)
P4577 [FJOI2018] 领导集团问题
线段树合并优化 dp
#10542. Protecting Kingdom
长剖,记 \(f_{u,i}\) 为 \(u\) 往下伸 \(i\) 个点的最小边权,更新答案的时候直接双指针,复杂度线性
P3201 [HNOI2009] 梦幻布丁
dsu
P5170 【模板】类欧几里德算法
学习了万欧做法
CF868G El Toll Caves
首先 \(n,k\) 可以同除 \(\gcd\),此时 \(n,k\) 互质,那么每放 \(n\) 次就有一个周期,设这个周期的答案为 \(S\),那么最后的期望 \(E\) 就满足 \(E=\frac{1}{2^k}(E+n)+S\)
现在考虑算 \(S\),记 \(f_i\) 为在第 \(i\) 个点被找到的期望,有
- \(f_{i}=f_{i-k}+1\),其中 \(i\ge k\)
- \(f_{i}=\frac{1}{2}+\frac{1}{2}(f_{i-k+n}+1)\),其中 \(0\le i<k\)
令 \(f_0\) 为主元,从 \(0\) 开始,每次加 \(k\) 膜 \(n\),如果 \(\ge n\) 了就会除以二,而加 \(k\) 会加一,这是一个万欧的形式,即 \(y=\frac{k}{n}x\) 这条线上的答案
用一个幺半群维护一下一次函数历史和,复杂度 \(\log n\)
10.16
模拟赛
成傻子了
T1
。
T2
。
T3
。
T4
。
#14426. Grid Problem
感受一下,第二个矩阵构造的有点刻晴了,所以大概能消成一个简单的形状,观察到左上和右下都是 \(2\),所以可以在 \((1,1)\) 和 \((2,2)\) 的位置各放一个 \(\begin{bmatrix}2&1\\1&2\end{bmatrix}\),然后你就能消成 \(\begin{bmatrix}0&4&2\\4&1&4\\2&4&0\end{bmatrix}\),再在 \((1,2)\) 和 \((2,1)\) 各放两个,可以消成只有中间是三的矩阵
所以我们可以给每个位置减三,那么多搞几个矩阵加起来把和搞到正无穷之后再减三就行了,发现加的矩阵行列加起来都是 \(3\) 的倍数,所以新的矩阵每行每列加起来也必须是 \(3\) 的倍数,即求
考虑单位根,反演,则原式等于
令 \(f(x)=\sum_{i=0}^{k}\omega_{3}^{ix}\),则原式等于
考虑枚举有多少个 \(r=0/1/2\),记为 \(d_0,d_1,d_2\),就变成了算
令 \(g(x)=\prod_{i=0}^{2}f(x+i)^{d_i}\),则
复杂度 \(\mathcal{O}(n^2\log n)\)
#14432. Cyclic Topsort
先把所有一开始就能用的点都删了,然后就是每次删一个点,看它能新拓扑出来多少点
发现一个点能拓扑出来的点的集合要么不交要么包含
于是可以每次随机一个点,然后把他能拓扑到的点都删了,以后不再以他能拓扑到的点为起点进行随机,这样复杂度是期望 \(\mathcal{O}(m\log n)\) 的,因为这相当于在一棵树上,每次选择一个点,然后花费 \(\mathcal{O}(siz)\) 的代价 ban 掉其子树,那一个点的贡献就是其到根链上选的点的个数,是 \(\mathcal{O}(\log n)\) 级别的,总复杂度就是 \(\mathcal{O}(m\log n)\)
#8085. Bulbasaur
最大流转最小割,记 \(f_{i,S,w}\) 为考虑了前 \(i\) 行,\(S\) 和源点相连,最小割 \(\le w\) 的方案
复杂度 \(\mathcal{O}(n2^kk^2)\)
#6545. Connect the Dots
这是一个平面图,考虑把所有的点排一圈,相邻的尽量连,因为其对内部无影响,考虑内部,最优的方案肯定是一个三角剖分,我们发现,如果至少有三种颜色,则一定存在一个三角剖分
考虑归纳证明,对于 \(n=3\) 显然成立,对于 \(n>3\),我们任意选取两个颜色不同的点,使得这两个点剖分出来的两个新的多边形中含有一个第三个颜色的点,如果能找到这样的点对,可以直接归纳得证,否则,不可能存在形如 \(121\) 的连续三个点,要不然选其中一个点为第二个点,在其他地方选择第三种颜色的点即可,那么这时候环肯定形如 \(11...1122...2233...33\),我们可以选择第一个 \(1\) 和所有的 \(2\) 和 \(3\) 连边,再把第一个 \(2\) 和前面的 \(1\) 都连边,也能构造出来一个合法的方案
所以现在就是只有两种颜色的情况,发现环形如 \(1212121...\) 的时候,我们只能构造出四角剖分,于是可以猜测答案和相邻的相同颜色对数有关,记这个数为 \(C\),手玩几个情况,发现答案大概是关于 \(n\) 和 \(C\) 都是线性的,所以可以猜测答案就是 \((n+C)/2-2\)
可以归纳证明:对于 \(n=3\) 显然成立,对于 \(n>3\),任意找到一个 \((1,2)\),把整张图分成两部分 \((n_1,C_1)\) 和 \((n_2,C_2)\),此时有 \(C_1+C_2=C,n_1+n_2=n+2\),那么两边的答案加起来就是 \(\frac{n_1+C_1}{2}-2+\frac{n_2+C_2}{2}-2+1=\frac{n+C}{2}-2\),结论得证,同时我们也可以说明,每次任意选择一个 \((1,2)\) 都是最大的
感觉这个答案的式子太奇怪了,为啥这样就对了
复杂度线性
P7457 [CERC2018] The Bridge on the River Kawaii
值域很小,枚举权值最大的边做 \(v\) 边线段树分治,复杂度 \(\mathcal{O}(vn\log^2n)\)
P3363 Cool loves jiaoyi
双指针,链加链 \(\max\),复杂度 \(\mathcal{O}(n\log^2n)\)
P4350 [CERC2015] Export Estimate
从大往小加边,维护出来二度点、零度点的数量
特殊情况是一个全是二度点的环,把这种环的数量再用并查集维护出来
复杂度 \(\mathcal{O}(n\alpha (n))\)
AT_agc049_d [AGC049D] Convex Sequence
\(A\) 是凸的,于是找到最低点,往左往右加一些 \(1,2,3,4,\cdots\),那么就相当于有无限个体积为 \(n,1,3,6,10,\cdots\) 的物品可以加进去,这样的物品有 \(\sqrt m\) 个,对于每一个最低点都做一遍背包直接爆了,但是这个背包可以撤销,所以复杂度就是 \(\mathcal{O}(m\sqrt m)\)
有一个细节是,最低点可以有很多个,所以我们要钦定最低点左边加了 \(1,2,3,4,\cdots\)
AT_abc180_f [ABC180F] Unbranched
瞎几把差分一下,写出来环和链的 EGF \(A\) 和 \(B\),答案就是 \(n![x^n]\frac{A^{n-m}}{(n-m)!}\exp(B)\)
复杂度 \(\mathcal{O}(n^2\log n)\)

浙公网安备 33010602011771号