2019省选题泛做

HNOI2019

[HNOI2019]鱼

枚举\(C\)点,维护以\(C\)为端点的射线,鱼尾巴部分很好维护,考虑鱼头。
先枚举\(B,D\)点,设\(B,D\)点的中点为\(K\)
那么\(A,B,C,D\)合法需要满足:\(K\)\(AC\)上,\(slope_{BD}*slope_{AC}=-1\)
求出\(BC\)的方向向量后,第二个限制很好满足,考虑第一个限制。
首先\(K\)要在直线\(AC\)上,我们知道:与一个向量点积相等的点在一条垂直其直线上。
那么得到向量\(AC\)的垂直向量(即向量\(BD\)),设为\(P_1P_2\),则\(P_1K\)\(P_1P_2\)的点积为定值。
其次\(K\)要在线段\(AC\)上,我们知道:与一个向量等距的点在一条平行于其的直线上。
所以依旧使用向量\(P_1P_2\),则\(P_1K\)\(P_1P_2\)的叉积的合法范围为一个区间,预处理后二分解决。

[HNOI2019]JOJO

\(cx\)表示字符\(c\)连续出现\(x\)次,比如\(aaabbaaaabbaaacc=a3\ b2\ a4\ b2\ a3\ c2\)
先考虑\(Sub3\)(不需要可持久化),考虑在当前串后面再接一段为\(Border\)的条件,显然只有第一段和最后一段可以不全。
按上述规则对用\(cx\)表示后的串求\(kmp\),即上面的串的\(next\)数组为:\(0\ 0 \ 0\ 2\ 3\ 0\)
查询就是暴力跳\(next\),使得新加字符的长度不断递增,贡献形如等差数列。
然后考虑可持久化,由于可以离线所以可持久化是假的,我们可以构建树形结构然后\(dfs\)解决。
暴跳\(next\)此时复杂度也假了,可以对每个字符构建\(kmp\)自动机,在\(dfs\)对其进行相应的维护即可。

[HNOI2019]多边形

仔细观察可以发现整个多边形其实是一个二叉树结构。
暴力\(dp\)初始解,发现变换只会对二叉树产生微小改变,直接把原贡献除掉再乘新的贡献出解。

[HNOI2019]校园旅行

对于\(30\%\),设\(f_{x,y}\)表示\(x,y\)之间是否合法,暴力\(bfs\)转移(写\(dfs\)的都退役了)。
对于\(70\%\),改良上面算法,让两边分开转移,即设\(g_{l,r,0/1}\)表示\(l,r\)之间,轮到谁转移。
考虑对于全黑边、全白边、黑白交替边各保留一棵生成树,然后再做上述算法。
这样显然有问题,考虑问题在哪里,然后修锅。
考虑两端分别走到了黑点,我们要使得两边的黑段长度相同,由于可以来回走,所以只需要使得他们奇偶性相同。
但是二分图上无论怎么走奇偶性都不会改变,所以若原图不为一个二分图,那么就在生成树上额外加一个自环。

[HNOI2019]白兔之舞

\(T\)为转移矩阵,那么\(Ans_t=\sum_{i=0}^{L}\binom{L}{i}T^i[k|i-t]\)
单位根反演:\(Ans_t=\frac{1}{k}\sum_{i=0}^L \binom{L}{i}T^i\sum_{j=0}^{k-1}w_k^{j(i-t)}=\frac{1}{k}\sum_{j=0}^{k-1}w_{k}^{-jt}(1+T^iw_{k}^j)^L\)
\(f_j=(1+T^iw_{k}^j)^L\),则\(Ans_t=\frac{1}{k}\sum_{j=0}^{k-1}f_j(w_k^{-t})^j\)
显然是个逆\(dft\)形式,所以现在我们只需要支持一个任意长度\(dft\)了。
由于\(w_k^{ij}=w_k^{{\binom{i+j}{2}}-{\binom{i}{2}}-{\binom{j}{2}}}\)
\(\delta=w_k^{-1}\),则\(Ans_t=\frac{1}{k}\sum_{j=0}^{k-1}f_j\delta^{\binom{j+t}{2}-\binom{j}{2}-\binom{t}{2}}=\frac{1}{k}\delta^{-\binom{t}{2}}\sum_{j=0}^{k-1}(f_j\delta^{-\binom{j}{2}})\delta^{\binom{j+t}{2}}\)
来发卷积即可。垃圾出题人卡常数,注意矩乘时把\(27\)次取模变为\(9\)次取模。

