「考试」省选9

这场好诡异啊啥也不会。。

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\),求出这个点子树中奇/偶环返祖边的另一端的最浅深度。
然后就可以直接判断是否存在解了。

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条边,求每个点双中点编号的和
边数远多于点数,而且数据生成可以保证奇偶不相连,那么就奇偶两个点双,直接比较输出就行了。

posted @ 2020-01-16 20:15  Lrefrain  阅读(143)  评论(6编辑  收藏  举报