2020-6~7杂题选做
大数定律\(:\) \(\lim\limits_{n->\infty} \sum\limits_{i=1}^{n} a_i \times (\frac{1}{n}) = E(a_i)\)
把边权 \(w\) 变成 \(e^{wx}\) 然后求一下在 \(\pmod{x^{k+1}}\) 意义下的行列式即可 \(.\)
因为 \(k\) 比较小 \(,\) 所以求逆和多项式乘法只能写\(O(k^2)\) \(,\) 直接套多项式板子会变慢 \(.\)
复杂度 \(O(n^3k^2).\)
循环卷积快速幂\(.\)
感觉和2020年联考A卷 d1t2 很像? 因为我当场做那个题的时候也是用的组合意义.
\(O(k^2(\log n+\log k))\)
线段树维护区间\(gcd,min\)以及\(cntmin\)即可\(.\)
如果写了\(O(n)-O(1)\) \(\gcd\) 可以做到一个 log.
建\(SAM/AC\)自动机之后数位\(dp.\)
我代码里写的是\(SAM,\)因为这样省空间\(.\)
\(O(nd^2*10)\)
每天一个爆零小技巧 : 计算 trans 不 return
\(wqs\)二分+斜率优化
\(O(n*T),T\)为\(check\)次数\(.\)
每天一个爆零小技巧 : 斜率优化不弹队首
差分一次相当于和 \((1-x)\) 卷积
前缀和一次相当于和 \((1-x)^{-1}\) 卷积
注意到
\((1-x)^k\) 的 \(i\) 次项系数是 \((-1)^{i}\binom{k}{i}\)
\((1-x)^{-k}\) 的 \(i\) 次项系数是 \(\binom{k+i-1}{i}\) \((\) 这个可以通过广义二项式定理证明 \()\)
然后直接\(O(n)\)递推出所有系数\(,\)然后\(NTT\)就解决了\(.\)
每天一个爆零小技巧 : 在 \(k\) 是 \(10^{2328}\)的时候读入优化不取模
先二分答案然后换元解方程\(,\)细节比较多\(.\)
考虑一个\(\large dp_{i,l,r}\)表示目前到第\(i\)行\(,\)这一行的区间为\([l,r]\)的方案数\(.\)
再记一个\(\large sum_{i,L}\)表示 \(\large \sum\limits_{l',r'\leq L} dp_{i,l,r}\)
然后推一推式子就可以\(O(nm)\)求出所有的\(sum_{i,L},\)这个问题就解决了\(.\)
CF698D Limak and Shooting Points
暴力枚举打的顺序然后\(bfs\) \(check.\)
\(O(n \times k!\times k)\)
在\(dfs\)树上如果有两个相交的环\(,\)那么必然有解\(:\)
\(1.\) \(e1_x->e1_y->x\)
\(2.\) \(e1_x->e2_x->e2_y->x\)
\(3.\) \(e1_x->x\)
首先可以想到通过欧拉定理计算\(.\)
不难发现只有前\(log\)次修改是有用的\(,\)那么直接维护就可以了\(.\)
实现的好可以做到\(O(nlog^2max(p,n))\)
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
\(dsu\) \(on\) \(tree\) 练习题\(.\)
大概就是把字母\(x\)的权值看成\(2^{x-'a'},\)然后\(check\)一条链合法相当于链上异或和为\(0\)或\(2^h,\) \(dsu\) 一下就好了 \(.\)
\(O(n\log n*22),\)需要\(O(2^{22})\)的空间
感觉这个套路已经做了一万次了吧..
线段树维护信息\(,\)每次删去 \(\lfloor \frac{100}{p} \rfloor +1\) 个不同的数 \(,\) 最后剩下的 \(k\) 种数中必然包含答案\(.\)
记 \(k = \lfloor \frac{100}{p} \rfloor +1,\) 复杂度为 \(O(nk^2logn)\)
线段树合并\(/\)启发式合并板子题\(.\)
交互题\(.\)
先求完最短路\(,\)然后\(O(n^2) dp.\)
计算几何题\(.\)
考虑求出凸包然后在凸包上\(O(n)\)扫\((\) 类似\(2-pointers,\) 同时维护面积大小 \(),\) 然后用前缀和快速计算答案 \(.\)
欧拉回路题\(.\)
突然发现自己以前写的欧拉回路复杂度是假的\(!\)
\(O(nlogm)\)
每天一个爆零小技巧 \(:\) 在交题之前一不小心 shift + delete + enter 删掉自己的代码
首先忽略边权\(,\)考虑求一组可行的方案\(.\)可以使用\(2-SAT\)实现\(,\)建图需要前后缀优化\(.\)
加上边权的限制就是加一个二分\(.\)
强制让一个东西不能选就是加一条 \((x,1)->(x,0)\) 的边\(.\)
\(O(mlogm),\)实现的时候注意节省空间\(.\)
我的代码是\(|V|\leq 7m,\) \(|E| \leq 17m\)
CF516D Drazil and Morning Exercise
不难发现权值分布组成了一棵以\(f_x\)最小的\(x\)为根的树\(,\)其中父亲的权值一定\(\leq\)儿子的权值\(.\)
那么直接\(two-pointers,\)然后用并查集维护当前的答案就可以做到 \(O(nα(n))\)处理一组询问 \(.\)
复杂度 \(O(nα(n)q).\)
考虑倒着做\(,\)从小到大更新概率\(,\)并维护不出现边的概率和出现边时的期望\(.\)
\(O(n^2)\),
\(2-SAT.\)
枚举类型为x
的场地的类型然后\(2-SAT\)即可\(.\)
\(O(2^d(n+m))\)
贪心的考虑\(n1,n2\)的取值然后二分图染色即可\(.\)
\(O(n+m)\)
对\(M\)操作带来的合并建树\(,\)并用\(dfs\)序建线段树\(,\)可以求出一个数最近的\(Z\)操作的时间\(,\)这样我们把询问差分成两个前缀询问\(,\)用启发式合并维护一下就可以了\(.\)
\(O(n\log n),\)注意这题的空间限制\(,\)尽量不要用空间带\(log\)的做法\(.\)
矩乘题\(.\)
\(2-SAT+\)贪心\(.\)
\(O(nm).\)
首先非叶节点之间的边可以直接集合之间两两取\(and\)得到\(.\)
然后特判掉非叶节点个数\(\leq 2\)的情况\(,\)叶节点\(>3\)个的时候可以通过比较\(bitset\)得到叶节点的父亲\(.\)
\(\large O(\frac{n^3}{w}),\)其中\(w=64.\)
不难发现题目中的条件等价于所有联通块大小都是偶数\(.\)
可以用\(lct\)维护最小生成树\(,\)也可以分治\(.\)
\(O((n+m)\log(n+m))\) 或 \(O(n\log n \log m),\) 但在实际效果上分治比 \(lct\) 快 \(.\)
CF585E Present for Vitalik the Philatelist
考虑求出\(f_d =\) \([\gcd \{ S \} = d\)的 \(\{ S \}\) 的数量 \(],\)
和 $g_d = $ $ [ $ $ x \perp d $ 的 \(x\) 的数量 $ ] ,$
那么答案为 \(ans =\sum\limits_{i>2}^{10^7} f_ig_i\)
可以反演之后 \(Dirichlet\) 前缀和 , \(O(w\log \log w)\)
线段树分治 \(/\) \(\ LCT.\)
线段树分治\(,\)当一个操作生效之后把它\(insert\)到线段树上即可\(.\)
\(O(n\log^2n+nk)\)
需要注意的是 \(,\) 理论上是可以用 \(lct\) 维护这个东西的 \(,\) 但是如果使用 \(lct\) 来维护会爆空间 \(.\)
首先有一个\(O(mt^2)\)的暴力\(,\)然后容易发现转移是一个卷积的形式\(,\)并且转移图是一个\(DAG.\)
那么就可以分治\(FFT\)解决这个问题了 \(.\)
\(O(mt\log ^2t).\)
一道好题\(.\)
我们从信息熵的角度去考虑问题\(,\)即在这样一个问题中会有多少种熊醉酒情况\((\) 在哪一天喝醉以及是否喝醉 \(),\) 这个数值 \(Ans=\sum \binom{n}{i}\times x^i\) \((x\)表示天数\(),\)不难发现这个数值是答案的上界\(.\)
并且我们可以构造出对应的方案使得在有\(Ans\)个桶的时候可以正确判断出哪一桶是酒 \(,\) 所以这个上界也是可以达到的 \(.\)
那么我们计算这个式子就可以算出答案了\(.\)
\(O(\frac{p^3}{\ln p}+pq).\)
把询问差分\(,\)建出\(AC\)自动机\(,\)用树状数组维护对答案的贡献\(.\)
也可以在广义\(SAM\)上线段树合并\(,\)但是很容易\(MLE,\)需要注意空间常数\(.\)
可以直接\(O(n^2)\)贪心\(,\)也可以用堆优化到\(O(n\log n).\)
CF611H New Year and Forgotten Tree
枚举\(prufer\)序列得到关键点的连接方式\(,\)然后跑网络流\(check.\)
记\(m=\lfloor \log_{10}n \rfloor \leq 6,\)复杂度为
\(O(m^{m-2}\times Dinic(m^2,m^2)).\)
随便做\(.\)
对于每组询问把编号为奇数的点之间通过一些\((i,i+1)\)的边连接起来\(,\)然后做\(mst\)即可\(.\)
\(O(n^2).\)
考虑把布尔表达式当成点\(,\)在有下标绝对值相同的\(x_i\)的表达式之间连一条边\(.\)
不难发现只会有一些链和环\(,\)分类讨论\(dp\)一下就好了\(.\)
\(O(n+m).\) 代码细节很多\(.\)
考虑最大化花费较小的那个元素\(.\)
建图\(,\)有源汇上下界最大流\(.\)
\(O(Dinic(n,n)),\)网络流图是个二分图\(,\)所以是\(O(n\sqrt n)?\)
两维都要离散化\(,\)注意细节\(.\)
对每条边\((x,y)\)分别考虑\(.\)
\(1.\) \(f\leq c:\)
\((x,y,c-f,1)\) \((y,x,f,1)\) \((x,y,+\infty,2)\)
\(2.\) \(f>c:\)
先加上\(f-c\)的花费再加边\(:\)
\((y,x,f-c,0)\) \((y,x,c,1)\) \((x,y,+\infty,2)\)
然后考虑本来的流量\(f:\)加入上下界\(,\)连上上界\(=\)下界\(=f,\)费用为\(0\)的边
然后跑上下界最小费用流即可\(.\)
\(O(Zkw(n,n+m))\)
建出\(SA,\)然后考虑二分答案后用主席树\(check.\)
时间\(O(n\log^2 n),\)空间\(O(n\log n)\)
如果离线可以做到时间\(O((n+m)\log n),\)空间\(O(n+m)\)
P3987 我永远喜欢珂朵莉~
P5610 [Ynoi2013]大学
用并查集维护可能要\(/x\)的数字的下标\(,\)每次修改先二分一下然后在并查集上往后跳\(.\)
每个\(a_i\)的变化次数为\(O(\log a_i)\)次\(.\)
每次\(a_i\)的值发生变化的时候在\(BIT\)上修改即可\(.\)
\(O(nd\alpha(n)+n\log n\log a_i).\)
CF679E Bear and Bad Powers of 42
势能线段树\(.\)
考虑维护每个数字到下一个\(42\)的次幂的距离\(,\)修改的时候如果这个距离被减成了负数就递归下去\(,\)就好了\(.\)
\(O(nlogn\times T),\)其中\(T\)值域内的\(42\)的次幂的个数\(,\)为\(11.\)
经典贪心题\(.\)
对每个点记一下他\(+1\)和\(-1\)对答案造成的影响\(,\)每次修改之后计算一下彩票位置的变化即可\(.\)
\(O(n\log n).\)
题目相当于找若干个子序列形如LRLRLR...
或者RLRLRL...
然后把它们拼起来\(.\)
我们把分出的子序列分为四类\(:\) LR,RL,LL,RR.
如果有形如LL
或者RR
必然有解\(.\)
否则如果只有一种RL/LR
可以直接输出\(,\)在同时有RL,LR
的情况下可以用一对RL
LR
拼出一个 LL
和一个 RR
\(O(n).\)
在每个点\(x\)上记除了\(f_x\)之外\(a_x\)的权值\(,\)并把这个扔到\(f[i]\)的\(multiset\)里\(,\)然后模拟就可以了\(.\)
\(O((n+q)\log n)\)
虽然说起来很简单但是细节特别多\(.\)
不难发现题目要求等价于给黑白染色后的图连出黑色生成树\(/\)白色生成树\(.\)
\(dfs\)缩一下点\(,\)跑\(Matrix-Tree\)即可\(.\)
\(O(nm\alpha+k^3).\)
一种做法是\(dp,\)用堆维护对答案的贡献\(.\)
另一种做法比较有趣\(.\)线性规划的对偶
我们需要知道这个式子 \(:\)
\(max\{ c^Tx|Ax\leq b \}\) \(=\) \(min\{ b^Ty|A^Ty \geq c\}\)
这里\(b,c,x,y\)都是列向量\(,\) \(c,x\)长度相同 \(b,y\)长度相同\(.\)
然后我们把这个式子套进题目\(.\)
题目可以相当于我们选一些\(0/1\)放到\(y\)里使得\(A^Ty\geq\)一个全\(1\)列向量\(c.\)
对偶过去就变成\(:\)给每条边设置一个权值使得每条链上的权值和\(\leq\)这条链的权值\(.\)
然后用可并堆维护贪心即可\(.\) \(O(n\log n).\)
树剖\(,\)按\(dfs\)序建\(SA,\)然后每次询问查\(O(\log)\)次\(lcp\)即可\(.\)
\(O((n+m)\log n)\)
先\(O(n^3)dp\)出答案的前\(7n+10\)项\(,\)然后跑\(BM\)即可\(.\)
CF568E Longest Increasing Subsequence
首先重复填数对答案没有影响\(,\)所以先忽略这个条件\(.\)
记\(f_i\)为 以i为结尾的LIS的长度\(,\) \(g_i\) 为以i为结尾的LIS的上一位\(.\)
记\(Min_x\)为 当前长度为\(x\)的LIS的最小的结尾 \(pos_x\)当前长度为\(x\)的LIS的最小的结尾的位置\(.\)
这些都可以简单\(dp\)出来\(.\)
然后我们考虑怎么构造方案\(.\)
不是\(-1\)的位置\(x\)我们可以直接跳到\(g_x\) \(.\)
如果\(x\)所在的位置是\(-1,\)那么我们优先找\(a_y ≠ -1 ,\)且\(a_y<a_x,f_y=\)当前的长度\(-1,\)那么我们就跳到位置\(y.\)
否则\(,\)我们就只能跳到最近的一个\(-1\)的位置\(.\)
\(O(n\log n+m\log m+(n+m)k)\)
考虑对每条重链\(/\)轻边分别做\(,\)最后答案取个\(min\)就可以了\(.\)
求线段最早相交的时间可以用\(set\)维护\(.\)
\(O(n\log n\log m).\)
AT3858 [AGC020D] Min Max Repetition
简单构造\(.\)
不难证明最小的次数\(k=max(\lceil \frac{a}{b+1} \rceil,\lceil \frac{b}{a+1} \rceil),\)然后数列一定是形如\(AAAABAAAABAAAAB...\)然后\(BBBABBBBABBBBA...\)的形态\(,\)二分一下分隔点然后对每个位置\(O(1)\)判断即可\(.\)
\(O(T(\log a+(d-c)))\)
AT3859 [AGC020E] Encoding Subsets
直接记忆化搜索即可\(.\)可以证明\(,\)状态总数不会超过\(O(2^{\frac{n}{8}}+n^3).\)
复杂度是\(O(n^2S)\)的\(,\)其中\(S\)表示状态数\(.\)
AT3860 [AGC020F] Arcs on a Circle
首先破环为链\(,\)令最长的\(l_i\)所在的位置为\(0.\)
然后对其它的\(l_i,\)枚举它们位置的小数部分的大小关系\(,\)然后再\(dp\)即可\(.\)
\(O((n-1)!\times 2^{n-1} \times (c\times n)^2).\)
首先题意可以转化为\(:\)每个玩具有两个属性值\(x_i,y_i,\)弱机器人可以拿掉\(x_i<A_i\)的玩具\(,\)小机器人可以拿掉\(y_i<B_i\)的玩具\(.\)
不难想到可以二分答案\(.\)
考虑如何\(check\)是否能在\(mid\)分钟的时间内拿走所有的玩具\(.\)
首先如果只有一维\(,\)显然可以直接对\(x_i\)和\(A_i\)排序然后丢掉多余的机器人\(,\)直接比大小即可\(.\)
那么多加了一维就是对\(x\)先贪心\(,\)每次尽量拿走\(y\)更大的数字即可\(.\)
这个贪心很容易用一个堆来实现\(.\)
\(O(n\log ans \log n).\)
首先选\(y\)条链相当于找\(2y\)个叶子节点\(,\)把它们都联通的边集的边权和\(.\)
不难发现必然会选到直径的两个端点\(,\)所以把两个直径拿出来分别建树\(.\)
如果没有强制包含\(x\)的限制\(,\)那么就可以直接长剖贪心\(.\)
但是\(x\)不一定会在选\(2y-1\)个叶子节点的方案当中\(,\)
那么我们考虑这两种情况\(:\)
在\(2y-2\)的方案上加一条包含\(x\)的长链\(.\)
在\(2y-1\)的方案上换掉一条长链\(,\)并加上一条包含\(x\)的长链\(.\)
这个过程可以用树上倍增实现\(.\)
\(O((n+q)\log n).\)
不难发现答案\(\leq 7.\)
枚举答案\(,\)容斥\(check\)就可以了\(.\)
\(O(n\log n\times ans).\)
只保留\(a_i\leq 24\)的数值\(,\)然后\(O(2^{24})\)暴力即可\(.\)
二项式反演题\(.\)
$f_n = $ 钦定 \(n\) 种颜色满足条件的方案数
$g_n = $ 恰好 \(n\) 种颜色满足条件的方案数
我们要求的是\(g_{0..n},\)但是\(g\)不容易直接求\(,\)那么就先求出\(f_{0..n}\)然后二项式反演即可得到\(g.\)
反演的部分可以用\(NTT\)实现\(.\)
\(O(T\log T),\)其中\(T=\min(m,\lfloor\frac{n}{S} \rfloor).\)
状压\(dp.\)
把问题转换为差分序列上的问题\(,\)然后就可以状压\(dp\)了\(.\)
转移值可以通过\(bfs\)提前求出\(.\)
反演题\(.\)
记\(p_i\)为权值为\(i\)的点是什么\(.\)
\(\large \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}φ(a_ia_j)dis(i,j)\)
$\large = \sum\limits_{i=1}{n}\sum\limits_{j=1}φ(ij)dis(p_i,p_j) $
\(\large = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\frac {\large φ(i)φ(j)\gcd(i,j)}{\large φ(\gcd(i,j))} dis(p_i,p_j)\)
\(\large = \sum\limits_{d=1}^{n} \frac{\large d}{\large φ(d)} \sum\limits_{i=1}^{\large \lfloor \frac{n}{d} \rfloor}\sum\limits_{j=1}^{\large \lfloor \frac{n}{d} \rfloor} φ(id)φ(jd)dis(p_{id},p_{jd})[i\perp j]\)
\(\large = \sum\limits_{d=1}^{n} \frac{\large d}{\large φ(d)} \sum\limits_{p=1}^{\large \lfloor \frac{n}{d} \rfloor} \mu(p)\sum\limits_{i=1}^{\large \lfloor \frac{n}{dp} \rfloor}\sum\limits_{j=1}^{\large \lfloor \frac{n}{dp} \rfloor} φ(idp)φ(jdp)dis(p_{idp},p_{jdp})\)
令\(T=dp,\)把\(T\)提出来\(:\)
\(\large \sum\limits_{T=1}^{n} (\large \sum\limits_{d|n}\frac{\large d}{\large φ(d)} \mu(\large \frac{\large T}{\large d}))\sum\limits_{i=1}^{\large \lfloor \frac{n}{T} \rfloor}\sum\limits_{j=1}^{\large \lfloor \frac{n}{T} \rfloor} φ(iT)φ(jT)dis(p_{iT},p_{jT})\)
枚举\(T,\)然后建虚树\(,\)在虚树上求答案即可\(.\)
\(O(n\log n).\)
SP22549 DIVFACT4 - Divisors of factorial (extreme)
对于每组询问\(,\)小于\(\sqrt n\)的部分暴力\(,\)大于\(\sqrt n\)的部分可以数论分块\(.\)
问题变为若干个询问区间质数个数的问题\(,\)且询问端点\((\) 除了其中最多一个 \()\) 都是形如\(\lfloor \frac{n}{i} \rfloor\) 的数\(,\)因此\(Min25\)筛即可解决\(.\)
\(O(T(\large \sqrt{n}+\frac{n^{\frac{3}{4}}}{\log n}))\)
注意模数很大\(,\)要使用快速乘\(.\)
\(O(2^4)\)枚举每个点的移动方向\(.\)
然后分五类讨论即可\((\)
在值域上建线段树\(,\)线段树上套平衡树维护每个点所包含值域区间的下标集合\(.\)
所有操作的复杂度都是\(O(\log^2).\)
考虑\(Brunside\)然后计数\(.\)
令\(F(n,m)\)为不考虑环\(,\)有\(n\)个黑的\(,\) \(m\)个白的方案数\(.\)
令\(G(n,m)\)为考虑环的方案数\(.\)
\(F(n,m)\)可以枚举连续\(k+1\)个黑色的总数并容斥\(,O(\lfloor \large \frac{n}{k+1} \rfloor)\) 计算\(.\)
\(G(n,m)=\sum\limits_{i=0}^k (i+1)F(n-i,m-1).\)
所以\(G(n,m)\)可以\(O(n)\)计算\(.\)
然后枚举\(\gcd (n,m)\)的约数并计数即可\(.\)
复杂度\(O(n\sqrt n)\)
考虑一条路径存在的条件\(:\)在已经把\(A\)边形成的联通块合并起来的时候\(,\)当且仅当路径中的所有\(B\)边连出了一个环时不合法\(,\)否则必定合法\(.\)
那么很容易有一个\(O((n+m)2^n)\)的状压\(DP.\)
发现大小\(\leq3\)的联通块是不用记录进状态里的\(,\)只需要临时判一下就好\(.\)
这样联通块个数就变成\(\lfloor \frac{n}{4} \rfloor\) 了\(.\)
\(O((n+m)2^{\lfloor \frac{n}{4} \rfloor}.)\)
考虑建出麻将自动机\(,\)用\(dp_{0/1,0/1/2,0/1/2}\)和\(cnt\)来表示胡牌状态\(.\)
搜索一下可以发现自动机里的点数只有\(2092\)种\(.\)
然后\(O(n^2\times 2092)\) \(DP\)一下即可\(.\)
区间赋值/区间加/查询区间最大值/查询区间历史最大值\(.\)
维护加标记,区间历史最大加标记,赋值标记,历史最大赋值标记即可\(.\)
设序列长度为\(n,\)操作次数为\(m,\)则复杂度为\(O((n+m)\log n).\)