[HNOI2019]序列

推推式子可以发现,对于把一段划分为一个值,这个值取平均数最优。
然后不难发现:最终方案中划分段越多,答案越优。
然后有\(O(mn)\)的贪心做法:从前往后维护每一段中位数,当中位数非递增时则将尾部两段合并。
考虑支持快速修改,核心思想依旧是模拟上述过程。
首先正着做一遍、倒着做一遍求出前缀与后缀的答案,设为\(pre,suf\)
那么假设修改\(A_p\),我们的目标就是找出最终方案中\(p\)所在段\([l,r]\),答案就是\(pre_{l-1}+ans_{l,r}+suf_{r+1}\)
首先考虑固定一个右端点\(r\),如何求左端点的落点\(l\)
设当前段平均数为\(m_1\),新来的左边段的平均数为\(m_2\)
\(m_2>m_1\),则两段需合并在一起,\(m_1'\)与更前方平均数的差距缩小,否则就不需要并在一起。
故这个左端点\(l\)可以直接二分。
然后考虑如何求出正确的右端点,同样二分,\(check\)当前段与之后一段的平均数大小关系即可。

ZJOI2019

[ZJOI2019]麻将

麻将形态的\(DP\)现在已经麻木了。先考虑给一副牌判断能不能胡。
\(f_{i,a,b,0/1}\)表示前\(i\)各花色,\(E_{i-1,i,i+1}\)\(a\)个顺子,\(E_{i,i+1,i+2}\)\(b\)个顺子,是否有对子 的 最大面数。
转移暴力就完事了。
爆搜一下发现\(f\)状态数很少,所以\(dp\)\(dp\)
\(g_{i,j,F}\)表示前\(i\)种花色拿了\(j\)张牌,\(f\)走到状态\(F\)的不胡方案数,转移大暴力。
答案\(Ans=\frac{\sum_{j=0}^{4n-13}g_{j}j!(4n-13-j)!}{(4n-13)!}\),注意\(f\)转移时记得把选牌方案的组合数算上。

[ZJOI2019]线段树

考虑一个操作\(1\)对所有线段树的影响,设\((f_i,g_i)\)分别表示\(i\)点有\(tag\)\(1\to i\)\(tag\)的概率。
那么设区间\([l,r]\)在线段树对应路径\(P\)
\(P\)上(不包括端点)、端点\(l,r\)\(l,r\)子树内(不包括\(l,r\))、路径\(P\)侧链、其它共五类点进行讨论即可。

[ZJOI2019]Minimax搜索

把答案做前缀和,求\(w(S)\leq k\)的方案数,最后再差分求解。
设初始状态下\(1\)号节点的权值为\(w\)
若我们要使得\(w'>w\),则只需要修改\(val<w\)的点。使得\(w'<w\)的方案同理。
我们只需要让上述两种方案的一种成立即可,所以不妨容斥,算两种方案都不成立的方案数。
以修改\(val<w\)的点的方案数为例。
\(f_u\)表示\(u\)\(< w\)的方案数,这里直接改设\(f_u\)为概率方便计算。
对于奇数层,\(f_u=\prod f_v\)。对于偶数层,\(f_v=1-\prod(1-f_v)\),总复杂度为\(O(n^2)\)
一个比较妙的转化:令\(g_u=[dep_u\ is\ odd]f_u + [dep_u\ is\ even](1-f_u)\)
则转移统一为:\(g_u=\prod_v (1-g_v)\)
注意到\(k\)每增加\(1\),至多只会有两个点的\(g\)发生变化,所以动态\(dp\)即可。
注意到:\(g_t=\prod_{i=1}^t (1-g_{p_i})=c_{p_1}\prod_{i=1}^t(1-g_{p_{i-1}})......\)
暴力展开后会发现:\(g_t=\prod_{i=1}^t(1-g_{p_i})=g_{[l,m]}+(-1)^{m-l+1}g_{[l,m]}g_{[m+1,t]}\),线段树直接维护。

[ZJOI2019]语言

考虑对每个点开一棵线段树,直接维护该点的可达点是哪些。
对于一次修改,设\(S\)表示修改的点集,那么我们就是要给\(S\)中的每一棵线段树加上\(S\)这个集合。
树上差分后线段树合并即可。
具体来说线段树中维护\(>0\)的值的个数,不难发现这个东西是支持线段树合并的。

[ZJOI2019]开关

考虑求出概率生成函数\(f(x)=\sum_{i=0}^{\infty} E(X=i)x^i\),那么答案就是\(F(1)'\)
对于要按奇数次的点\(i\),构造\(H_{i}(x)=\frac{e^{\frac{p_i}{P}}-e^{\frac{-p_i}{P}}}{2}\)
同理对于要按偶数次的点\(i\),构造\(H_{i}(x)=\frac{e^{\frac{p_i}{P}}+e^{\frac{-p_i}{P}}}{2}\)
那么\(H(x)=\prod_{i=1}^n H_i(x)\),但这不能保证第一次结束时就停止,所以令\(G(x)=\prod_{i=1}^n(\frac{e^{\frac{p_i}{P}}+e^{\frac{-p_i}{P}}}{2})\)
那么令\(F(x)\)\(f(x)\)的指数型生成函数,则\(F(x)G(x)=H(x)\),即\(F(x)=\frac{H(x)}{G(x)}\)
\(h(x)\)\(g(x)\)分别为\(H(x)\)\(G(x)\)的概率生成函数,则\(f(x)=\frac{h(x)}{g(x)}\),即\(f(1)'=\frac{h'(1)g(1)-h(1)g(1)'}{g(1)^2}\)
以求\(g(1),g(1)'\)为例,设\(G(x)=\sum_{i=-P}^P a_ie^{\frac{i}{P}x}\)
那么\(G(x)=\sum_{i=-P}^P a_i\sum_{j=0}^{\infty}\frac{({\frac{i}{P}}x)^j}{j!}\),故\(g(x)=\sum_{i=-P}^P\frac{a_i}{1-{\frac{i}{P}}x}\)
一个大问题在于,当\(i=P\)时,\(g(x)\)\(x=1\)处不收敛。但不难发现,\(g(x),h(x)\)同乘\(\prod_{i=-P}^P(1-{\frac{i}{P}}x)\)后答案不变,设为\(g_2(x),h_2(x)\)
那么\(g_2(x)=\sum_{i=-P}^P a_i\prod_{j=-P,j\neq i}^P (1-{\frac{j}{P}}x)\)
\(g_2(1)\)很好求,关键看\(g_2(1)'\)怎么求。
首先暴力展开后有\([\prod_{i=1}^n (1-c_ix)]'=\sum_{i=1}^n(-c_i)\prod_{j\neq i} (1-c_jx)\)
所以\(g_2(1)'=\sum_{i=-P}^P a_i\sum_{j=-P,j\neq i}^P (-\frac{j}{P}) \prod_{k\neq j,k\neq i} (1-\frac{k}{P}x)\),当\(x=1\)时,只有\(j=P\)\(i=P\)有意义,故\(g_2(1)'\)可快速求。

BJOI2019

[BJOI2019]奥术神杖

把答案取个对数,那么几何平均数就变成了算术平均数。
然后就是愉快的分数规划后\(AC\)自动机上\(dp\)

[BJOI2019]勘破神机

对于\(m=2\),就是\(Fib\)数列。对于\(m=3\),打表可得递推式:\(f_{2n}=4f_{2n-2}-f_{2n-4}\)
问题变为求\(\sum_{i=1}^n \binom{f(i)}{k}\)
做一些简单的变形:\(\sum_{i=1}^n \binom{f(i)}{k}=\sum_{i=1}^n \frac{P(f(i),k)}{k!}=\sum_{i=1}^n \frac{\sum_{j=0}^k S(k,j)(-1)^{k-j}f(i)^j}{k!}\)
交换求和顺序后,只用求\(\sum_{i=1}^n f(i)^t\)即可。
构造\(f(i)\)母函数,可以得到通向公式:\(f(n)=AC^n+BD^n\)
那么\(\sum_{i=1}^nf(i)^t=\sum_{i=1}^n (AC^i+BD^i)^t=\sum_{i=1}^n \sum_{j=0}^t \binom{t}{j}(AC^i)^j(BD^i)^{j-t}\),交换\(\sum\)后可得等比数列。
注意几个细节:\((1)\)\(3,5\)在给定模数下无二次剩余,故需要扩系。 \((2)\)特判等比数列\(q=1\)的情况。

[BJOI2019]删数

对于数\(k(k\leq n)\),若有\(c_k\)个,则称存在区间\([k-c_k+1,k]\)。最后\([1,n]\)未覆盖长度即为答案。
考虑增加了全局加减后如何维护上述答案。
可以通过平移区间\([1,n]\)来实现,由于只有\(k\leq n\)的限制且每次只移动\(1\)格,所以顺带维护即可。

[北京集训2019]图的难题

一张图\(<V,E>\)合法当且仅当它的任意导出子图\(<V',E'>\)满足\(|E'|\leq 2|V'|-2\)
那么非法即:\(|E'|-2|V'|>-2\)
左边是最大权闭合子图形式,上个网络流求一下\(max\)

[北京集训2019]生成树计数

设生成树权值和\(Val=\sum_{i=1}^n val_i\),那么\(Val^k=(\sum_{i=1}^n val_i)^k=k!\sum_{k=\sum_{i=1}^nc_i}\frac{val_i^{c_i}}{c_i!}\)
用变元矩阵树定理,每条边的权值变为多项式\(\sum_{j=0}^{k} \frac{val^k}{k!}\),那么答案就是\(k![x^k]\)
其中除法可以写\(O(k^2)\)的多项式求逆。

[北京集训2019]完美塔防

首先判掉炮台打炮台的不合法方向。
其次每个空地只会被两个不同方向进入的炮台打到,因为光路可逆,同方向进入的炮台会互打。
剩下的就是\(2-sat\)裸题了。

十二省联考2019

[十二省联考2019]字符串问题

限制倒过来看就是:把\(A,B\)串反过来,\(A_{i+1}\)存在一个后缀\(B\),满足\(B\)\(A_i\)支配。
后缀的话就可以考虑建后缀自动机然后跳\(parent\)树了。
\(A,B\)的反串一起建后缀自动机,然后把\(A,B\)都挂到\(parent\)树上,其中\(A\to Tree,Tree\to B,B\to A\)
最后形成了一个\(DAG\),拓扑序\(dp\)求最长路。

[十二省联考2019]春节十二响

先考虑合并两条链,显然是按照大小关系从大往小合并最优。
一棵树并没有什么变化。

[十二省联考2019]骗分过样例

子任务\(1\sim 3\)直接输出\(19^x\),记得\(x\)\(\varphi(mod)\)取模。
子任务\(4\),发现模数在\(10^6\)数量级,暴力枚举得到\(mod=1145141\)后转\(Task_{1\sim 3}\)
子任务\(5\)
排序后可以找到两个\(x\)只相差\(2\)的结果,设为\(a_0,a_2\),那么\(mod|(19^2a_0-a_2)\)
先用\(int128\)\(19^2a_0-a_2\),枚举其约数得\(mod=5211600617818708273\),然后转\(Task_{1\sim 3}\)
子任务\(6\sim 7\)由于某些原因发现\(19^x\)\(int\)竟然存在循环节?然后暴力就行了。
子任务\(8\sim 10\),判素数,用\(Miller\)算法暴力。
子任务\(11\sim 13\),求\(\mu\)
先筛出\(n^{\frac{1}{3}}\)以内的素数,把这些素数的贡献暴力判掉。
那么剩下的数无非三种情况:\(p,pq,p^2\)\(p^2\)很好判,\(p\)\(Miller\)算法判,剩下的就是\(pq\)
子任务\(14\),暴力判是否为原根。
子任务\(15\),任务同子任务\(14\),但区间变大,模数变小。
首先找一个原根(比如\(g_0=6\)),然后把\(x\in [1,mod)\)表示为\(g_0^y\)
考虑\(x\)不为原根的条件:存在\(q|mod-1\),满足\(x^{\frac{mod-1}{q}}=g_0^{y\frac{mod-1}{q}}\equiv 1\),即\(q|y\)
所以若\(x=g_0^y\)\(mod\)的一个原根,则\(y\perp (mod-1)\),把\(q\)筛出来后暴力。
子任务\(16\),坚信出题人会卡你,所以在\(1.5*10^9\)附近暴力,得到\(mod=1515343657\),转\(Task_{13}\)

[十二省联考2019]皮配

学校可以分为三类:\(k\)所特殊学校,与特殊学校同城市的学校,其它。
对于第三类,派系与阵营之间互不影响,分别\(O(n^2)\)进行\(dp\)即可。
对于第二类,我们可以把他们对阵营的贡献加到第一类上,然后对派系做\(O(n^2)\)\(dp\)
对于第一类,按照城市分层,暴力做\(O(kM^2)\)的不满\(dp\)
最后做前缀和,然后把上述三类学校的答案合并即可。

[十二省联考2019]希望

题目大意:在树上求\(K\)个联通块,这\(K\)个联通块存在交\(T\),且存在点\(v\)\(K\)个联通块的并的最远距离不超过\(L\)
考虑枚举\(K\)个联通块的并,然后就可以套一个经典容斥:点\(-\)边容斥了。
我们以计算包含某个点\(u\)的方案数为例。
\(f_{u,j}\)表示子树合并到\(u\)点,子树内最远距离不超过\(j\)的方案数+1,那么\(f_{u,j}=1+\prod_v f_{v,j-1}\)
\(g_{u,j}\)表示子树外(但包括\(u\)点)最远距离不超过\(j\)的方案数,换根\(dp\),转移\(g_{v,j}=1+g_{u,j-1} \prod_{t\neq v,t\in son(u)} f_{t,j-2}\)
考虑优化,\(f\)是一个比较显然的长链剖分,关键还是看\(g\)
依旧考虑长链剖分,对于重链,暴力把轻链的\(f\)合并即可。
对于轻链,注意到我们最终只需要使用\(g_{u,L}\)\(g_{u,L-1}\)
\(v\)子树内的最远点深度为\(d\),则\(dp\)的第二维我们只会用到\([L-d,L]\),故可以只转移这部分。
而这部分的深度依旧是轻链深度,所以总枚举长度依旧会是线性。
然后来解决前后缀\(f\)之积的问题,注意到转移与\(f\)的转移很像,所以我们可以按照\(f\)逆序转移\(g\)
这样对\(f\)数组进行撤销操作得到前缀,同时在转移的过程中维护后缀,从而避免了可持久化。
注意到:当\(v\)转移到\(u\),且\(v\)的深度不及\(L-1\)时,我们要支持后缀乘法。除此之外我们还要支持全局加法。
可以通过打标记的方式实现,维护全局标记\((a,b)\)表示\(x\to (ax+b)\)即可。
还有一个特别恶心的地方在于由于转移中存在\(+1\),所以\(f,g\)可能会变成\(0\),即可能出现后缀乘\(0\)
所以再额外维护一个标记\(cov\)表示\([cov,L]\)\(f/g\)都是\(0\),转移时顺带移动\(cov\)标记即可。
把逆元线性处理了,复杂度可以做到严格\(O(n)\)
细节\(N\)多警告,真\(TM\)难调。

GXOI2019

[GXOI2019]旅行者

关键点生成树,从起点与终点分别跑\(Dij\),对每个点记录它的最近归属起点、终点。
然后枚举边,把路径拼起来更新答案。

[GXOI2019]特技飞行

令人发指的二合一。关于\(c\)的计算,旋转坐标系后二维数点。
关于\(a,b\)的计算,我们可以抽象出一个模型:
有一列带标号小球,每次可以选择交换两个球或不交换,这两种操作分别有收益\(a,b\),要求最后排列不变,求最少步数。
我们首先假设都交换,得到排列\(P_2\),我们可以用\(b-a\)的代价使得排列中两个位置\((x,y)\)交换,问变回原排列的最少步数。
从前往后做,每次只交换实际位在枚举位前的点,从增量的角度看,会发现每一步的交换必定可以交换,所以模拟就好了。

SNOI2019

[SNOI2019]数论

枚举\(a_i\),那么就是要统计\((a_i+kA)\% B\in \{S_B\}\)\(k\)的个数。
我们知道,步长为\(A\)的移动在模\(B\)意义下会形成\(gcd(A,B)\)个环,所以直接把每个环的前缀和做出来。

[SNOI2019]通信

把通信站拆点,然后网络流模型比较显然。
考虑优化连边,注意到我们是给前缀连边,所以可以\(cdq\)分治,内部把左侧通讯站排序然后前缀连边。

TJOI2019

[TJOI2019]甲苯先生的滚榜

好久没写\(Treap\)了刚好写一下。

[TJOI2019]唱、跳、rap和篮球

容斥有几个非法:\(Ans=\sum_{j=0}^{\lfloor \frac{n}{4} \rfloor} (-1)^j \binom{n-3j}{j}F(j)\)
其中\(F(j)\)就是\(4\)个指数形生成函数的卷积,用\(ntt\)优化。

[TJOI2019]甲苯先生的线段树

第一问相当的简单,设答案为\(S\)
考虑第二问,直观想法:枚举\(lca\)深度\(d_1\),两个端点深度\(d_a,d_b\)
但是不难发现,若\(d_1<d_a,d_b\),则\(lca\)段对值的影响绝对大于后半段的影响。
所以枚举\(d_a,d_b\)后,\(lca\)其实唯一确定。问题转化为:求两个长度为\(a',b'\)的数,使得两者计算值之和为\(S'\)
设两个数的和为\(Sum\),则易得他们的计算值\(Calc(Sum)=2Sum-popcount(Sun)=S'\)
不妨枚举\(popcount\),设\(f_{i,j,0/1}\)表示从低到高做了\(i\)位,放了\(j\)\(1\),当且位是否被进位,暴力转移即可。
复杂度为相当不满的\(O(d^5)\)

JSOI2019

[JSOI2019]精准预测

\(S_{x,t}\)表示居民\(x\)\(t\)时刻还存活的状态,设\(D_{x,t}\)表示死了的状态。
\(2-sat\)的模型应该还是比较清晰的:
对于\(0,t,x,y\)\(D_{x,t}\to D_{y,t+1}\)\(S_{y,t+1}\to S_{x,t}\)。对于\(1,t,x,y\)\(S_{x,t}\to D_{y,t}\)\(S_{y,t}\to D_{x,t}\)
除此之外,还有:\(D_{x,t}\to D_{x,t+1}\)\(S_{x,t}\to S_{x,t-1}\)两种边要编满。
显然我们可以只把与\(x\)有关的时刻拿出来,其它的点丢弃,然后前缀连边,这样点数就优化到了\(2(n+m)\)
不难发现这是一个\(DAG\),故\(x\)的答案个数为:\(S_{x,t+1}\)不能到达\(D_{y,t+1}\)、且\(S_{y,t+1}\)不能到达\(D_{y,t+1}\)\(y\)的个数。
拿个\(bitset\)拓扑排序。空间太小就分几批处理。

[JSOI2019]神经网络

令人发指的二合一。
首先对每棵树求把它划分为\(j\)条链(注意:首尾异构,若链长>1则方案数要乘二)的方案数。
\(f_{u,j,0/1}\)表示昨晚\(u\)子树内,已有\(j\)条链,当前点是否向上延伸的方案数。首尾异构的乘二可以在链的最高点计算。
设第\(i\)棵树划分为\(j\)条链的方案数为\(val_{i,j}\)
其次是把枚举每棵树划分为多少段,求把这若干条链拼接在一起,且同色不相临的方案数。
有标号的环计数考虑破环为链,然后钦定一棵特殊的树放在开头,若这棵树分为\(l\)条链,则方案数为求出值除\(l\)
容斥,用多项式完成排列组合。
对于非特殊树,构建指数形生成函数:\(F_i(x)=\sum_{j=1}^{sz_i} val_{i,j}\sum_{k=1}^{j}(-1)^{j-k}\binom{j-1}{j-k}\frac{x^k}{k!}\)
对于开头的特殊树,注意这里还需要一个容斥来处理首尾相同。
先求总方案,再减首尾相同的方案,故生成函数为:\(E_i(x)=\sum_{j=1}^{sz_i}\frac{val_{i,j}}{j}\sum_{k=1}^j(-1)^{j-k}\binom{j-1}{k-1}(\frac{x^{k-1}}{(k-1)!}-\frac{[j>1]x^{k-2}}{(k-2)!})\)
全部卷起,系数之和来就是答案。

[JSOI2019]节日庆典

一个位置\(p\)要是最小循环的开头,则\([p,n]\)需要满足:在当前串后面接一个串\(t\)后,能够成为最小后缀。
然后就舒服了,我们知道,这样的位置不会超过\(logn\)个。
再证一遍,设有两个备选后缀\(a,b\),其中\(|a|>|b|>\lfloor \frac{|a|}{2} \rfloor\)
那么首先\(b\)要是\(a\)的一个\(border\),有\(|b|>\lfloor \frac{|a|}{2}\rfloor\),所以\(a\)一定存在一个周期\(cw\)
我们不妨令\(a=cwcwc,b=cwc\)
那么\(at=cwcwct,bt=cwct\)。因为\(ct>cwct\),所以\(t>w\)。故\(cwcwct<cwct\),即\(at<bt\),故\(b\)一定不合法。
我们现在就只需要暴力维护这\(logn\)个备选集合就好了。
不难发现,所有维护、查询过程中的\(lcp\)求解都为\(lcp(1,i)\),故用\(Z-Algorithm\)预处理\(lcp(1,1\sim n)\)即可。

[SDOI2019]

[SDOI2019]热闹又尴尬的聚会

首先,度数最小的点在删点后度数不会变大。
所以很容易得到第一问的做法:不断删除当前度数最小的点,每删一个点就更新一次答案。设最终答案为\(p\)
注意到这个过程中,每次取出的点度数不会超过\(p\)
所以我们每次取出一个点,就把相邻点删掉,这样每次删掉点的个数不超过\(p+1\),最终点数满足\(q\ge \lfloor \frac{n}{p+1} \rfloor\)

[SDOI2019]移动金币

我们把两个金币之间的距离看作一堆石子,经过一定转化后问题变为:
\(m\)堆石子,石子之和不超过\(n\),博弈规则如下:每次可以从第\(i\)堆中取\(t>0\)个石子,然后把这\(t\)个式子放入第\(i-1\)堆。
其中当\(i=1\)时取出的石子被丢弃,不能操作者败。
不难发现这其实是一个阶梯博弈,我们知道:阶梯博弈先手必胜的条件为:奇数层石子数异或和为\(0\)
容斥,我们转求先手必败的方案数。
考虑拆位,我们枚举每一位到底有几个\(1\),那么当且经当每一位\(1\)的个数都为偶数时,先手必败。
即对于每一个二进制位\(e\),构造生成函数\(F_e(x)=\sum_{i=0}^{m}\binom{m}{i}[i\%2=0]x^{2^ei}\),直接暴力卷积。

[SDOI2019]连续子序列

\(TMD\)这种题出在考场上谁做的出来啊?
根据\(OEIS\),这个数列有这样一种神奇的生成方式:从\(\{0\}\)开始,每次\(0\to 01,1\to 10\)
那么我们可以根据逆运算\(01\to 0,10\to 1\)缩小序列的规模。同时有结论:对于长度\(>3\)的序列,只有唯一合法缩小方案。
然后我们就可以记搜了,记搜的每一层,我们对当前串\(SK\)枚举缩小方案(划分方案),当长度\(\leq 3\)的时候特判出解。

[SDOI2019]世界地图

\(T_{[l,r]}\)表示只考虑区间\([l,r]\)的点和边时的最小生成树。
假设询问\([l,r]\),此时我们已经知道了\(T_{[1,l-1]}\)\(T_{[r+1,n]}\),现在要加入\(1\sim n\)的一列边,然后求最小生成树。
每加入一条边,必定就会删掉一条边(第一条除外),考虑删掉的边的位置。
不难发现,为在\(T_{[1,l-1]}\)中是第\(1\)列点路径的并,在\(T_{[r+1,n]}\)中是第\(n\)列点路径的并,其实就是虚树。
所以我们其实不用维护\(T_{[1,l-1]}\),只需要维护以第\(1\)列的点为关键点的虚树,其中虚树边权是路径上的最大边权。
每次询问,把两棵虚树以及\(1\sim n\)的边拿出来跑最小生成树即可。
如何求上述虚树?其实是一样的,对于\(T_{[1,i]}\)维护以第\(1\)列、第\(i\)列为关键点的虚树,则第\(i\)列的答案从第\(i-1\)列转移即可。

posted @ 2019-05-18 11:30  GuessYCB  阅读(630)  评论(0编辑  收藏  举报