这场好诡异啊啥也不会。。spa
T1
很厉害的虚树\(dp\)。虽然是抄的cf。Upd:话说题面里的syx是sigongzi吗?全是我在乎淫。
考虑化一下式子。
两个点之间的贡献是:
\[\varphi(ab)dis(a,b)=\frac{gcd(a,b)\varphi(a)\varphi(b)}{\varphi(gcd(a,b))}(dep_a+dep_b-2dep_{lca})\]
而后尝试枚举这个\(gcd\),设为\(d\)。
但是发现直接找\(gcd(a,b)=d\)的不是很好找,可是\(d|gcd(a,b)\)的很好找。
那么咱们设\(g(n)\)为\(n|gcd(a,b)\)的贡献,\(f(n)\)为\(n=gcd(a,b)\)的贡献。
这样就有:
\[g(n)=\sum\limits_{n|d}f(d)\]
莫比乌斯反演获得:
\[f(n)=\sum\limits_{n|d}\mu(\frac{d}{n})g(d)\]
如今考虑求\(g(d)\)。
列出公式:
\[g(d)=\sum\limits_{d|w_x}\sum\limits_{d|w_y}\varphi(w_x)\varphi(w_y)(dep_x+dep_y-2dep_{lca(x,y)})\]
拆一下:
\[g(d)=\sum\limits_{d|w_x}\sum\limits_{d|w_y}\varphi(w_x)\varphi(w_y)dep_x+\sum\limits_{d|w_x}\sum\limits_{d|w_y}\varphi(w_x)\varphi(w_y)dep_y-2\sum\limits_{d|w_x}\sum\limits_{d|w_y}\varphi(w_x)\varphi(w_y)dep_{lca(x,y)}\]
这样咱们作一次树型\(dp\),维护一下每一个点子树中的\(\varphi\)和\(dep\varphi\)的和,而后就能够线性的用子树合并统计答案了。
而后发现要作\(n\)次\(dp\),每次都作所有的点复杂度过高了。
发现只和关键点有关,直接建虚树\(dp\)就能够了。
笑神写了启发式合并。并不会。指针
T2
也是很不错的题不过两天的T2彷佛都和结论题同样。
咱们发现若是多是\(yes\),那么必然有一只猪存在于所有的三元组中,设它为\(p\)。
而后咱们必然是将这只猪先运过去,而后某时间运回来,而后在最后再运回去。
考虑中间运回来这一次,以前的一只是\(i\),以后的一只是\(j\)。
那么在不考虑这三个点的状况下若是剩下的点三元组中的其余两个建边以后是二分图就是\(yes\)咯。
由于\(p\)回来以前那次对岸可能打架,回来以后本岸可能打架,可是这些可能打架的时间中,\(i\),\(j\)全都在河中间,因此无需考虑。
而后复杂度仍是不对。
考虑枚举\(i\),而后作到线性判断是否存在某个点可使得这个点消失以后不存在任何奇环。
这个点须要通过全部奇环,而且他的全部儿子的子树中没有一个奇环和一个偶环跨过他到他的祖先。
第一个条件对于全部奇环树上差分,判断这个点是否通过了所有的奇环。
而对于第二个条件进行\(dp\),求出这个点子树中奇/偶环返祖边的另外一端的最浅深度。
而后就能够直接判断是否存在解了。blog
T3 NPIO
传上来了能够下载:https://files.cnblogs.com/files/Lrefrain/npio.zip
十个点好恶心啊,打开就发现全是1e9靠。
1.\(a+b\ problem\)。
先运行一次获得\(b\)序列的初始值,而后直接在本身程序里跑就好了。
2.1000w长度卷积
\(NTT\)作不了,最多作800w,\(FFT\)一下就好了,由于值域很小能够直接\(long\ double\)。
3.1e9长度卷积
由于值域很小因此存在循环节,那么按照循环节来跑出来长度\(2n\)的卷积累,剩下的直接分别计算贡献就好了。
4.个数1e9值域1e9的排序
确定不能直接\(sort\),因为数据随意,咱们能够认为数据足够离散,这样开1e9个char当桶就够了。
5.大小1e9的树求每一个点的子树大小
首先他给出的\(father\)是模出来的,咱们先跑出最终结果,而后用逆元倒推回去就能够获得每一个点的\(father\)就好了,而后\(sz\)用\(int\)存不下,就大于270000000的部分\(sz\)很小用\(short\),剩下的用\(int\)就好了。
6.大小1e9的基环树求最小生成树边权和
先加和所有边权,而后发现值域很小,直接枚举撤掉哪一个权值的边而后和给出的样例对拍便可。
7.1e9次操做,支持动态插入,动态查询最大值,动态删除最大值
指望状况下堆的大小是0,直接用堆干就好了。
8.1e9次操做,支持动态插入,动态查询中位数
联赛前玩过的套路,维护一个中位数指针,随机状况下并不会移动不少次。
9.1e9个数,动态插入,动态维护出现过的数的个数
直接bitset暴力就好了
10.1e8个点,1e9条边,求每一个点双中点编号的和
边数远多于点数,并且数据生成能够保证奇偶不相连,那么就奇偶两个点双,直接比较输出就好了。排序