【五校联考四】总结

今天上午终于把题切完了。这套题考的都是基础的东西,比较接近提高组难度。前三套都挺难,于是天天棍分。但这套突然就不用棍分了,要打正解,就被虐了,基础知识各种渣。

题目分析

T1:等比数列求和,用快速幂算逆元。多么简单粗暴的题啊,当时我一直在纠结模的加减运算会不会出错,然后花式化简……然后就跪了;
T2:01分数规划。这道题比较有意思,设sigma(a[i])/sigma(b[i])>=R,R为所求。即可得sigma(a[i])-R*sigma(b[i])>=0 >> sigma(a[i]-R*b[i])>=0,这时候就可以二分找出R,令c[i]=a[i]-r*b[i],r为枚举的值,把c[i]从大到小排序,若c[i]>=0则r为合法解(PS:初始值l=0,r=max(a[i]/b[i]));
T3:线段树维护区间和与区间平方和。修改过程的参数没有开long long于是答案少了一截,搭上了国庆假期前三天,一直在改……
T4:manacher。首先在字符串中插入一些奇怪的符号来解决回文串长度的奇偶性问题。然后令p[i]=第i个位置向两边延伸的回文串长度(包括i),然后记录右端位置最靠后的回文串的信息,假设当前枚举到第i个位置,若id+p[id]>i,则p[i]可以根据回文串的对称性获得一个初始值,这样就减少了搜索量,时间复杂度达到O(n);
T5:dfs。水题,略;
T6:欧拉函数。第一问答案为phi[i],第二问答案为phi[i]i/2。至于phi的求法,设pri为记录质数的数组,并单调递增,对于i,若i为质数,则phi[i]=i-1,否则 >> 当i%pri[j]==0,phi[k]=phi[i]*pri[j],然后break,当i%pri[j]!=0,phi[k]=phi[i](pri[j]-1);

基础知识的薄弱主要体现在T1,T2,T4,和T6上(几乎都有了)。

最后附上T6的核心代码(求phi):void pre(ll n)
{
int tot=0;
fr(i,2,n-1)
{
if (!kan[i])
{
pri[++tot]=i;
phi[i]=i-1;
}
fr(j,1,tot)
{
ll k=i*pri[j];
if (k>n) break;
kan[k]=1;
if (i%pri[j]==0)
{
phi[k]=phi[i]*pri[j];
break;
}
else phi[k]=phi[i]*(pri[j]-1);
}
}
return;
}

你可能感兴趣的:(模拟赛总结)