总结
两天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;
}