五校联考4总结

来源:互联网 发布:网络改变生活 编辑:程序博客网 时间:2024/04/30 21:55

总结

两天6道题,给虐到190分……
Tsinsen是什么/bi:/oj?卡了一天毫无动静。

day1:

比赛在晚上,精神状态不佳。粗略地看完题感觉都有想法。第一题水逆元+快速幂;第二题贪心;第三题线段树维护。
很快打完了第一题,做了几个数据好像都没错,于是搁置一边。
第二题很有想头,我决定着手研究第二题。
一开始想法是按a[i]/b[i]从大到小排序,贪心选取最大的k个。可是五校联考的题怎么可能这么水呢?
出了几个数据,我猛然发现贪心是错的!!
后来又有好几个想法,都不通。无奈上暴力。
30+30+0=60

day2:

睡了一觉精神好多了。
第一题竟然是字符串回文。可是一看范围,len<=5*(1e6),顿时茫然。我记得GDKOI2014DAY1第一题也是回文串,用到了一个神奇的名叫Manacher的算法。可惜我早已忘记怎么打。
第二题是一只披着狼皮的羊,我没有深思,如此BigWater竟然让我无从下手。
第三题看完题目心中一惊:这不就是欧拉函数吗?第一问phi(n)第二问n*phi(n)/2。
重新看一遍,果然没错。数论知识终于能大显身手了。真是应了一句古话:

不懂数论吃亏啊!
不懂数论吃亏啊!
不懂数论吃亏啊!

于是乎O(T√n)完美解决。
30+0+100=130

题目分类

水题:

【五校联考4day1】学习神技

题意为等比数列求和,逆元+快速幂轻松解决。然而计算模的时候漏打了一个mo,光荣30分。

【五校联考4day2】神界古树

这种大水竟然没发现,真是/bi:/了。
题目所求即为树的重心。
sum[v]记录其节点最多的子树的节点数。每递归到一个点保存max(sum[v])并与ans取最小值。

好题:

【五校联考4day1】寻找神格

题意:
给定一段序列,支持以下操作:
1.单点修改
2.区间修改(貌似并没有什么区别)
3.区间查询总和或方差

方差是什么鬼?
一段序列的方差计算公式:
[(a1-t)²+(a2-t)²+…+(an-t)²]/n,
其中 n为序列的长度, t=(a1+a2+…+an)/n
展开可得
[a1²+a2²+…+an²+nt²-2t(a1+a2+…+an)]/n
令sum1=a1+a2+…+an, sum2=a1²+a2²+…+an²,
上面的式子就化成了
(sum2+2*sum1/n*sum1)/n

sum2/n+2*sqr(sum1)/sqr(n)
我们发现上式只用到了区间和与区间平方和,因此只要记录这两个值就能算出方差。用线段树维护。打起来比较恶心,但不长。注意精度问题。

【五校联考4day2】数学之神

第一问不讲了。
第二问是所有满足欧拉函数的条件的数的总和。
问题即为所有满足gcd(n,i)=1的i的和。
而我们有若gcd(n,i)=1,则gcd(n,n-i)=1.
此时i与n-i都要算入答案中,i+n-i=n.共有phi(n)/2对这样的整数
所以总和为n*phi(n)/2

【五校联考4day2】神族文字

枚举中间点向两端扩展30分,Manacher 100分。
神奇的Manacher能以O(n)的神时间复杂度解决最长回文串的问题。

神题

【五校联考4day1】淬炼神体

这次的题都跟神有关啊,神题降临。
正解01分数规划,用二分实现。
代码:

while(r-l>1e-5){        double mid=(l+r)/2,ans=0;        for(int i=1;i<=n;i++) c[i]=a[i]-mid*b[i];        sort(c+1,c+n+1);        for(int i=n-k+1;i<=n;i++) ans+=c[i];        if(ans>0) l=mid;        else                  r=mid;}
1 0