2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛¶
排名 | 当场过题数 | 至今过题数 | 总题数 |
---|---|---|---|
35/3185 | 8 | 8 | 13 |
1001¶
solved by JLK
题意¶
签到,略
题解¶
1002¶
solved by YZW
题意¶
题解¶
1003¶
upsolved by
题意¶
题解¶
1004¶
upsolved by
题意¶
题解¶
1005¶
upsolved by
题意¶
题解¶
1006¶
solved by YZW
题意¶
题解¶
1007¶
solved by YZW
题意¶
题解¶
1008¶
solved by JLK&TYB
题意¶
定义\(v(l,r)=\max\limits_{l \le i \lt j \le r} \gcd(a_i,a_j)\)。给定一个\(n\)的排列,对于每个\(x\in [1,n]\),求出\(v(l,r)=x\)的\((l,r)\)对数。
\(2 \le n \le 10^5\)
题解¶
考虑一个点对的贡献。对于\(l \le i \lt j \le r\),一定有\(v(l,r)\ge\gcd(a_i,a_j)\)。而对所有\(\gcd(a_i,a_j)\)取\(\max\)就是\(v(l,r)\)。可以枚举一个数,然后看它的所有倍数,那么所有倍数里相邻的点对就有可能对包含它的区间产生贡献。假设\(x\)的两个位置相邻的倍数为\(a_p,a_q\)。那么可以把这个贡献挂在\(q\)上,相当于一个二元组\((p,x)\)。
枚举右端点\(r\),对于每个左端点\(l\),在我们上述处理之后,就相当于是对挂在\([1,r]\)的左右二元组,求出\(l \le p\)的\(\max(x)\)。对于所有把\(v(l,r)\)变成了区间取\(\max\)。
每个点对对不同左端点的贡献相当于一个单调栈,\(v(l,r)\)是随着左端点减小而单调不减的。如果暴力维护的话,可以每次重构单调栈,然后枚举左端点算每个\(v(l,r)\)。
先不考虑单调栈的维护,只考虑对答案的计算,那么单调栈实际上是把整个序列的贡献分成了若干段,而这些段并不是每次都改变的。可以记录一下每个二元组出现的时刻(即右端点),在被删除或者被覆盖一部分的时候通过现在的时刻,统计出这一段的贡献。
而单调栈的维护可以用一个set,每次删除的二元组一定是之前加入的,总共加入和删除的次数和总二元组次数同级。
\(O(n\log^2 n)\)
1009¶
upsolved by TYB
题意¶
签到
题解¶
略
1010¶
upsolved by
题意¶
题解¶
1011¶
solved by JLK
题意¶
打砖块大原题,好像没啥可写的。
题解¶
1012¶
solved by YZW
题意¶
题解¶
1013¶
upsolved by
题意¶
题解¶
记录¶
JLK签1001(0:06),TYB签1009(0:12)。
YZW做1012,WA一次后AC(0:40)。
JLK和TYB讨论1006,MLE了一次,又改做法,但是尝试很久没有特别好的做法。
期间YZW过了1002(1:10),1007(1:52,WA一次)。
然后YZW又过来把1006过了(2:30)。
JLK写1011,没处理好WA了两发后AC(3:20)。
然后TYB写1008。JLK和YZW看剩下几题,但都没什么思路。
还剩1h的时候YZW去1012抄板子。TYB遇到了做法上的问题,JLK修了,但是TYB不太会写,JLK接盘。
快结束的时候写完了1012和1008,但是一直交不上去。最后1008 AC(4:57),1012 RE。
总结¶
JLK:HDU OJ好烂啊
Dirt¶
F(-1)
G(-1)
K(-2)
L(-1)