野鸡题
P7710 [Ynoi2077] stdmxeypz
根号分治。
-
\(x>\sqrt{n}\):暴力往下跳,最多跳 \(O(\sqrt{n})\) 层,每层在
bfs
序上是连续的,找到这段bfs
序区间后区修单查即可(\(O(1)-O(\sqrt{n})\),差分),具体地,每层对dfs
序排序,二分找到 \(x\) 的子树这一层中最左和最右的结点,这两个点构成的bfs
序区间即为所求。 -
\(x\le \sqrt{n}\):离线后对于每个 \(x\),对所有结点深度 \(\bmod x\) 的结果为第一关键字、
dfs
序为第二关键字排序(基数排序可做到 \(O(n)\)),那么每次修改在一个区间内,区修单查即可(\(O(\sqrt{n})-O(1)\))。
\(x>\sqrt{n}\) 直接修改即可,\(x\le \sqrt{n}\) 则要 \(O(m)\) 对后面的询问加上贡献(每次排序的结果不一样)。总共 \(O((n+m)\sqrt{n}\log n)\),瓶颈在于 \(x>\sqrt{n}\) 时暴力往下跳并二分。看了下题解发现要在此处扔掉这个 \(\log\) 需要用长链剖分什么的做到 \(O(n\log n)-O(1)\),不想学了。
正在卡常。如果卡不过就乖乖去学长链剖分罢。
P3731 [HAOI2017]新型城市化
从 \(n\) 个点的无向完全图中删去 \(m\) 条边,得到的图恰好有两个极大完全子图。在被删去的 \(m\) 条边中,求出所有的边,满足:加上这条边后,极大完全子图的大小得以增加。
正♂男♂则♂反♂,直接在原图的补图上展开讨论。因为恰好有两个极大完全子图,完全图在补图中内部不会有边相连,所以这就是一张二分图。原图中加上一条边,相当于在补图中删掉一条边;原图中极大完全子图的大小得以增加,即补图中最大独立集的大小得以增加。
问题转换成:给定 \(n\) 点 \(m\) 边的无向图,求出所有的边,满足:删掉这条边后,最大独立集的大小得以增加。
众所周知,\(\text{最大独立集}=\text{结点数}-\text{最大匹配}\),所以我们只需求出所有的边,满足:删掉这条边后,最大匹配减少,即这条边必定在最大匹配中。跑 dinic
,一条边必定在最大匹配中的充要条件是:这条边的反向边流量非零且两个点在建出的网络里不在同一个强连通分量中。
感性理解,反向边流量非零表示该边在至少一个最大匹配中;两点不在同一个强连通分量中中告诉我们这条边找不到一个替代品,否则沿着这条边所在的边双形成的环增广一次,这条边的反向边流量即变成零,该边可以不在最大匹配中。
P4126 [AHOI2009] 最小割
类似地,可行边满足:反向边满流且 \(u,v\) 不在同强连通分量内;必须边满足:反向边满流且 \(u\) 与 \(S\) 同强连通分量、\(v\) 与 \(T\) 同强连通分量。
P4311 士兵占领
行的代表点向列的代表点连边。
P3899 [湖南集训]更为厉害
求满足如下要求的 \((b,c)(b\ne p,c\ne p)\) 个数:
-
\(p\) 和 \(b\) 都为 \(c\) 的祖先;
-
\(dis(p,b)\le k\)。
\(sub()\) 与 \(siz\) 均不包含自身
主席树,按 dfn
依次插入 \(dep\),查询一段区间内 \(dep\le dep_p+k+1\) 的个数与和即可。
[GDOI2016]疯狂动物城(DSY)
拆成 \(u\) 到 \(\operatorname{lca}\) 与 \(v\) 到 \(\operatorname{lca}\) 两部分。
P4396 [AHOI2013]作业
莫队+值域分块 / 分块+值域分块 / 线段树套平衡树 / 树状数组套权值线段树 / CDQ
[XSY-树结构]消防站
大意:给定一棵树,在其中取两个点 \(p_1,p_2\) 使得 \(\max_{x=1}^n \min(dis(x,p_1),dis(x,p_2))\) 最小,求该最小值。
Lemma.最优的消防站 \(p\) 一定在直径上,否则把 \(p\) 往直径的方向挪只会使答案变得更优(直径的长度是树上最长的,感性理解)。
枚举一个“断边”,切断该断边后原树分为左右两块,对它们分别考虑,问题转化为在一棵无根树中取一个根使深度最小。由 Lemma 取的两个根都在原树的直径上,断边在取的两个根间的路径上,所以断边在原树直径上。
我们把直径拉直,再把原树的其它节点挂在直径下方,从左到右扫一遍直径枚举断边,发现在更新断边的时候可以 \(O(1)\) 更新当前左边块最优的消防站,同理从右到左扫一遍,最后再次枚举断边取两边答案的 \(\max\) 中的 \(\min\) 即可。
P2680 [NOIP2015 提高组] 运输计划
要清的边一定在 \(m\) 条路径中最长的之中。设 \(l\) 为该条路径长度,枚举清边 \(k\) 设其长度为 \(w\),再设不经过 \(k\) 的所有路径中最长的之长度为 \(mx\),显然设置该边为清边的答案为 \(\max(l-w,mx)\)。问题转化为对所有边求 \(mx\)。每条边树剖后转化为 \(O(\log n)\) 个 dfn
区间,这些区间没有覆盖到的 dfn
区间也只有 \(O(\log n)\) 个,在线段树上用该路径长度更新之即可。
P1600 [NOIP2016 提高组] 天天爱跑步
对于给定的每个 \((s,t)\),设 \(a=\operatorname{lca}(s,t)\)。枚举所有观察员 \(u\),对于所有 \((s,t,a)\),分情况讨论(\(bg(x)\) 和 \(ed(x)\) 分别为以 \(x\) 为根的子树的 \(dfn\) 的起终点):
\(u\) 在 \(\operatorname{path}[s,a]\) 上时,\((s,t,a)\) 对 \(u\) 有贡献当且仅当如下的三个条件同时成立:
\(u\) 在 \(\operatorname{path}(a,t]\) 上时,\((s,t,a)\) 对 \(u\) 有贡献当且仅当如下的三个条件同时成立:
满足两者的 \((s,t,a)\) 不会重复,分别求解即可,问题转化为三维数点。以第一种情况为例。
\(\forall d\in[1,n]\),将所有 \((s,t,a)\) 中满足 \(dep_s=d\) 者的 \(dfn_a\) 存下来,接着以离散化后的 \(dfn_a\) 为版本号、\(dfn_s\) 为记录对象建主席树,枚举 \(u\) 时在对应树上查 \(bg(u)\) 与 \(ed(u)\) 间值的个数即可。第二种情况同理。
时空复杂度均为 \(O(n\log n)\),常数极大,估摸着目前能排到最劣解前10。
LOJ149. 01 分数规划
二分 \(ans\),对所有人的 \(a-b\times ans\) 排序后贪心选取最大的 \(k\) 个,如果它们的和 \(>0\) 那么存在比当前 \(ans\) 更大的解,反之亦然。
P3241 [HNOI2015]开店
设 \(c=\sum[a_i\in[l,r]]\),答案为
前两项好搞。对于第三项,以离散化后的 \(a_i\) 为版本号建主席树,树剖,每个点到根的路径上用主席树打上一个标记,每次询问的答案即为
HDU4734[XSY-数位DP] F(x)
自然想到 \(dp\) 第二维记录除后 len
位外的前面的数位产生的贡献总和,然而每组数据都需要 memset
时间爆炸;第二维改记前面的数位给 \(f(B)\) 加上贡献后剩余可用的值 就可以做到一个 \(dp\) 数组用到底,不需要 memset
(即我们消除了 \(A\) 的不同对于 dp
的影响)。绝妙,遂记下。
LOJ10168[XSY-数位DP] 恨6不成妻
平方和这种范围贼大的明显应作为 dp
结果而非参数。考虑记录后 len
的平方和,发现要转移到前面(当前维护的为 \(\sum a^2\)):
于是每个 dp
结果中除平方和 \(sqs\) 外,额外记录所有数的和 \(s\) 和个数 \(c\),参数放一个 “ 当前数字和 \(\bmod 7\) ” 和 “ 当前组成的数 \(\bmod 7\) ” 即可。
P5842 [SCOI2012]Blinker 的仰慕者
\(K=0\) 即求 \([A,B]\) 中含 \(0\) 的数字的和,很逊。
每个数位上只有可能是 \(0\sim 10\) 的正整数,其中质数只有 \(2,3,5,7\),于是枚举每个质数参与乘法的指数,然而空间达到 \(2\times 19\times \log_2 10^{18}\times \log_3 10^{18} \times \log_5 10^{18}\times \log_7 10^{18}\approx 49558080\),就算全开 int
也需要约 \(189\operatorname{MB}\) 的空间,显然不够。这个算法不优,因为某些极端情况(如 \(2,3,5,7\) 的指数均取最大值)是根本取不到的。看上去没有优化空间了,于是我们转换思路,直接枚举 \(10^{18}\) 内可以表示为 \(2^a\times 3^b\times 5^c\times 7^d\) 的形式的所有数,可以发现它们总共只有 \(66061\) 个,将它们排序后把 \(\frac{K}{\text{当前确定的所有数的乘积}}\) 在 \(nb\) 中的位置作为参数(用了一个小 trick,不用每次 memset
了)。转移如果在 dfs
中二分复杂度会炸,预处理一下就行了。
P3303 [SDOI2013] 淘金
设 \(c_i=\sum_{j=1}^n [f(j)=i]\),一个显然到我花四十分钟才搞懂的结论是 \((x,y)\) 的答案即为 \(c_x\times c_y\)。对着这段代码盯一会儿就理解了。
for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) ++a[f(i)][f(j)];
P2221 [HAOI2012]高速公路
BZOJ4176 Lucas的数论
通过P3327变成
整除分块之后 \(\mu(d)\) 杜教筛(记结论即可,整除分块套杜教筛是 \(O(n^\frac 23)\) 的),\(S(k)\) 直接暴力 \(\sqrt k\) 计算。后者的复杂度为对所有不同的 \(n/d\) 开根求和。
\(d>\sqrt n\) 是
\(d<\sqrt n\) 是
后面那个 \(\sum\) 被我老婆积分证出来是 \(O(n^\frac 14)\) 的。所以总共 \(O(n^\frac 34)\)。
BZOJ3601
枚举 \(d\)。
\(i\) 确定,
2019
对称性,只讨论 \(j>i\),答案为 \(\lceil\max\{a_j+\sqrt{j-i}\}-a_i\rceil\)。令 \(b_i\) 表示 \(i\) 对应的令这个式子取 \(\max\) 的 \(j\)(决策点),容易发现存在决策单调性,即 \(i'<i\Rightarrow b_{i'}\le b_i\)。严谨和感性证明都很简单,你考虑根号的增长越来越慢就容易理解了。
所以分治,参数 \((l,r,s,t)\) 表示当前 \(i\in[l,r],b_i\in[s,t]\)。取 \([l,r]\) 中点 \(mid\),在 \([s,t]\cap[s,mid]\) 中暴力扫一遍得到 \(b_{mid}=p\),继续分治 \((l,mid-1,s,p),(mid+1,r,p,t)\) 即可,\(O(n\log n)\)。
玩具装箱
形如 \(f_i=\operatorname{min-max}\{a_ib_j+c_i+d_j\}\)
点集中取 \(kx+y\) 的 \(\operatorname{min-max}\),拿斜率 \(-k\) 切之
玩具装箱单调队列模型需满足 \(a\) 与 \(b\) 均单调。
P9482 [NOI2023] 字符串
记 \(P_x:\) 前缀 \(x\),\(S_x:\) 后缀 \(x\),\(S(x):\) 原串第 \(x\) 位,\(L_x:\) 以 \(x\) 到 \(x+1\) 这一区间为回文中心的最长回文半径,用 manacher 搞。
先拓宽条件,变成计数
把串倒过来接到原串后面,插分隔符,前缀变后缀
SA,变成二维数点。从大到小扫后者排名,\(2l+i\) 有奇偶性限制,搞两棵树。扫到询问 \(i\) 就直接查。
拓宽条件会导致这一部分被多算:
也就是
令 \(p=i+l-1\),需满足
只保留满足后者的 \(p\),然后 \(p\) 本身有一个位置的区间,还是二维数点。从小到大扫 \(p-L_p\),扫到询问 \(i\) 就直接查对应区间。
最终把两部分相减即为答案。
P4318 完全平方数
先二分变成求 \(\sum \mu^2(k)\)。可以考虑筛,对于所有 \(p\in \mathbb P\) 将答案减去 \(\lfloor\frac n{p^2}\rfloor\)。变成一个容斥,答案是
这里 \(\mu(k)\ne 0\) 的意义是 \(k\) 是恰好 \(c(k)\) 个质数的乘积。然后发现对于这类 \(k\),\((-1)^{c(k)}=\mu(k)\)。于是筛一遍然后暴力跑。
POI2014
按照拓扑序从大到小枚举删点,维护拓扑序小与拓扑序大的两个集合。
ZJOI2013
\(k\) 大想都不想直接 whlBin
。
FJOI2016
将区间内数从小到大排。加入一个数 \(a\) 的影响是,原来可以表示 \([1,x]\) 的数,则若 \(a\le x+1\),现在就可以表示 \([1,x+a]\) 的数。
暴力模拟 \(\mathcal O(mn\log|V|)\)。优化,把相同的数字 \(a\) 压在一起加,\(\mathcal O(m\sqrt n\log|V|)\)。再优化,设前一步加的数为 \(l\),直接对 \([l+1,x+1]\) 的数求和,当作 \(a\) 加上去。就变成 \(\mathcal O(m\log^2|V|)\) 的了。
SCOI2010
FF 算法模拟费用流(暴论)。第 \(i\) 加流量只枚举流向属性值 \(i\) 的边。总复杂度 \(\mathcal O(m)\)。
野鸡题
令询问水位 \(h\),答案为 \(\sum_{i\ge 2}[a_{i-1}<h\le a_i]\)。
HN/JSOI2011
\((=-1,)=1\),那么答案为 \(\lceil最大前缀/2\rceil+\lfloor-最小后缀/2\rfloor\)。考虑中间那段必然是合法序列,否则最大前缀/最小后缀会被向后/向前拓。
NOIO2022
直接做是不可能的。考虑 \([1,r]\) 形成的栈操作序列去掉 \([1,l)\) 中元素的有关操作,剩下的相对位置都不变,即可得到 \([l,r]\) 的操作序列。那么对整个序列直接跑,即可对每个点 \(i\) 得到:把 \(i\) 弹出的是后面的哪个元素。
然后你抓住“把栈底元素弹出的,仍然是栈底元素”这点即可。可以倍增,\(f_{i,j}:i\) 开始做,第 \(2^j\) 个栈底元素是谁。或者考虑每个元素什么时候可以作为栈底弹出前面的栈底,然后合法的询问 \(l\) 形如一段区间,\(r\) 同理。
GDCPC2023
无视 \(x=y\) 的操作,它们必然放在最前或最后。对于 \(\begin{cases}a_p\gets 1\\a_q\gets 2\end{cases}\),\(p\) 向 \(q\) 连边。那么每个入度为 \(0\) 的强连通分量都恰好拆出一个点赋为 \(1\),剩下全赋 \(2\) 即可。
不要尝试对操作建图,这会使你的问题变成 NPC。
GDCPC2023
一个良好的观察是前缀或后缀 \(\&\) 只会被 \(\log\) 个点更新,称为关键点。枚举 \(k\) 考虑最优的交换操作。交换两个非关键点不优。交换两个关键点的话 \(\log^2\) 枚举。考虑交换前缀关键点 \(i\) 与后缀非关键点 \(j\),那么新的答案 \(\&(1,i-1)\&(i+1,k)\&a_j+a_i\&(k+1,n)\),\(\&(l,r)\) 表示区间 \(\&\)。这里利用了 \(j\) 不是关键点的性质。那么枚举 \(i\),唯一变数为前面的 \(a_j\),\(\&\) 最大值随便拿个 Trie 之类的搞搞即可,复杂度 \(\mathcal O(n\log^2 |V|)\)。
GDCPC2023
对左右分别二分,判定区间颜色 \(\mathbb A\) 的出现次数和是否 \(=\) 区间长度。线段树套哈希表即可。对 \(\mathbb A\) 的每个元素分别加和。线段树二分做到 \(\mathcal O(k\log n)\)。
Noip2023 62-A
首先考场上被这个 \(m\) 对操作间的羁绊卡死了。实际上可以直接把它拆开,变成一个 \(50\%\) 执行的种树和一个 \(50\%\) 执行的砍树。不用管那 \(25\%\) 的两边都执行或两边都不执行。两个区间是无交的,互不影响。
然后就水了。对每块地分别计算贡献。令 \(a\) 为当前这块地有树的概率,种树使 \(a\gets \frac a2+\frac 12\),砍树使 \(a\gets \frac a2\)。那么一次种树会产生 \(\dfrac 1{2^{后面的操作次数(含自身)}}\) 的贡献。随意重排,令覆盖这块地的总操作次数 \(k\),种树次数 \(p\),后方操作次数在 \([1,k]\) 中均匀随机。总贡献就是 \(p\times \frac 1k\sum_{i=1}^k \frac 1{2^i}=\frac pk(1-\frac 1{2^k})\)。直接对每块地加和即可。
APIO2009
sol by @pidan。这个做法并不能套用到 JOISC2021,因为转移时接父亲不一定要求接最大值。
ICPC2020NJ
往上走 \(y_u\),往下走 \(y_d\),左走 \(x_l\),右走 \(x_r\),需要保证每个点被覆盖到,那么答案为 \(\min(y_u,y_d)+\min(x_l,x_r)+y_u+y_d+x_l+x_r①\)。
这里不要尝试去对每个点确定是用 \(x\) 覆盖还是用 \(y\) 覆盖。直接枚举 \(x_l\)。优先把 \(y_u\) 和 \(y_d\) 表示出来,\(y_u=\max(\max_{x_i<x_l}y_i,\max_{x_i>x_r}y_i)\),\(y_d\) 同理。维护 \((x_r,y_u,y_d)\) 即可。将①的两个 \(\min\) 分别拆开,令 \(m_l\) 表示 \(x_l\) 左侧的 \(y_{\max}\),\(n_l,m_r,n_r\) 同理,用三个 set
分别维护:满足 \(n_l<n_r<m_l<m_r\) 以及同理的六种偏序关系的三元组即可。男鞋。
USACO-S
值域 \(2^{20}\) 考虑建图。在 \((x,y)|\operatorname{pc}(x\oplus y)=1\) 间连边,相当于求 \(a_i\) 到每个 \(a_j\) 的最长路(不能走环)的 \(\max\)。但是这个最长路全是正环做不了。令 \(a_j\gets \lnot a_j\),答案变成 \(m\) 减去 \((a_i\) 到每个 \(a_j\) 的最短路的 \(\min)\)。从 \(n\) 个 \(a_j\) 出发跑多源最短路即可(bfs)。
USACO-P
和楼房重建很像。开值域 \(10^{14}\) 线段树,维护(以下基于进区间时没草):长度 \(l\);答案 \(s\);有草吃的天数 \(d\);剩下草数 \(c\);带着 \(c(ls)\) 个草进 \(rs\) 后,\(rs\) 的答案 \(p\)。这个 \(p\) 相当于记忆化。考虑合并,记 \(f(u,x):\) 带着 \(x\) 个草进区间 \(u\),答案。如果 \(x\le l(ls)-d(ls)\) 就是 \(f(ls,x)+p(u)\)。否则就是 \((ls\text{全覆盖})+f(rs,x-(ls\text{长度}))\)。整体 \(\log^2\)。
WC2024
令 \(p_i=|h_i-L|\),其在 \((u,v)\) 间单谷(\(p_u>p_{u+1}>\cdots>p_t(<=>)p_{t+1}<p_{t+2}<\cdots<p_v\))。也就是 \(\not\exist i\in(u,v):p_{i-1}\le p_i\ge p_{i+1}\)。每个 \(i\) 对 \(L\) 偏序限制,区间交出来为 \(\varnothing\) 则寄,有单调性,不删除双指针(三指针)即可,线性。
xtq
树上求邻域 \(\operatorname{mex}\),保证点权为排列,\(n,q\le 5\times 10^5\)。
即求 \(\min_{\operatorname{dis}(x,u)>d}v_x\)。二分答案,\(\forall k\) 预处理出所有 \(v_x\le k\) 的 \(x\) 构成子图的直径,每次对 \(u\) 往直径两段求距离看是否 \(>d\) 即可。
APIO2011
\(\forall(x,y),(x,y)\oplus (x,y-1)\oplus (x-1,y)\oplus (x-1,y-1)=1\)。把 \(x\) 替换为 \(x-1\) 得到 \((x,y)\oplus (x-2,y)\oplus (x,y-1)\oplus (x-2,y-1)=0\)。不断地推下去可以得到
那么枚举 \(a_{1,1}\),每个给出的格子相当于令 \(a_{1,y}\oplus a_{x,1}=0/1\),使一扩展域冰茶几即可,答案 \(2^{\operatorname{blk}}\)。