2024.5.4 总结 1 / 星系的旋转 无目的消散
AT_apc001_f
首先考虑转换边权为点权,考虑令点权为连接的边权异或和,这样路径异或变成了双点修改,问清零的最小次数。
首先对于边权和一样的匹配不劣,问题是现在剩下一些孤单的旅人怎么匹配了,状态 dp 求出即可,注意只有 xor 和为 0
的状态才存在(
AT_code_festival_2017_qualb_f
幽默,我为什么开这种题目。
首先不难发现,我们要构造最小表示最大,我们求这个最小表示最大(
考虑三个字符串 \(s_1\leq s_2\leq s_3\),那么肯定要放成 \(s_1s_3s_2\)(逃。
然后如果有一个 \(s_3\leq s_4\),\(s_4\) 直接接在 \(s_1\) 后面即可,然后可以归纳 qwq
开一个 multiset,考虑每次取出最小最大的进行合并,最后即为答案。
AT_dwango2016qual_e
lsy 怎么做 lsy 题 /shui
Slope Trick ......?
首先题目不难转化为给定一个序列 \(A\)(其实就是原题目中的 \(p\),注意 \(t\) 不降),要构造一个单调不降的序列 \(B\),最小化 \(\sum |A_i-B_i|\),特别的,要强制 \(t_i\) 一样的 \(B_i\) 相等。
如果没有最后那个强制其实就是 CF713C 了,我们描述一下这个 b 东西的做法,先考虑朴素的 dp,不妨设填完前 \(i\) 个 \(B\) 且 \(B_i=j\) 的最优答案为 \(f[i][j]\),那么转移很显然是 \(f[i][j]=\min_{k\leq j}\{f[i-1][k]\}+|a_i-j|\),加上一个优化,就有 \(f[i][j]=g[i-1][j]+|a_i-j|\) 了嘛,其中 \(g\) 是 \(f\) 的前缀 \(\min\)(
绝对值函数其实斜率单调递减的说(对手指.png),那么其实不难发现,\(g\) 是一个下凸壳子,然后 \(f\) 也是一个下凸壳子,这里提前说明一下,对于这个题目加进去的是一个下凸函数,所以加进去其实也是一个下凸壳子捏,具体而言,斜率全都是单调递增的,或者简单一点的理解,前缀 \(\min\) 不影响凸性,然后每次斜率的变化都是 \(0~x-1\) 获得 \(-1\),\(x+1~inf\) 获得 \(+1\),这样左边永远不会比右边大 qwq
对于这个壳子,我们可以只维护拐点,拐点除斜率的变化量,和斜率为 \(0\) 的位置高度,如 image 所示的蓝点为维护点,斜率变化几就在堆里面放几次,现在我们拥有了一个 priority 塞满了蓝点和一个 \(Ans\) 为斜率为 \(0\) 的位置的答案,q.top()
为斜率为 \(0\) 位置的起点。
然后怎么考虑呢,首先考虑 \(a_i\geq top\),这种情况在 \(a_i\) 取最优秀,最优答案不变,直接在堆里面加入 \(a_i\) 即可。答案对了凸包其实还没维护好,再 pop 掉平的点就行了。
然后考虑 \(a_i>top\),这个时候其实还是 \(top\) 这个地方最优秀,因为考虑 \(top\) 之前的斜率都是负的,加上这一个,最多变成平的,那么考虑 \(a_i\) 对 \(top\) 的贡献,显然是 \(top-a_i\),加到 \(Ans\) 里面即可。
然后回到这个 lsy 题,我们需要同时加入 \(t_i\) 相等的再取前缀 \(\min\),我们可以先维护顶点的斜率为 \(k\),答案高度暂时为 \(Ans\),如果 \(k>0\),我们考虑退掉 \(top\),考虑去掉 \(top\) 的贡献,减掉 \(top\) 即可。换句话说,一个 \(a_i\) 对 \(Ans\) 的影响其实是斜率加 \(1\) 截距 \(-a_i\),考虑到答案 \(k=0\) 前面的斜率影响就可以不管不顾了。
P10383
我们考虑在模意义下求解,然后还原分数,所以我们取一个超大质数 \(9000000000000000041\),然后就做完了。
首先对于模大质数可以还原出合法解,就是要说明对于 \(0\leq p,q\leq V,M>V^2\),对于任意的 \(mul\gets \frac{p}{q}\mod M\) 都可以还原出唯一的对应的 \(\frac{p}{q}\)。
那么考虑一组 \(\frac{p}{q}\equiv \frac{p_2}{q_2}\pmod M\),有 \(M|pq_2-q_p2\),考虑到 \(0\leq p,q,p_2,q_2\leq A\),那么只能 \(\frac{p}{q}=\frac{p_2}{q_2}\) 了。
还原是考虑一组 \(\frac{a}{x}\equiv\frac{b}{y}\equiv \frac{y\mod x}{b-a\lfloor\frac{y}{x}\rfloor}\pmod M\),前面两个是定的给的且等于 \(mul\),第三个是新的构造,每一轮重新取后面两个,正确性大概是这样(
把 \(mul\) 换成 \(\frac{x}{a},\frac{y}{b}\) 之后正确性显然。
但是不能通过 sub4 的两个点,考虑强制 \(a\) 也有约束,但是还有一个点会整活出 \(y=0\) 这种东西。大概是辗转相除不够充分遍历导致的,我也不会啊,求教。
其实正确的合并是使用 bgst,但是不知道这个 exgcd 东西有没有前途,反正感觉简洁就记了 /xia
递归出 \(y=0\) 的 hack 是 2841300223 2499598500
。
upt on 2024.9.29 错误是没有 int128 导致的。
P5513
不难发现按照完全二叉树那种编号方式(先层再列顺次标号)之后,操作分别对应 \(\times 2,\times 2+1,\lfloor\frac{ }{2}\rfloor,-1,+1\),不妨维护其二进制数,分别对应 \(后面放一个 0/1,去掉一位,平凡的二进制数 +1/-1\)。
这个 \(+1/-1\) 可能会导致进位退位,不能直接做完,那我们考虑直接加在位上面,最后再一起进位。
但这样子是不对的,如果不及时进位可能会导致本位多舍去一些数,那么我们只需要在每次做右移操作前进一位就行了,复杂度没问题,正确性有了。
答案怎么求,首先无脑的,二进制位长的那个无脑往上条调到同一深度,然后考虑同时跳,调到一层考虑差的绝对值,枚举层数对贡献取 \(\min\) 就行了,注意层数从小到大枚举,二进制差太大了就直接不继续做了。
P3642
首先有一个朴素的方程,设 \(f_u(x)\) 表示在子树 \(u\) 用 \(x\) 秒燃爆的最小代价,那么显然有转移 \(f_u=\sum_{v 是 u 的儿子}\{f_v(y)+|x-w-y|\}\),首先 \(f_u\) 是一个凸包。
我们枚举考虑合并 \(u,v\),那我们不妨考虑 \(v\) 带给 \(f_u\) 的增量函数 \(F_{v\to u}\),我们考虑一个位置 \(x\) 在函数 \(g(y)=f_v(y)+|x-w-y|\) 上面的最小值,这个最小值就是 \(F_{v\to u}\) 在 \(x\) 上面的纵坐标,我们画出 \(f_v\) 和 \(|(x-w)-y|\) 进行分类讨论,首先凸包相加还是凸包,然后斜率为 \(0\) 的位置一定最优,然后设 \(f_v\) 斜率等于 \(0\) 的是 \([L,R]\) 这一段,设 \(Jury=\min\{f_v(i)\}\)。
-
对于 \(x-w<L\) 即 \(x<L+w\),抬平之后 \(L\) 以及左边一段斜率为 \(0\),如果 \(x\geq L\) 可以取到 \(L\),最优值为 \(Jury+(L+w)-x\),不然 \(x<L\),取 \(x\) 最优,答案是 \(f_v(x)+|x-w-x|\) 也就是 \(f_v(x)+w\)。
-
对于 \(L\leq x-w\leq R\),取 \(x-w\) 最优,答案为 \(Jury\)(
-
对于 \(R<x-w\),取 \(R\) 最优,最优答案是 \(Jury+x-(w+R)\)。
我们考虑画出图来,先向上平移,然后发现将 \(f_v\) 变成 \(F_{v\to u}\) 只需要先退出 \(>L\) 的后面的节点,然后再强制加入后面三条线段即可,于是考虑对 \(f_v\) 做点手脚然后跟 \(f_u\) 合并起来,合并可以使用可并堆或者启发式合并。
这样其实已经做完了,但是方便实现还有一些小东西补充,首先对于最后的堆,我们知道截距为 \(\sum_{i=2}^N w_i\),知道所有点的斜率单调递增且最后一位是 \(0\)(至少我们可以选择性的做成这样,然后我们可以考虑直接还原出斜率为 \(0\) 的地方的答案了,换句话说,我们只维护拐点已经可以解除答案了,就不需要再维护一些乱七八遭的东西,设堆从大到小的横坐标是 \(a_1,...,a_k\),答案是 \(Ans=\sum w_i+\sum_{i=1}^k (w_k-w_{k+1})\times k)=\sum w_i-\sum a_i\)。
然后我们考虑 \(f_u\) 直接加入了 \(cnt\) 个儿子,此时立起来的斜率就是 \(cnt\),我们要的图像斜率最后为 \(1\),所以 pop 掉 \(cnt-1\) 个就行了,特别的,\(f_1\) 要多 pop 掉一个。
ABC217H
攻击是往里面塞一次函数,是凸的,直接在堆里面维护就好了,然后考虑这个走来走去,不妨设距离上一次攻击的时间间隔为 \(d\),上一个包斜率为 \(0\) 的部分是 \([L,R]\),那么就是 \(L\) 左边的向左平移 \(d\),\(R\) 右边的向右平移 \(d\),不妨开大根/小根堆维护斜率 \(<0\)/\(\geq 0\) 的拐点,平移操作直接打 tag,每次加入射线分讨贡献即可。
CF436E
比较显然且错误的做法是一颗一颗拿,每次考虑拿最小的,拿了 \(a_i\) 之后把 \(b_i-a_i\) 当成一棵新的星星考虑,但这显然是错误的。但是我们延续拿了 \(a_i\) 之后放入 \(b_i-a_i\) 作为一棵新星星的做法。
上述错误启示我们必须把 \(a,b\) 一起考虑,那我们考虑两个两个拿,不妨设最小和次小的一棵星星为 \(a_i,a_j\),最小的一组星星为 \(b_i\),哪个更优我们拿哪个,拿完之后更新 \(a,b\) 的集合,实现可以用 multiset
。
这样我们做完了 \(2|w\) 的情况,那么对于这个剩余的 \(w\),我们考虑几种情况,「将拿了零个的升级为 1 个」,「将一个拿了一个的升级为 2 个」,「将拿了两个的降级为 1 个 & 将拿了零个的升级为 2 个」 以及 「将拿了一个的降级为 0 个 & 将拿了零个的升级为 2 个」,这几种取最优就是答案了。
事实上后面那一部分是 \(w\gets w+1\) 的做法,可以用这个做整个题目,那样的话要开好多好多堆。
P4574/P1633
考虑 dp,不妨设 \(f[d][i][j][k]\) 表示 \(0,\dots,i\) 位用了 \(a/b/c\) 中的 \(i/j/k\) 个 \(1\) 时的最小 \(c\),转移很简单,但是有点小长就不赘述了,注意判断算出来 \(f\) 超过指定位数的情况无解。
CF633F
树形 dp,感觉做麻烦了,不妨设 \(f[i][0/1/2][0/1]\) 表示子树 \(i\) 中开了 \(j\) 条链最后一条直径有没有端点在跟 的最大点权和,转移很暴力,分类讨论就好了,不难但有点小长,这里不再赘述。
AGC013D
首先考虑操作,「黑球变黑球:黑白」,「白球变白球:白黑」,「黑球变白球:黑黑」和「白球变黑球:白白」。
考虑一个操作序列的合法性,大概是一个增量极差不超过 \(n\),不妨放在坐标系上面考虑,点 \((x,y)\) 表示第 \(x\) 次操作有 \(y\) 个白球,操作序列在坐标系上面连成一条折线,只要不越界就合法,走势分别为 \((x,y)\to (x+1,y+1)/(x,y)\to (x+1,y)/(x,y)\to (x+1,y+1)/(x,y)\to (x+1,y)\),能使用一个走势要求至少有一个其对应的球,在这题就是有 \(y=0\) 和 \(y=n\) 的系数特殊性。
我们考虑 dp 折线数,设 \(f[i][j]\) 表示 \((i,j)\) 位结尾的答案,然后发现这样子会算重,我们考虑去重。
先思考怎么样子的折线是重复的,对于极差 \(d=n\) 的一定不会算重,所以考虑 \(d<n\) 的。首先形状相同,可以通过上下平移获得,那我们比较想考虑碰到 \(y=0\) 的折线,但是这样有一个问题是系数变的不统一了,指对于 \(d=n\) 的在最底下需要 \(\times 1\),而 \(d<n\) 的需要 \(\times 2\),我们不妨考虑在 \(y=1\) 这个地方也计算一次贡献,这样子就正确了。
P3266
写完就有一种被骗了的感觉,解数,结束,感觉有点小阴间,也可能单纯我太菜 /kk
首先每一行单调递增,值域 \([0,m]\) 填进 \(m\) 个里面,那么不妨设 \(f[i][j]\) 表示做到第 \(i\) 行,空出了 \(j\) 的解数,转移显然有 \(f[i][j]=\sum_{k=0}^{j+1}f[i-1][k]\),其实也就是 \(f[i][0]=f[i-1][0]+f[i-1][1],f[i][j(>0)]=f[i][j-1]+f[i-1][j+1]\),我们把这个放在坐标系上面,考虑组合意义,就是走完的方案数。
这是题解的图,妈耶整个题解区都是这种说不上诡不诡异的坐标方式,但是考虑到我在 AGC013D 也是这么标的那么还是看的挺顺眼的。然后其实好像这个题这么画确实最好看(
这个图太丑了,不妨考虑平移,得到下图,这个等价。
考虑终点 \((s,t)\) 关于 \(A\) 的对称点 \((s',t')\),不难发现碰到过 \(A\) 的折线跟 \((0,0)\) 到 \((s',t')\) 的路径形成双射,于是可以计数了。
然后我们考虑先到达 \(A\) 的解,不难发现其实就是上述转换后「总解数」-「先到达 \(B\) 的解」。
我们要考虑不碰到两条绿色线的方案数,容斥,答案是「总解数 \(\binom{2n+m+1}{n}\)」-「先碰到 \(A\) 的方案数」-「先碰到 \(B\) 的方案数」,先碰到 \(A\) 的方案数为 「走到 \((s',t')\) 的方案数」-「走到 \((s',t')\) 且碰到过 \(B\) 的方案数」,跟原本的题目本质相同,可以递归计算。
CF1870E
不妨设 \(f[i][j]\) 表示前 \(i\) 个数能否做出 \(j\),朴素转移要 \(O(n^3)\),无法通过此题,状态难以缩小,考虑优化转移。
对于 \(\text{mex}(l,r)=\text{mex}(l-1,r)\) 或者 \(\text{mex}(l,r)=\text{mex}(l,r-1)\) 的区间显然没什么考虑的必要,那我们只考虑 \(\text{mex}(l,r)\neq \text{mex}(l+1,r)\) 且 \(\text{mex}(l,r)\neq \text{mex}(l,r-1)\) 的区间 \((l,r)\),事实上,这种区间个数上界只有 \(2n\)。
对于一个左端点 \(l\),我们考虑其合法右端点 \(r\),首先不会有 \(a_l=a_r\),否则一定不满足条件,不妨设 \(a_l>a_r\),那么 \(a_l<a_r\) 同理,那么分析性质:因为 \(\text{mex}(l,r)\neq \text{mex}(l+1,r)\),所以 \(\text{mex}(l+1,r)=a_l\),差不多的,也有 \(\text{mex}(l+1,r-1)=a_r\),我们考虑 \((l,l+1/l+2/l+\dots)\) 的区间 \(\text{mex}\),这显然是单调不降的,然后合法的 \(r\) 的 \(\text{mex}\) 其实就是区间 \(\text{mex}\) 从 \(a_r\) 变成 \(a_l\) 的那个点,这种显然最多只有一个,于是总的也不是很多了嘛(
P4542
答案肯定可以拆成不超过 \(k\) 条链,这些链是覆盖所有点且每条链单调。我们考虑对一个拆分怎么计算答案,我们维护 \(d_i\) 表示走到 \(i\) 的最小答案,\(Ans\) 表示目前总的最小时间,我们按照排列顺序 \(0,\dots,n\) 更新答案,当前编号是 \(x\),那么 \(d_x=d_{x 的父亲}+x 跟父亲不经过 >x 的点的最短路\),个数从上面继承。
然后不难了,考虑用网络流解决,一个流对应一条链,首先 继承&必须走 不妨拆出双点,不妨按照下述方式建图:\(S\to L_0:k/0,L_i\to R_i:1/-\infty,L_i\to R_i:\infty/0,R_i\to T:\infty/0,R_i\to L_j:\infty,len_{i,j}\),最后一个显然要求 \(i<j\),于是做完了......?
P8860
首先对于一条边删除多次的显然只有第一次有效,我们把删除时间放在边上作为权,没有被删除的不妨随便钦定删除时间为 \(q+1,q+2,\dots\),这个其实是为了没有权值重复的好考虑一点。
直接做太困难了,倒流时间好像也做不了,但是确实可以离线,于是显然要求出最后保留的一条 \(1\to n\) 的路径,如果有多条,随便保留一条就可以了。
我们思考什么样的路径更优,最小值最大的最优,如果最小值一样,那就次小值最大的最优,这个显然可以最短路套主席树维护,主席树上面要维护一个二进制哈希,然后就做完了。
但是这个主席树重载太他妈傻逼了,比想象中难调些。其实也有简单做法,按照最终答案从小到大考虑,每次更新最小的那个,不难证明这是对的。
AGC006F
考虑将黑点 \((x,y)\) 看成边 \(x\to y\),加边相当于 \(x\to y\to z\) 贡献一个 \(z\to x\)。
不妨先考虑链怎么做,\(x\to y\to z\) 两两贡献一个,\(x\to y\to z\to k\) 这个 \(k\) 能跟 \(y,z\) 贡献,多玩一点不难发现,对于位置编号在模 \(3\) 意义下不同的两个点有贡献,不妨设模 \(3\) 为 \(0/1/2\) 的个数分别为 \(A/B/C\),贡献就是 \(AB+AC+BC\),这个结论可以推广到树上,只不过变成了相邻点给相邻权,进一步的,可以推广到带环的图上,要求是环长是 \(3\) 的倍数,特别的,如果剩余系里面少了某种点贡献是原本边数。
然后考虑环长不是 \(3\) 的倍数的环,比如 \(x\to y\to z\to k\to x\),手玩发现是全联通的,再考虑加入新的边,发现可以继续全联通,是一个 \(点数^2\) 的贡献。
所以染色然后计算贡献即可,注意算的时候需要及时处理反边。
CF1140F
不妨考虑建立二分图,一个联通块 \(l\) 个行 \(r\) 个列答案就是 \(\sum l\times r\),线段树分治即可。
CF277D
每次都被简单 01 背包弄急眼是为什么 /fad
首先 bf 是人生的真理,不难发现肯定先打完暴力再去打困难部分。因为先打困难部分再去打别的简单题罚时肯定会吃到,后打不一定会吃到。
然后考虑 dp,设 \(f[i][j]/g[i][j]\) 表示前 \(i\) 题用了 \(j\) 分钟的最大期望 / 最小罚时,不难写出转移 \(f[i][j]=\max\{f[i-1][j],f[i-1][j-s]+a,f[i-1][j-s-t]+a+(1-p)b\}\),\(g\) 分别是 \(g[i-1][j],g[i-1][j-s]+s,(g[i-1][j-s-t]+s)p+(1-p)j\)。
然后发现 \(g\) 的答案跟背包顺序相关,套路的写个价格比较的贪心就行了,转移可以写个结构体封装一下之类的。
AT_dp_v/CF543D
首先考虑计算 \(Ans_1\),是一个简单 dp,\(f[i]=\prod_{j 是 i 的儿子}(f[j]+1)\),然后考虑换根,显然 \(Ans[i]=\frac{Ans[fa]}{f[u]+1}f[u]\),但是这个 \(f[u]+1\) 可能没有逆元。
那么不妨考虑在每一位考虑一个 \(f+1\) 的前后缀积,每次再传入一个扣掉子树的答案作为参数,于是就做完了。
P7730
首先考虑差分,变成单点的操作,然后差分数组的正负放到二分图上面,然后操作表示流动即可。
P7863
这个飞行次数需要独立出来,我们不妨考虑拆链,我们考虑一个总的路线 \(S\to R_0\to L_1\to R_1\to \dots\to L_{m-1}\to R_{m-1}\to L_m\to S\),其中 \(S\to R_0,L_m\to s,L_i\to R_i\) 是跳跃,否则是飞行。
不难发现这个起点是用来搞笑的,我们直接把 \(L_m,R_0\) 分进一组,换句话说,使 \(R_m\gets R_0\)。然后在上面画上贡献,有 \(Ans=\sum_{i=1}^m h[L_i]-h[R_i]\),换句话说,其实就是链长之和(
这样怎么费用流其实都是好约束的,我们直接一点的考虑这个飞行次数最少,其实接两条链就少一次费用,于是考虑建出二分图做最大匹配,剩下都是简单东西(虽然好像上面也都是简单东西?)。
loj 535 花火
先求出逆序对,考虑最优的交换贡献,先翻转序列,把 \((x,a_x)\) 放在坐标轴上,不难发现要求的是以 \((i,a_i),(j,a_j)(i<j)\) 为左下/右上角的矩形中的点数的最大值,然后考虑乱搞,不难想到只有左下方没有点的点能作为左下角,右上方没有点的的点能作为右上角,考虑能作为左下角/右上角的点集为 \(L,R\),发现按照横坐标排序之后纵坐标单调,画一下发现交叉小于包含,具有决策单调性,于是可以做了。
P7599
先处理出 st 表,左边右边的到达点 \(lt_i,rt_i\)。
首先考虑单点 \(l\to r\),必要条件是 \(\max_{i=l}^{r-1} \{a_i\}<a_r\),手玩贪心不难发现尽量走大的,但是不能走超过 \(a_r\) 的。
拓展到序列,起点终点其实是不定的,不妨令 \(Y\gets \max_{i=c}^d\{a_i\}\),考虑把 \([a,b]\) 更新为其有解的区间 \([a',b]\),起点就是里面的 rmq。
注意到难以直接钦定终点,不妨令 \(Y\gets \max_{i=st}^{c-1}\{a_i\}\),我们先强制钦定 \(<Y\) 的随便跳,我们对结果分类讨论:如果 \(lt[x]\) 是不可愉悦的鸿沟,不断往右跳直到 \(>C\) 即可,否则下一位能跳到的较大值也得 \(\leq Y\),因为 \(>Y\) 的一定只能在左边,然后这种不超过两步就能跳到,做进去就行了,大段跳使用倍增实现,复杂度查询一个 \(\log\)。
AT_agc028_c
在机房还没想出来,去小卖部买了点抹茶面包就会做了(
首先这个边权和答案都取 \(\min\),所以边权的 \(\min\) 可以拆开不要,次数正确最小化答案就行了。
有贡献的点一定是 \(n\) 个,我们考虑原题目的其中 \(n\) 个点怎样才算合法。不妨令取的位为 \(1\) 否则为 \(0\),四种方案分别为 11/00/01/10
,不难发现 第一种&第二种个数相同,合法条件就是可以拼成环并且相邻位不能都为 \(1\)。
再来个小分讨:如果没有第一第二种,第三/第四种只能有一种,就是 \(\sum_{i=1}^{n}a_i,\sum_{i=1}^{n}b_i\) 是可以的,然后有第一第二种的话任意情况合法,可以考虑一下构造,拿出一个 11
,然后 10/01
直接接在 左/右,如果还有别的 11/00
,配对塞入即可,这些操作后得到的还是那个两边都是 \(1\) 的大串,最后再用初始的 11
所匹配的 00
接上环即可。
于是可以枚举一位强制选 11
,剩下的取前 \(n-2\) 大即可,维护可以写一个对顶堆状物的两个 multiset
。
AT_agc043_d
首先考虑 A,B,C
这样顺次是一段的,如果有前一个比后一个大,那么拿完前面之后会立即拿后面的那个,考虑最终序列,是由若干个长度为 \(1/2/3\) 的段组成的,段内单调下降,端头单调上升。
但是这个条件比较的不充分,比如说全都是 \(2\) 的其实不合法,首先 \(3\) 的个数与原题目一致其实无所谓的,那么就需要 \(1\) 的段数 \(>\) \(2\) 的段数,不妨用 \(f[i][j]\) 表示前 \(i\) 个数分成 \(\lceil 1 的段数\rfloor -\lceil 2 的段数\rfloor\) 为 \(j\) 的方案数,直接转移即可。
P5395
这个 \(\frac{1}{m!}\) 的盒子相同的贡献我们最后再乘进去。
题目求的答案就是恰好 \(0\) 个位置为空的方案数,不好直接求,考虑容斥,不妨令 \(f(k)/g(k)\) 为 恰好/钦定 \(k\) 个位置为 \(0\) 的方案数,那么显然有 \(g=(m-k)^n\binom{n}{k}\)。
其实显然还有 \(g(k)=\sum_{i=k}^{n}f(k)\binom{i}{k}\),反演可得 \(f(k)=\sum_{i=k}^{n}g(k)\binom{i}{k}(-1)^{i-k}\)。
然后带入 \(g\) 得到 \(Ans(m)=f(0)=\frac{1}{m!}\sum_{i=0}^{n}(-1)^i\binom{m}{i}(m-i)^n=\sum_{i=0}^{n}\frac{(-1)^i}{i!}\times \frac{(m-i)^n}{(m-i)!}\),卷积,使用 NTT 即可(
P4859
首先转化为恰好 \(k\gets \frac{n+k}{2}\) 组 \(a_i>b_i\),然后考虑钦定的贡献怎么求,之后二项式反演带进去就行了。
钦定 \(k\) 组的方案数考虑 dp,因为有偏序关系不妨使得 \(a\uparrow,b\uparrow\),令 \(L_i\) 表示比 \(a_i\) 小的 \(b_j\) 的个数,设 \(dp[i][j]\) 表示前 \(i\) 个钦定 \(j\) 组的方案数,不难得到 \(f[i][j]=f[i-1][j]+f[i-1][j-1]\times (L_i-j+1)\),然后就做完了。
P6478
套路的进行二项式反演,然后变成了求钦定 \(k\) 轮非平局的方案数,这个直接树形 dp 就行了,转移跟 P4859 差不多,只不过是要先拼一个背包再考虑贡献。
P4320
直接广义圆方树就行了。
CF1355F
就,晚上睡觉的时候突然会做了......?
因数个数 \(Ans=\prod_{x_i 为质数 p_i 的指数} (x_i+1)\),首先 \(>\sqrt {10^8}\) 质数只有 \(\times 1/\times 2\) 的贡献,题目限制那么宽松不妨先不考虑,我们筛出范围里面的质数来考虑。
往 \(p\in[\sqrt{\sqrt{n}},\sqrt{n}]\) 的 \(p\) 的数量去讨论的,这个次数其实也不是很多,并且跟更大的也有约束,然后发现其实只筛到 \(\sqrt{\sqrt{n}}\) 然后筛满的话,\(4Ans\) 这种东西就挺好的,但是还是不够,在一个分讨下面不行。
那个教主做法感觉比较不好写对,感觉这个 \(\gcd\) 的询问其实能得到的东西无法拓展,就是好像不太能直接得到什么很厉害的东西(
但是其实也不难改,随便筛一点 \(>\sqrt{\sqrt n}\) 的质数的话就对了吧,反正到了两次根号(\(纯素数积 + x 的不超过一次\))之后还有剩下来的次数刚刚好够(
我们考虑从小到大的素数,如果存在这个素数就考虑升次之后还有没有,不断这样考虑,每次尽量多询问,最后输出 \(2\times Ans\) 就可以通过了。
AGC006D
向无聊世界宣战!(
首先考虑二分,把 \(a\) 摊成 01
序列 \(b\),现在考虑头顶是不是 \(\geq mid\)。
自己打个标,发现一段的 010101
有一个金字塔的贡献且边缘颜色等于旁边颜色,于是我们考虑连续的 0/1
的位置贡献的最好值,注意特判掉一直 01
循环的情况。
CF354C
经典套路,跟 ARC068E 差不多,按照线段长度排序双指针即可。
但是这个题目不能数论分块,可以弄一点 \(n\log n\) 的枚举加一个小小的树状数组(