01.02 「数学一」
T1因为不会exlucas只拿了80
T2失智没想到异或FWT,后面的倍增求鬼畜数列前缀和了。
T3是个特别神的期望?的确是枚举最后一个拔掉的位置,然后区间dp
如何让区间dp方便地统计答案同时转移?当然是弄出一个优秀的状态定义了
(也就是只要和出题人想到一块就AC否则暴力滚粗)
定义区间右端点是区间最后一个拔掉的点,枚举倒数第二个
这样对于左右子区间来说,他们的右端点恰好也是他们中最后一个拔掉的,
于是可以直接借用他们的贡献来计算。
01.04 「数学二」
T1杜教筛全场切而我差点被卡常
T2神仙结论题,由于结论证明不了也理解不了,心情差到不想写代码
T3疯狂化柿子套FFT,太过丧心病狂,于是想打多项式多点求值
然后调不出来。
利用$val^{2ij}=val^{(i+j)^2-i^2-j^2}$
把巨型柿子变成若干次FFT
01.06 「数学三」
T1毒瘤dp,又是构造一堆函数...
其实本应该想到的,毕竟已经做过「最小生成树计数」,应该意识到在这个完全图里
代价最小的一组点要放在一个联通块内考虑/代价最大的边必定只出现一条(来沟通两个代价较小的联通块)
如果意识到这一点,就能想到把F函数递归解决,大概也会引入G函数
G到P的转化不是很好想,P数组在四维上的不断削减也不是很好想。
T2思维题
如果你也是打表之神,打表就行了
这道题是从特殊入手,即考虑一类特殊的数-出现循环节的数。
如果出现循环,那么把第二次/最后一次循环的开头顶到最前面,字典序一定小于X
所以答案只在不循环的数中产生,但是不循环的数也不一定符合要求
具体来说,循环同构的一组n位数,只有字典序最小的那个数才能成为X
所以问题变成了求多少内部没有循环但互相循环同构的等价类数
等价类计数?不不不把这个等价类数乘个n就变成数字数量了
然后就能用莫比乌斯函数枚举循环大小容斥求了,后边还要莫比乌斯反演和杜教筛就不是很思维了
T3要求的$ans=\sum\limits_{i=0}^{n-m}F(i)*((C_{n-i}^m)^2-(C_{n-i-1}^m)^2)$
组合数部分相似,设$A[n]=\sum\limits_{i=0}^{n-m} F(i)*C_{n=i}^m$
则$ans=A[n]-A[n-1]$,又发现A的求解是一个卷积形式
卷积就想到多项式,果然A也是一个次数为$O(m)$的多项式
那只要得到这个多项式足够的点值就行了,得到点值可以直接利用这个未展开的柿子
组合书递推求,只需要得到F足够的点值
然后给定的F点值是从0开始连续的又可以O(m)插值,于是解决。
01.10 「模拟四」
T1我猜暴力乱搞可以A,于是打了set优化暴力!
出分一看,黄的!
点进去,8分!(滑天下之大稽
发现锅了,只有合法情况下才让指针++,只要有一个不合法的就死循环了
欲哭无泪,开始魔改,这时DC上去讲他的乱搞暴力,我悲催地发现我俩思路差不多然后他AC了我T8..
改完一交,28!(?
仔细撕烤了三秒钟,发现没开double,用int算的1e16
改完一交,76!(泪
再乱搞几下,A了...
然后T3再把x替换成dfn[x]又加了20分,成赛后gtds了...
\泪 \泪 \泪
圆形没交!也就是说,对于一个横坐标,每个(半)圆形对应的纵坐标的相对大小不变!
而且从一个横坐标的视角来看,一个圆下方紧邻的另一个圆一定是它的兄弟或父亲
于是把一个圆拆成两个半圆,平衡树+扫描线在一个圆加入时找到他的父亲
T2一个大神题,赛后被扔了一脸的结论然后十分懵逼
首先飞一个玄学结论,只要求一段数的lcm就行了
然后再飞一个玄学构造,构造一个神仙数组
然后这个数组在扩展到下一个数的时候只需少量修改,可持久化数组预处理掉
T3 ?
01.11「模拟五」
T1友好的贪心
T2拉格朗日爆♂插(或者伯努利数)
背伯努利柿子:$$\sum\limits_{i=0}^n C_{n+1}^i B_i^-==0,B_0==1$$$$B_1^+=-B_1^-,B_i^+=B_i^-(i>1)$$$$\sum\limits_{i=0}^{n-1}i^k=\sum\limits_{i=0}^k C_{k+1}^iB_i^-n^{k+1-i}$$$$\sum\limits_{i=1}^{n}i^k=\sum\limits_{i=0}^k C_{k+1}^iB_i^+n^{k+1-i}$$
T3我们可以考虑在每个右端点产生的答案,然后用线段树可持久化一下就行了!
这个答案是如何产生的呢,当然是“新加入的字符形成的后缀在之前出现过”而产生的
也就是后缀自动机的fail树上祖先啦!
考虑插入第n个字符时,fail祖先上一个末尾位置在$P$的节点(越右越优)
设节点的len值最大为$L$(越长越优)
则当n作为右端点,$[1,P-L+1]$作为左端点时,答案一定不会小于L -----线段树区间对定值取max
当[P-L+1,P]作为左端点时,答案一定不会小于一个等差数列-----线段树区间对等差数列取max
后一种有点麻烦?可是公差永远都是-1,所以还是对一个数(首项)取max
于是暴力跳fail树,就能A啦!(雾)
这不是$O(n^2logn)$吗?
发现暴跳fail树和LCT的access操作很相似(完全一样)
于是LCT优化上述暴跳即可,复杂度就是LCT的复杂度
注意的问题:更新答案只用需要保留的部分,打标记之前先splay一下,复制节点之前保证标记已经下传
$$extra:skyh的头撑爆cnblogs祭$$
$$skyh的邪(qing)魅(mie)一笑$$
01.13 模拟6
简单场,能力不行,被干翻了
T1 根号维护信息+等比数列求和
几种简单根号算法:
按照信息量与根号n的关系分类,维护大点,暴力小点
启发式合并,一条边两端点较小的一方暴力,去维护较大的点
残量图上跑生成树,每棵树可以$O(1)$维护,那么跑出一片生成森林来就行了
根号?
小点信息量不超根号,暴力复杂度正确。大点数量不超根号,维护复杂度正确。
完全图时,每个点被合并$O(n)$次,复杂度$O(n^2)$,
可是边数为$m$时只能支持根号m大小的完全图,正确。
完全图时,每棵树大小$O(n)$,边数$O(n)$,森林中树数$O(n)$
可是只能支持根号m大小的完全图,复杂度正确。
本质都是将所有点按照一定依据分类,根据点的种类把要维护的信息分类,
提前维护或者现时暴力,最小化代价。
T2 sbdp,没想到贪心,T成暴力
T3 sbt,首先意识到一条lis和一条lds最多相交于一个点
则一条合法的lis保证f=路径上的点占用的lds数量<tot
可是tot太大了存不下,考虑模意义下存储,可是又没法比较大小了
但是模意义下任意两个不同的数一定有一个不等于tot,
所以对每个点维护两个不同的f的转移路径,然后从一个合法的往前跳就行了
注意事项:有个p的注意事项只要一直分类讨论直到变成一个sb就好了
01.14 模拟7
T1原题不会,凉了。
差分。区间操作变点操作。做一次,不会一次。
T2线段树or分块,整块$O(1)$,边缘暴力
代码难写,难死kx,劝退yxs。
T3强题
假设我们现在会60分
......
(以上略去了一万句yxs的口胡)
还是复读skyh大神吧。说错了请skyh神不要批判我。
康这个转移方程:$$f[i]=max(f[i],f[i-1]+contr(x))-(contr(x)=a_x*(i-1)+b_x)$$
$f[i]$一共两种来源,上一层不变地拿下来或者$f[i-1]$加上$x$的贡献。(贡献contribution)
然后什么也发现不了,60分滚粗了!可是生活还得过!
猜测存在一个分界点,前边全是一种,后边全是一种,打表发现正确。
证明:
设第x层处理完毕时$g[i]=f[i]-f[i-1]$,显然$g[i]>=contr(x,i)$
第x+1层更新时选择第二种来源,可推至$contr(x+1,i)>contr(x,i)$,
而因为$a_{x+1}>a_x$,
若$$contr(x+1,i)>contr(x,i)$$$$contr(x+1,i+1)>contr(x,i+1)$$
必然成立
又发现$f[i]=\sum\limits_{j=1}^i g[j]$,是不是维护一下$g$就行了!
事实证明是的,因为skyhA了每次二分找到$g[i]<=contr$的临界点,然后维护一下g就行了
具体来说,临界点前边是没变化的,临界点处插入了一个$contr(x,i)$,临界点之后的变化为:$$g'(i)=f'[i]-f'[i-1]=f[i]-f[i-1]+contr(x,i)-contr(x,i-1)=g(i)+a_x$$
支持查排名,动态加点,区间加法......仔细撕烤,最好是平横竖。
01.15 模拟8
成就「一天一考」get
T1一看名字就怂了,让我想起之前的某题
还要维护操作次数?不是很好做,打了30分走人了
其实也幸好没浪费太多时间,因为我不可能想到判0,写也白写
为什么没有尝试分块呢,如果尝试分块的话应该也能顺水推舟地想到一些处理办法的吧
试也白试因为我大概不会用暴力去对拍分块的一定找不到错
所以以后不要随便弃题多对拍,再次告诉自己。
很强的在线做法(某某秒切,还说很显然
分块,边缘暴力重构没什么好说的,怎么维护整块的标记
加法一定作用于所有元素,直接打上
取max只能作用于特定元素,也就是初始值小于某一个数的所有元素
那么根据加法标记平移一下映射到初始值的值域上,如果小于前一次的取max
那这一次没啥用,忽略掉;否则压栈
查询时,二分找到对应位置,然后在此基础上加上加法标记,
还可以根据找到的位置得知被操作了多少次,很强。
离线算法弃了
T2部分分很肥,但是最后只拿到了送温暖的13分
subtask2锅了没什么好说的
subtask3对拍出错误,改正后交的还是错误代码,没什么好说的
主要还是时间给了T3太匆忙了。
subtask1是出题人满满的善意,13分白送,subtask2可以bfs
考虑k是偶数,如果路径长度只有奇数那么达不到0,但是可以达到1
如果subtask2没锅,已经65了
进一步考虑,一条路径的最小代价不可能超过和k的gcd,至少可以一直刷
而这个猜想不够普遍,想的有点偏了。
考虑一个联通块,它能产生的路径长度一定是所有边的gcd的倍数
设g是所有边权和k的gcd
考虑遍历所有的边再回来,由于可以随意调整每条边经过的次数是2的几倍,
则答案可以不断地加上2*g来微调
如果k是g的奇数次倍,那么随便找一条路径不断加2*g一定能变成0
否则如果想变成0,必须满足找到的路径也是偶数次倍,找不到的话,答案只能是g
怎么找呢?其实并不关注边权的具体值,而只要知道除了g以后的奇偶就行了
如果g不能把他们的gcd中2的次数除尽,那显然只有偶数了
如果能除尽,由于其它的质数都是奇数,再除什么也影响不了奇偶性了。
所以先把2的次幂除尽,根据k来判断直接输出0还是输出染色情况。
T3网络流
过不了样例,萎了,只能状压了。(然后玄学乱搞,优化一下状压
不行有点虚,我还是只对n>15的测试点乱搞好了
然后莫名AC了?数据真水
我的乱搞是伪的,是根据瞎猜来优化对点的状压
从判断点集的合法可知,如果从有T指回S又到达T的边,一定不合法
于是非常弱智地认为点集分割一定是根据拓扑序来的,即在把拓扑序斩成两截
这是没什么问题的,可是拓扑序不唯一啊!又不能枚举所有的拓扑序,于是伪了
所以应该打网络流,get一个新trick
反向inf边强制不割有前后关系的两条边。
01.17
被提答大神和莫反大神虐翻了!
T1初始柿子都没列出来。
不然可能还能救
多除了,考虑gcd啊!
T2考试的时候以为自己A了,因为复杂度对的不行
然后喜闻乐见地WA0了
因为没有想到狠猪回来之前去的那头猪可以不在二分图里
T3神仙提答
改不动了,%一发DC叭
真没想过电脑能抗的住1e9个short的2G占用
01.18
仍然是被虐的一场
T1 爆零了,开心
T2 毒瘤动态dp,和另一种独立集覆盖集互化的写法,很好。
T3 仍然是神仙提答,多测不清空错失50分
01.19
T1暴力水到73,经过玄学负优化可以到80...
T2神仙字符串,暴力30
T3神仙偏序,暴力40,CE0
然而被骗了...T1正解是最难的
T3:不需要递归比较!前面的已经处理好了只需要直接平衡树比较排名就好了
T2:广义后缀自动机,fail树上线段树合并,相邻欧拉序可表示出所有的lca。
T1:
10pts:暴力跑背包$O(nk)$
30pts:考虑将背包状态压缩,对于一段数,它们还能乘上的数的上限都相同
因为一个$\lfloor \frac{k}{i} \rfloor$最多有$\sqrt{k}$种取值,所以状态数也是$\sqrt{k}$
$O(n\sqrt{k})$
40pts:考虑到10pts的暴力背包太傻了,考虑优化
考虑去重记个数,那么对于一堆相同的小数字可以枚举它的次幂,
由主定理易得枚举2及以上次幂的复杂度不会超过1次的复杂度,于是调和级数
$O(klnk)$
60pts:其实可以被30pts和40pts稳稳水过,毕竟它们能直接干到七八十分,但是考虑把它们拼起来进行优化。
对于n中大于$\sqrt{k}$的数,作为初态即可,反正它们最多出现一次
对于小于$\sqrt{k}$的数仍然枚举次幂,最多共$\sqrt{k}$个数,转移的状态也是$\sqrt{k}$
$O(k)$
100pts:洲阁筛
01.21
T1数据范围太小,可以枚举边三分一发
T2路径一定形如 在最短路中-不在最短路中-在最短路中
枚举两个分界点a,b,既满足不会枚举到最短路,也满足一定能枚举到次短路
然而直接枚举ab代价很大,注意到枚举了每一个点对,这种完全图可以用二进制分组来分批处理
T3太神仙了.
枚举每行最多放多少.至于是否合法可以在求出这种情况的最优解之后再去判断是否更新答案.
如何求出这种情况下,满足"每行每列相等"最多放多少
考虑假设全部焊接,用最小割求出最少放弃多少位置
设第i行可(必)焊接的位置数为hi,连边S->i(hi),无代价
同连边i+n->T(li),无代价
对于可能放置的位置,连边i->j+n(1),代价1,表示这个位置被放弃
对于i行被选中数量不超过指定数字的限制,连边i->i+n(lim),无代价
这样在跑费用流的时候会尽量跑无代价的边,保证了尽量多选
怎么保证i行和i列相等的,因为i行和i列的选中数量都是那条0边的流量,所以相等.
01.22
T1 仅仅是离散化之后模拟就行了
T2 以为可以不染...如果必须染的话n和m不会特别大,否则一定无解.数据范围小可以搜索
T3 exsam维护endpos,树剖
01.30
T1 基环树森林,相邻两边不可能同时选,所以两次断边变成树,然后是一种基础的树形dp
(dp用结构体实现真的不赖)
T2 ......哈希表
T3 设da<db,那么考虑枚举db二分最小的da,根据权值可以知道一对点"能否同在A(B)组"的限制
2-sat判断
01.31
T1 搞出一个欧拉回路来.则只需要照顾每个点的度数即可
考虑用什么边来照顾,考虑一个最小生成树,一条非树边必定大于树上被覆盖的边权之和
所以用树边调整,在树上dp即可
T2 随便扭扭,变成两个矩形
是个杨氏矩阵,用钩子定理
T3 过于神仙,看不懂题解...
把所有后缀最小值所在的位置放进集合S,那么S中的i属于i的前驱的奇偶性
不在S中的i属于i的奇偶性
0201
T1 首先可以考虑分块,预处理[1,1e6]所有的数在高位能提供的最大值为v时削成一个个位数
所需的最小步数以及剩下的这个个位数是谁
然后就可以O(1)消去1e6了
正解就是多分几块,每10倍分一块复杂度就极其优秀了
T2 直接sam?
T3 log次之后恒为1,k^2log的容斥dp
T4 转化成去掉尽量多的棋子然后最大流
0202
T1 化化式子,灵活运用增量法
T2 生成树可用于将nm暴力转化成n^2暴力
平面图断边等价于对偶图并查集连边,启发式分裂
T3 多次询问同一转移矩阵,向量乘矩阵降低复杂度
0203
T1 等价于生成树上全覆盖,选取关于时间的最大生成树即可
T2 神仙结论,求出最大段数和最小段数,只要介于两者之间的段数都能构造出来
T4 平衡树维护转移
T3 逐位进行矩阵树定理,权值和作为标志变量的幂次,插值求系数,i次项系数AI*(i%3)即为贡献
0204
T1 trie优化2-sat
T2 meetinmiddle,map优化
T3 二分答案,考虑合并,有sz[x]<=2min(sz[lc],sz[rc]),所以状态数nlog
T4 系数递推,考试没注意细节问题
0206
T1 墙很少
考虑x轴上方的每个士兵的视野,k堵墙遮挡了k个区间,合并相交区间
然后连接士兵与分界点获得直线,赋予1或-1的权值,存储在端点里
对于每个x轴下方的士兵,看不到的就是每个端点的前缀和,二分查询
T2 并不清楚
T3 有多少种本质不同的 子串的最小表示
考虑将后缀按照最小表示法的字典序排序
然而不用sa,而是直接sort并且自定义比较函数
可以通过一种神奇的hash方法来二分求出lcp
然后可以比较后一个字符第一次出现位置的先后来比较了
sort一个log,二分一个;log,线段树查询一个log
hash方法是(nexti-posi)*p^k
0207
T1 lct替换出现最早的边
T2 线段树交换节点
T3 不能明白
0208
T1 点减边,根号分治
T2 根据某一次观察可以得出不同红绿灯的开始时间yi之间的关系
并查集维护一下,如果哪次检验到一对关系在同一并查集里且不符合已有的关系
则可以通过这两个不同的关系推导出周期
T3分类讨论,左右互不到达:j<a[i]转移到k<b[i]
互相到达,j>=a[i]+b[i],j转移到j
左到右,j>=a[i]因为要按按钮,j<=a[i]+b[i]因为右不能到左,j转移到j-a[i]
右到左,j<a[i]转移到j+a[i]
0209
T1 公转就是重心转,然后神仙计算几何
T2 manacher,区间加等差数列.差分一下即可
T3 可以看做选一个位置对有收益,选一个位置有代价,选择了某一种类的位置要付出一份种类的代价
最大权闭合子图,位置向种类连个inf边
0212
T1 链和菊花占50分,我也只会这50分...
链一定在两端点上,(n-1)/2
菊花即为最大值+次大值的期望,那只需要求第k大的随机变量的期望
引入第n+1个随机变量,第k大的期望就是第n+1个变量排名<k的概率,由于各种排名概率相同
所以就是k/(n+1)
T2 神仙线代,并不是很清楚
考虑矩阵来做这个dp,处理前缀积和前缀的逆矩阵的积,可以做到q*52^3
挖掘性质,矩阵X和转移矩阵M相乘的结果是将第si列第j行变为这行的和
X和M^{-1}相乘的结果是将第si列第j行减去这一行其他位置上的数
每次修改的位置是52所以动态维护出来
以上的52其实是53因为新增一行一列表示空集
考虑怎么求最终的结果
由于H与Inv相乘后只保留第一行,其余位置都是0,所以查询时只需要Inv的第一行
H*Inv得到的行向量R再与A相乘,得到的行向量其实就是R的第i列的值乘上A的第i行的和
所得到的R',于是对于Inv只需要第一行,对于A只需要每行的和,数量都是O(n)的
具体怎么动态维护嘛,把询问离线排序总可以吧
T3
其实是个构造题,最优策略是任何时刻的局面只有1号点所在的scc>=1,其余都是散点
考虑dp[i][j]表示i条边形成了大小为j的scc的方案数,则只要i符合j的限制,就可以用前缀和转移一下
因为最后一次操作能形成[0,i-1]的新增大小
然后发现边数是否合法的判定条件不足,上界妥妥的是j点完全图+拓扑图
下界则还与"i已经变化了几次"有关,变化0次则一个简单环即可,变化i次则简单环内至少还有i条其他边
0214
T1
用二分图!先把二分图搞出来(没用的a删了)
区间互不包含,所以只要每段连续区间都满足霍尔定理即可
设A为删掉废物后的a[]的前缀和,B为已经确定的位置排名为i的区间取走石子数的前缀和
则任意i<j需要满足Arj-Ali>=Bj-Bi-1
移项变为Cj<=Di
按时间处理所有区间
考虑修改位置排名为t 的取走石子数量,[t,m]的C会发生变大,[t+1,m]的D会变大,两次增量相同
也就是说只要考虑[1,t]的D与[t,m]的C,区间查询最大值最小值可以得到最大的K了
T2 康不懂
T3 问题是求个最小环,满足包住所有的关键格子
发现结论,包住圆点到关键格子右下角点的最短路树,考虑怎样才能保证不跨过最短路树
每个点四周(分别在四个格子角上)放四个点,顺时针连权值为0的边,其余照旧
把跨越最短路边的边拆掉然后跑dijk
0218
T1 构造题,首先观察所有1的下标之和S在两种变换下的变化$$S+kx\equiv S'(mod n)$$$$S+1\equiv S'(mode n)$$
从而k和n必须互质,互质就有逆元,如果使s[i]的$\frac{i}{k},\frac{i+1}{k}...\frac{k+i-1}{k}$位置处为1
显然可以通过移位$\frac{1}{k}$来得到下一个,且$\frac{i}{k}+1=\frac{k+(i+1)-1}{k}$正好相等,无了
T2 如果知道顺序,倒着枚举贪心即可
顺序为,对每个串S找到最短的x满足x的循环串的字典序<S
S=x^a+b,按x升序且b降序排序即为顺序
过程大概是找到最小的x然后尽量多地选x,不能再选后想尽量地接上较小的串
而后一轮的x不一定比这一轮最小的b小,所以把最小的b留到最后
排序时要在b末尾加上一个字典序最大的字符,因为若b是b‘的前缀,用b'更好
T3 一种做法是,将母矿权值设为正无穷,目标变为收益最大时求最小代价
将{边的代价,儿子的收益}二元组排序,正收益在前,代价小在前
因为最优策略显然是,到达根节点x后按代价从小到大把有收益的子树全走一遍,而不关注收益多大或者有没有母矿
所以给结构体重载一个运算符,扔set(堆?)里依次拿出来用并查集合并一下即可
母矿价值inf,所以不用担心并不到根节点。
0219
T1考虑从前往后每次向已有的颜色序列里插入(或不插)一段新颜色$$f[i][j]=[i<n]*f[i-1][j]+\sum\limits_{k=0}^{j-1} f[i-1][k]*(k+1)$$
第一部分可以去掉,用一个组合数代替。
第二部分用生成函数搞,$\prod\limits_{i=2}^n (x+i)[x^{n-k}]$
分治fft可以做到nlog^2$$F_t(x)=\prod\limits_{i=1}^{2^t} (x+i+1)$$$$F_{t+1}(x)=F_t(x)*F_t(x+2^t)$$
然后右边用个卷积去求就不用递归算了,nlogn
T2 不懂
T3 polya,问题变为求将 n 个珠子中的 m 个变成金的,要求最长连续段不超过 k,同时首尾连续段长度之和也不超过 k 的方案数。
组合数容斥即可
0220
T1 跳转很少,而且不密集,所以很容易结束,所以迭代模拟。。
T2 反过来求所有情况下重复节点个数的和
枚举字符串集合来容斥,求出每个集合的lcp>=i的方案数即可
T3 观察到每个雷达的收益和高度的关系是个下凸函数,即要么不选要么选到最高
写出转移方程,第一个可以前缀最值+二分解决,第二个具有决策单调性。
而由于不止有第二个这一个转移,所以没法分治,要用弹队列的写法。
0220-0520由于在家过于颓废,咕咕咕
0520
T1 给定a[i]最少取几个使得异或和为c,保证能取到
考场脑残直接写个线性基,用线性基剩下的元素替代a[i]跑背包还以为自己挺对的
然而线性基中一个元素的产生可能与多个a[i]有关,所以完全扯皮
虽然数据范围5e5但是表算nlog^2
参考线性基的鸽巢原理,log+1个数中一定有一个数多余(可以被其他数表出)
所以最多用log个数,那么log轮fwt即可
T2 1e13 min25筛当场暴毙
一个科技是powerfulnumber求积性函数前缀和
https://www.cnblogs.com/zjp-shadow/p/11093242.html
大概思路是把积性函数拆成两个函数的卷积
具体怎么拆就靠猜,猜其中一个是什么
另一个可以归纳,这篇博客里的例题就是T2,讲的很清楚.
T3 预处理每个联通块单独的贡献然后状压合起来
只会数位dp然而好像有大神方法,并不清楚
0521
T1 化式子题,\sum i^2的前缀和可以通过立方差公式推导
考虑n2暴力,则点对之间的贡献可以分为两类,曼哈顿距离和拐弯到绝对值最小处再回返
然后需要列好式子分别计算.正解据说用了单调栈,并不清楚.
T2 有贪心策略,从现在开始向下行进一格的时间越短越好,大不了到了再等
可以O(n)找出每个点的最优策略,再O(n)就能找到循环节
T3 得到圆方树,就是做一个路径加.如果路径上有方点那么与之相邻的圆点都应该得到恰好一份权值
直接做的话,路径上方点加,圆点不动,两端点特判,查询时用父亲的加自己的
考虑变成树上差分,如果lca是圆点,正常操作就可以
如果是方点将导致这个方点的父亲本应被加一次却差分成了0,所以要把f[lca]处的-1
挪到f[f[lca]]
0523
T1 树剖打错了一点点,没意识到大样例很水所以没对拍,然后没分了
T2 考虑可行的移位大小a,必须满足对应位置的字符属于一个循环,这个可以哈希
还要满足在同一个循环的那些对应位置的字符,在环上的差距相等,这个也可以哈希
找到这样的位置之后可以列出26+1的同余方程,exgcd分别解出来,再暴力合并就行
T3 发现每个位置是否有S之外的质因子不重要,有S内因子多少次数也不重要
每个位置拥有的质因子之间也没关系,所以看出10*n个元素选或不选两种状态
每个元素自身有代价,某对元素归属不同有代价,最小割求费用,割断代表付出.
0525
T1 单点修改,区间求历史最大值是不可做的
区间修改,单点求历史最大值是可做的
怎么把单点和区间互相转化,放在二维上用kdtree做
T2 平移T序列很难,考虑将p=0时的前m个位置塞到权值线段树里
查询时平移[0,c)和[c,n)这两个区间即可
T3 看错题了,当场暴毙
考虑拆掉答案,求每个点被经过的期望次数*从这个点出发的期望代价
后者一遍dfs求出,前者发现对于n个点,i个1点,n-i个0点的一棵树,所有1点和所有0点的期望次数分别相同的
设val[i][j]表示i个1点时权值为j的点的期望经过次数
考虑每次选择,有1/n的概率命中并使得1的个数和j的状态发生改变,其余分成两部分概率,选到了其他0或其他1
列出方程来发现可以系数递推,然后细心地写下就行了(吧)
被教做人了! %牛%DC
为什么在边缘处要有一个特判,1/n有时不能加
因为经过的点数=实际走的路径条数+1
最后一个点是走不出去的,也可以理解成第一个点是空降的不是走过来的
所以必须从什么地方克扣一次1/n
0603
T1由$x^c\equiv m (mod n)$,$x\equiv m^{\frac{1}{c}} (mod n)$
由n=pq,phi(n)=(p-1)(q-1)
由c与phi(n)互质,exgcd即可求出$\frac{1}{c}(mod phi(n))$
那么问题就是分解n,pollard rho只有60分,考虑利用q-p<=3e5$$p(p+w)=n$$$$p=\frac{-w+\sqrt{w^2+4*n}}{2}$$
前60分,考虑到pq之间无素数且随机,则w很小不超过20,暴枚w来计算
100分,考虑枚举$\sqrt{w^2+4*n}$,开根后值增加1,开根前的值增加1e9左右,w^2才9e10,也就是变化次数不超过90,暴枚即可
T2 考虑如何check一个已有的序列是否有解$$\sum\limits_{i=1}^n x[i]==n*(n+1)/2$$ $$\sum\limits){i=1}^k x[i]>=k*(k+1)/2$$
排列看作n维向量,则满足上述第一个条件的向量一定在所有排列向量张成的n-1维空间内
(由于我不懂的原因)此时此向量可以由至多任意n个排列向量用n个正系数来表出
每次选取一个和序列对应位置数值大小排名相同的排列,二分一个最大的系数使得剩余部分仍然有解
不断去拟合即可,一定能在n个排列之内得到解
T3 k=3时,将所乘系数差分,每个差分值的权值都是前缀权值。$$min\limits_{i=2}^3\sum\limits_{j=1}^n k_j(S[i][j]-mid*S[1][j])>=0$$
绘制在不同k_j取值下,(S[2][j]-mid*S[1][j])-(S[3][j]-mid*S[1][j])的图像,得到n条射线,询问在射线上选点能不能组合出第一象限的点
可以转化成判断是否所有直线都在一个半平面内
0604
T1 傻逼线段树优化dp,我也是傻逼。
T2 首先最终装满的袋子数只和”选取了奇数次的颜色“数量有关
然后一个很简单但是就是没想到的O(nd)dp[i][j]表示前i个位置,有j个奇数次颜色的方案数
枚举每个位置放置的颜色是奇数还是偶数转移,没想到。
生成函数可以写成$\frac{e^x-e^{-x}}{2}$,但是由于表示成“恰好x个”不好算
表示成“至少x个”可以化成比较简单的形式,因为二项式展开后e的关于i的次数消没了。
然后一个卷积求至少,二项式反演求恰好
T3 转化成二维数点但是很难进行“区间历史[全0/全1]求和”的操作
但是可以考虑每次修改一个点将会导致哪些区间变为联通/不联通,每次减去/累加当前时间
最后询问的时候再累加/不累加询问的时间,就可以让每个位置的值都满足一个$\sum$“变为不联通时间-变为联通时间”的形式
也就维护出来了。二维区间加+单点查询可以转化成二位单点加+区间查询可以用cdq分治做到空间复杂度O(n),时间常数也比较小。
泰勒展开,应用于数学、物理领域,是一个用函数在某点的信息描述其附近取值的公式。
$$F(x)=\sum\limits_{i=0}^n \frac{F^{(i)}(x_0)(x-x_0)^i}{i!}$$
牛顿迭代,对于一个定义域是多项式的函数,求其零点。
设$f(B(x))\equiv 0 (mod x^n),f(B_0(x))\equiv 0 (mod x^{\frac{n}{2}})$
将$B(x)$在$B_0(x)$处泰勒展开得$$f(B(x))\equiv\sum\limits_{i=0}^n\frac{f^{(i)}(B_0(x)(B(x)-B_0(x))^i}{i!}\equiv 0(mod x^n)$$
由于$B(x)-B_0(x)\equiv 0(mod x^{\frac{n}{2}})$,$(B(x)-B_0(x))^2\equiv 0(mod x^n)$
故$0\equiv f(B_0(x))+f'(B_0(x))(B(x)-B_0(x)) (mod x^n)$,$B(x)\equiv B_0(x)-\frac{f(B_0(x))}{f'(B_0(x))}(mod x^n)$
然后发现需要解决的问题规模减半了,很多地方就可以用了。但是在设计f(B(x))时往往使用到逆运算,所以ln和exp不能互相调用
而开根的逆运算是乘法,所以不用考虑
0607
T1 神奇高维前缀和
$f[st][19]=dp[st],(d-1)dp[st]=d+\sum\limits_{i=1}^{18} f[st'][i]$
$f[st][i]=f[st][i+1]+f[st'][i]$
按dfs顺序把st依次搜出来然后转移即可
T2 神奇分类讨论
题解是递归做法,不如gods的分类讨论。
维护c表示手里的数量,v1表示目前手里有1个时可以回头拿到的数量,v2同样
认真分析目前扫到的地形,一个循环即可
T3 神奇单调性
首先猜测只会填-1和k,而且一定会选择整个序列
一个弱智做法是将问题变化为非负整数段的拼接问题,这样可以dp解决
dp[i][j]表示前i段放了j个负数(包括题目钦定的负数)
注意题目给出的负数位置必须断开,而且为了防止出现3个连续空隙(保证段间只能填一个-1或者给定)
要在题目给出的负数两边手动填上k,再来划分非负整数段。
猜测这个dp有决策单调性,强行发掘结果真的有,所以就可以玄学地用n2水过去了
更加有理有据的题解做法,状态定义变更为前i位填了j个-1(不包括给出的负数)
$dp[i][j]=min(max(dp[i0-1][j-(i0\%2==0)],sum(i0+1,i)))$
讨论max的取值,发现有单调性,分成两部分。
首先$i0%2==1$的情况只有一个转移来源,特别处理一下。对于更靠右的$i0%2==0$的位置
前部分只需要求最大$sum[i0]$,前缀和最值即可
后部分由于dp数组也是单调不减的,可以单调队列维护一下。
0608
T1 神奇题
显然可以$nlog^2$求出$nlog$个段对
有两种做法,一种是用线段树来哈希区间的并查集,二分第一个不同的位置暴力修改
然后启发式合并,每个至多被修改nlog次,线段树复杂度log,总之就是各种操作都不超过$nlog^2$啦。
第二种是神奇并查集,考虑维护log个并查集表示从x开始的长度为$2^i$的区间的并查集全部相等
对于找到的每个段对,可以用RMQ的方法拆成两个2的整次幂
如果在当前层没有在同一集合,就合并然后暴力递归下一层,否则就不用合了对吧
最多合nlog次,所以复杂度是对的,和萌萌哒有点像,但是萌萌哒是将merge层层下传,本题是沿路把已合并的情况记录下来。
T2 神奇题
假设边是有向的,方向为从小到大
假如知道最终的图,答案显然为每个点(n-出度)的连乘
考虑从小到大加入点i并且维护其所在联通块能到达的>i的点的数量
(这个联通快能到达的点,i都能到达)
set启发式合并,神奇在转化题意
T3 真·神奇题
神奇到只有牛才会
0612
T1 差分前缀和题
暴力四维前缀和就70
考虑容斥,由于nm-(n-1)m-n(m-1)+(n-1)(m-1)=1,只需用1x1的答案-1x2-2x1+2x2
考虑怎么求有多少矩形覆盖了某个1x1的矩形,还是考虑容斥
左上端点在(i,j)左上的矩形-右上端点在(i,j-1)左上的-左下端点在(i-1,j)左上的+右下端点在(i-1,j-1)左上的
(左端点在其左上的-一定在它左边的-一定在它上边的+一定在它左上的)
差分,差分,前缀和,前缀和
T2 莫队题
没想到可以把所有串首尾相接再莫队
这样每个位置代表一个trie树节点就可以快速更新了
链表是不可能链表的,出题人胆敢卡暴力分块
我就把块长调大5倍
另外奇偶性排序真是个好东西,%%%skyh教我
T3 板子题
保序回归求解上升问题模板题
考虑暴力切糕。
考虑好了吗,其实和切糕没啥关系
做法是,整体二分,对于权值区间[L,R]的中点mid
将vector内的点分为两类,初始<=mid和>mid
对于[1,mid],显然在切糕中[1,mid]的链上有一条权值为0的边,所以不用从S连,向T的边都缩成一条,流量设置为1
(mid,maxv]同理,向T的边不用连,从S引来一条流量为1的边
对于限制,和切糕差不多,若v[a]<=v[b],a--->b(inf)
然后跑这个网络,类似最大权闭合子图,最后每个点必定和S和T其中一个相连
若与S相连,说明向T的边割断,说明选择了将此点权值增大,分配给右分治区间
另一侧同理,跑完最大流后从S跑个bfs就能判了
证明:咕咕证啥啊背住得了
你若帮助别人AC,你自己也会很快AC
------Lrefrain
0613 被nc大神带着飞了
T1 简单题?
考试思路,枚举左下端点位置
$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x=1}^i\sum\limits_{y=1}^j[gcd(x,y)==1]C_{min((i-1)/x,(j-1)/y)}^{k-1}$
$\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{m-1}\sum\limits_{d=1}^i\mu(d)\sum\limits_{x=1}^{i/d}\sum\limits_{y=1}^{j/d}C_{min(i/xd,j/yd)}^{k-1}$
$\sum\limits_{d=1}^{n-1}\mu(d)\sum\limits_{i=0}^{n-1}\sum\limits_{x=1}^{i/d}\sum\limits_{j=0}^{m-1}\sum\limits_{y=1}^{j/d}C_{min(i/xd,j/yd)}^{k-1}$
对于一个d,$min(i/xd,j/yd)$只有$n/d$种取值,考虑每种取值有多少$i,x$或$j,y$的组合方案,做个后缀和就可以直接算
大概就这样,想了半天仍然需要对$1~n$每个数数论分块再前缀和,实现出来仅仅$n\sqrt{n}+nlog^2n$,被卡时卡空,跪了
正解思路,时空穿梭 的弱化版,枚举首尾向量之差,空位数量是各维取gcd,然后枚举gcd,后边变成了一堆等差数列相乘的形式
就比较好算了
T2 神仙题
30分倒是挺简单的一个dp
发现dp数组有单调性,并且所有方案都满足在每个dp值相同的连续段中都恰好选1个位置
以此为阶段dp,代价只与区间的中点位置有关,所以给中点的位置做一些前缀和处理
而且还有决策单调性,于是可以随便做了?当然一开始要把坐标倍长QWQ
T3 神人山是页
考虑一开始对于有交的区间[a,b],[c,d],a<c<b<d,把[a,b]变成[a,d]即最小扩充
然后变成了一个树形结构,以右链的长度做树形dp就无了
复杂度skyh会证(%%%),有点卡常
0704 终于有题解了
T1 考试的时候没怎么深入思考,总想着如何搞n^2dp拿50分,没有考虑无'?'的部分分
也没有想到从左到右两个两个加入转化成栈模型...
考虑从头开始两个两个分成一组,左侧仍未消除的部分看作一个栈
那么加入这一组有两种方法,直接压上去
或者先放下第一个,从栈顶开始融合,最后剩下一个元素再塞第二个
考虑没有‘?',只需从左到右扫一遍维护前i组能否凑出某种状态即可
状态f[i][x][y]定义为栈顶加入一个数x是否可以变成数y
计数的话考虑dp套dp,f[i][16]表示能凑出的状态集合的方案数
另一种定义,f[i][x][y]表示加入一个0会变成x,加入一个1会变成y的栈是否可以出现
T2 考试的时候脑抽狂写bitset,最后发现还是有n^2的部分不会优化暴毙了
dsu就行了
T3 首先第一个部分分就是查询有没有某个前缀异或和为x
分块trie树?这次可以用bitset了反倒想不到了是吧
一个性质,最多断成2^k段
理解了这个之后显然有一个$O(q\sqrt{n}2^k)$的dp
虽然要跑1e9但是加点剪枝4s还是够用的吧(雾)反正玄学过了。
0705
T1 考虑n2树p,考虑如何合并,
要做的其实就是给k个各种颜色的段,让合并成u个段满足没有同色的段相邻
先枚举有多少同色段相邻,再用可重集排列给合成一大段,再用组合数切开
这样正确性是没有问题的,因为强制合并的段不会再被切开
T2 只会高维前缀和,而且被教育应该先枚举维度再作和
T3 70分带模拟,满分ddt
0711
T1 两个区间的答案是$\sum\limits_{x on trie}min(times_1,times_2)$
四个指针跑莫队(?)或者用bitset,只不过还要分批做,仍然用莫队预处理每个询问涉及区间的bitset
但是这是两个指针的莫队了
T2 $x^k=\sum\limits_{i=0}^k x^{\underline{i}} \begin{Bmatrix}n\\m\end{Bmatrix}$
就是先选出有顺序的k棵树,其余部分任意的方案数
树的生成函数$T(n)=\sum\limits_{i=0}^{n} \frac{i^{i-2}}{i!}x^i$
任意无向图生成函数$G(n)=\sum\limits_{i=0}^n \frac{2^{C_n^2}}{i!}x^i$
即求$T(x)^kG(x)[x^n]$
T3 首先考虑$dp[i][j]$表示时刻i在节点j的最大收益
然后考虑$dp[i]$表示做完第i个任务的最大收益这样就脱离时间这一维限制了
然后由于从一个点到另一个点必定经过点分树上某一分治中心,把路径搬到点分树上维护信息..
0712
T1 最短路树爆干
注意图不联通的情况,有些节点dfn为0不判直接死了
T2 发现就是每个数只保留一些质因子集合得到的数的和
枚举得到的数答案为$\sum\limits_{i=1}^n i\sum\limits_{j=1}^{\lfloor\frac{n}{i}\rfloor}[gcd(i,j)==1]$
$\sum\limits_{ij<=n} i \sum\limits_{d|i,d|j} \mu(d)$
$\sum\limits_{d=1}^{\sqrt{n}} \mu(d) \sum\limits_{i=1}^{\lfloor\frac{n}{d^2}\rfloor}i\lfloor\frac{n}{id^2}\rfloor $
然后写了个程序算了一下暴枚d的复杂度好像还挺可过的样子
多去几个模法就能过了
T3 现在看来还是挺简单的吧
从小到大加边,状态为已有的点的集合划分
因为这样可以得到还可以在每个树联通内加多少边
如果目前加入非树边,必须加在树联通内
加入树边则只需枚举将哪两个集合merge
0718
T1 颜色是一段区间,那么考虑给颜色开个线段树,然后合并直接维护直径
用线段树分治就能只有加入了,也可以把<颜色,节点>pair离散化然后直接修改,一个log
T2 sg值就是子树最大深度
发现不论如何换根,一个节点只能有两种sg值,先跑一遍预处理出来
然后考虑线段树维护,子树,链修改就树剖搞一搞
设直径中点为R,考虑一开始从R开始跑预处理
则只有rt到R的路径上会取到第二种权值,其余都是向自己子树方向的那个权值
线段树上查询即可
T3 考虑势能函数
0719
T1 由于存在对应关系,当两串完全相同时答案为卡特兰数。
否则设dp[i][j]表示分别加入到i,j的合法颜色序列数,那么枚举ij结尾的lcs的长度乘上系数减去就行了
还可以dp套dp,状压第i次选取的字符是“只能用第1行”“只能用第2行”还是“都能用”,这样不会重。
T2 考虑如何check一个方案是否合法
也就是判断a-b能否被表示为k次多项式,考虑把原序列差分一次
那么若得到的a-b能表示为k次多项式,a'-b'必定能表示为(k-1)次多项式(二项式定理展没了)
而若a'-b'能表示为(k-1)次多项式,a-b也能表示为k次多项式(就是个积分)
那就差分k次,如果完全相同就可行。
那就求出差分k次的数组后kmp。
T3 一边搜一边跑kmp,卡不住(雾)其实是正解不会
0721
T1 考虑容斥,枚举钦定哪些位置必定为1,剩下可以任意
状态数爆炸,发现1的位置形成一些链,考虑预处理每个链长集合对应的方案数,状态数不爆炸。
预处理数组f[i][j]表示集合j能否凑成长度为i的链,搜出一个集合就把搜出的链数个数组卷起来,
不用枚举size,因为最后只需要全集,有交则无法到达全集
最后得到的是答案数组的&卷积,卷回去即可
T2 询问一个子串在所有本质不同的子串中出现的次数和
转化一下,在前边接一些字符,在后边接一些字符,能得到的串有多少在S中出现过
在前边接字符就是在fail树子树里。在后边能接什么字符只和endpos有关,也就是每个节点都是相同的。
预处理每个节点后边能接的字符的方案数,子树求和
T3 写出暴力dp,发现是卷积形式,考虑直接对着点值冲
移位则乘上$f(x)=x^{delta}$即可,最后用多项式除法还原系数数组
0722
T1 分治fft为啥我看不出来呢?
T2 枚举边枚举角度累加面积,这是暴力
考虑不枚举角度,而是用辛普森积分来算积分,点值可以转化成两点的某个角度射线右侧面积之差
T3 一坨$\sum$又一坨组合数,可以看成三维空间里,任意起点终点的路径数
坐标范围又特别小,可以在以坐标为状态dp来统计所有路径的和
然后去重搞搞就行了
0723
T1对每个m求$\sum\limits_{i=0}^n a_i\sum\limits_{j=0}^m (-1)^jC_m^jC_{n-m}^{i-j}$
法一,发现后面就是$(x-1)^m(x+1)^{n-m}=(x+1-2)^m(x+1)^{n-m}[x^i]$
法二,构造$b_i$使得$a_i=\sum\limits_{j=0}^i C_i^j b_j$则$b_j=\sum\limits_{j=0}^i C_i^j a_j(-1)^{j-i}$
然后就再枚举一个子集作为$b_i$,然后就能搞了
T2 每个栈都非空的情况很好做,一定形如111121111
否则枚举每条边再枚举栈中每个位置求出b[i][j][k]表示起点,终点,长度的极短路径的方案数
然后枚举每条边求出a[i][j][k]表示起点,终点,长度的前缀的方案数,后缀同理
那么所有路径形如aaaaabcccc
或者aaaabccccEaaaabccccc,E表示空边
疯狂dp即可
T3 考虑随便搞个生成树然后新建根节点在无限远处
然后让每个点都有一个流向根的流量,流出环的流量减去流入的流量等于环的大小
怎么算这个流量之差,枚举环的每一个点,若父亲在环外,加上这个点的sz
若某个儿子x在环外,减去这个儿子的sz。后者可以用角度前缀和处理
0725
T1 fft 字符串 匹配
T2 dp[i][j]表示以i为根的T2里,i所在的T1的二叉树的sz为j的子树答案max
然后直接转移复杂度n^2
T3 平衡树套trie树,如果排序就把trie树合并,如果位运算就给平衡树打标记
注意标记下传问题,split只下传上次排序前的,merge时下传上次排序后的,这样为了保证分离出的位置没问题
0726
T1 原题?还是不会
只有log种本质不同,每一层暴力dp,递归上来之后对称一下,n^2log
T2 分治,维护dp[2][2][]表示奇偶,最大/最小的dp数组,可以max卷积转移
发现分别是凸的,闵科夫司机核
T3 啥玩意
0727
T1 暴力可以碾过去?
考虑每次相当于是把已有的抬高delta的高度,必定产生的贡献可以在这一步直接计算
那么只增不减,第二维只开D就够了
T2 考虑怎么求$f(i)$表示q次操作后有i个位置被操作奇数次的方案数
$f(i)=q![x^q](\frac{e^x-e^{-x}}{2})^i(\frac{e^x+e^{-x}}{2})^{n-i}$
$=q!2^{-n}[x^q]\sum\limits_{j=0}^i\sum\limits_{k=0}^{n-i}(-1)^{n-j-k}C_i^jC_{n-i}^ke^{(2j+2k-n)x}$
然后不是很好化,因为有两个变量j和k
但是skyh会化 但是他又不会了
那就想办法去掉一个变量,可以求另一个数组$g(i)$表示q次操作后至少有i个位置为奇数次
这样$(\frac{e^x-e^{-x}}{2})^{n-i}$就变成了$e^{(n-i)x}$的样子就能算了
最后只需再二项式反演回去
T3 平衡树预处理出插入的位置就可以带修莫队碾过去了
还有更帅也更难写的三维偏序树状数组?
0729
T1 分两部分,第一部分分摊给每条边,第二部分枚举直径加点
T2 nim积意义下的行列式,因为在费马数内是封闭的所以满足类似费马小定理(?)所以可以求逆元
T3 先手获胜=1号点不在直径中点,直接长剖,打乘法懒标记
0730
T1 考虑每条边可得n^3,考虑预处理可得n^2
T2 考虑倍长后变成保留一个子串,在相邻字符相同处断开,考虑每一段则只需关注首尾字符不同
若某个长度不合法等价于任意两个相距d的字符都相同,hash或kmp判断即可
T3 原题,结论,一定经过中间的十字
单调栈
0731
T1 考虑在一段连续的区域上,这段区域左侧的取到最大值的位置和右侧取到最大值的位置保持不变
考虑有多少极长的这样的区域,猜测这些区域的数量是$O(n)$的
要说明这件事则只需说明“左侧取到最大值位置不变的极长连续区域数量是$O(n)$的”
考虑从左到右枚举每个点并用单调栈维护一个凸包,
那么可以发现某个位置$p$在左侧取到最大值的位置是$(L,R-L)---(p,0)$这条直线切凸包切到的位置
那么每次加入第i+1个点前,给$[pos_i,pos_{i+1}]$区间给划分一下,根据凸包能求出所有的左侧最优不变的区间
容易发现若$[l1,r1]$的左侧最优为$x$,且$r1<pos_{i+1}$,那么x可以从单调栈中删去了此后再也不会成为最优
所以$O(n)$了...跑两遍单调栈把所有区间搞出来,每个区间都有左侧最优和右侧最优,两者比较再取最优~
T2 最小顶标和,对偶一下,最大权匹配
然后spfa费用流常数写小一点就过了。
极稠密的图,邻接矩阵存边很快
T3 码农题,自闭了
0802
T1 构造一个图,使其以n为根的内向生成树的数目为一定值$C\in[0,1e18]$
方法一,
可以发现一定有一边的点全通过红边跳到根,另一边全通过黑边跳到根
对于每一个分界线,都是一个2的次幂
然而为了保证边数,这些次幂的次数必须是连续的
而且在黑链从底到上是递增的,我只需要构造一堆次幂满足他们从1开始连续,并且相加等于C,而且总数没有很多就行了
1 for(int i=0;i<=60;++i) if(C>=(1ll<<i)) C-=1ll<<i,++num[i];
2 for(int i=60;~i;--i) if(C&(1ll<<i)) C^=1ll<<i,++num[i];
方法二,
以10为例,看图,若1通过连向3点到达根,则编号位于(1,3)的所有点每个点都有2^1种情况
贡献为2^1,而编号>3的节点不能再通过1绕行,也就是到根节点的路径唯一,所以不同的2的次幂是简单相加的关系
直接按照每一位做即可,两种做法都是$O(log)$,但是方法二常数更优秀
T2 原来只需要打一个懒标记就行了啊?
我特么傻比?
T3 ...
考虑如下问题,用n种颜色共m个点$(\sum tot_i==m)$给序列染色,一个序列的权值为所有极长同色段长度的阶乘的逆元的积,求所有序列的权值和$$ans=\sum\limits_{a[]<=tot[]} \prod\limits_{i=1}^n f(tot_i,a_i) \sum\limits_{c[]<=a[]} (\sum c_i)! \prod\limits_{i=1}^n (-1)^{a_i-c_i}C_{a_i-1}^{a_i-c_i}\frac{1}{c_i!}$$
其中$f(a,b)$为a个物品划分为b个集合的贡献之和
发现可以根据$\sum c_i$来统计答案?$$ans=\sum\limits_{c[]<=tot[]} (\sum c_i)! \sum\limits_{c[]<=a[]<=tot[]} \prod\limits_{i=1}^n f(tot_i,a_i)*(-1)^{a_i-c_i}*\frac{(a_i-1)!}{(a_i-c_i)!(c_i-1)!c_i!}$$
那么设生成函数$$F_i(x)=\sum\limits_{j=1}^{tot_i} x^j \sum\limits_{a_i=j}^{tot_i} (f(tot_i,a_i)*(-1)^{a_i}*(a_i-1)!)*(\frac{1}{(a_i-j)!})*((-1)^{j}*\frac{1}{(j-1)!(j)!})$$$$ans=\sum\limits_{i=1}^{sum} i! (\prod\limits_{k=1}^n F(k))[x^i]$$
发现如果$f(tot_i,a_i)$已知,$F_i(x)$只需一次$a_i$和$a_i-j$的卷积即可求出,考虑如何求$f(tot_i,a_i)$ $$f(tot_i,a_i)=[x^{tot_i}](e^x-1)^{a_i}$$$$f(tot_i,a_i)=[x^{tot_i}]\sum\limits_{j=0}^{a_i}C_{a_i}^j(-1)^{a_i-j}e^{jx}$$$$f(tot_i,a_i)=\sum\limits_{j=0}^{a_i} C_{a_i}^j(-1)^{a_i-j}\frac{j^{tot_i}}{tot_i!}$$
一次$j$和$a_i-j$的卷积即可
考虑原问题,即首尾相接后再算权值
考虑统计把每个环在某一个颜色1的段的边界处断开来统计,那么对应到序列上即为“第一个段的颜色为1且最后一个段的颜色不为1”的答案G
先考虑如何求G,钦定一个颜色段的位置相当于从原来的可重排列中拿出了一个颜色为1的段,使其不再参与排列,但是其仍算在$c_1$和$a_1$中
所以...把1的生成函数向低位平移一下就行了?其实就是想实现$\frac{(\sum c_i)!}{\prod c_i!} to \frac{(\sum c_i-1)!}{(c_1-1)!\prod_{i>1}c_i!}$的效果...
1 void mv(vec &x){
2 if(!x.size()) return;
3 for(int i=0;i<x.size();++i) x[i]=1ll*x[i]*fac[i]%mod;
4 for(int i=0;i+1<x.size();++i) x[i]=x[i+1]; x.pop_back();
5 for(int i=0;i<x.size();++i) x[i]=1ll*x[i]*inv[i]%mod;
6 }
现在能够一个合法序列的G,那么旋转m次都会对应一个环,但是一个环会被$a_1$个序列对应(注意不是$c_1$也不是$tot_1$)
所以这个序列的贡献为$G*m*\frac{1}{a_1}$,所以在求颜色1的生成函数的时候需要额外带上$\frac{1}{a_i}$的系数...
来源:oschina
链接:https://my.oschina.net/u/4275057/blog/4467563