csp-s67总结
问题总结
前两道题一开始方向走错,无脑开想。
T2打两维导致不会优化
T1没有看出gcd的性质 T3没有打暴力
心态也有问题时间分配仍不均匀
T1
性质题推式子
发现原式子无法进行优化考虑式子成立的前提条件
推条件
gcd(a,b)!=1, 由辗转相减知gcd(a+b,b)=gcd(b,a)=1,gcd(a+b,a)=gcd(a,b)=1 - > gcd(a,b)=1,则gcd(a+b,ab)=1;
拆式子
设gcd(a,b)=x,a=nx,b=mx,则(a+b)=(n+m)x|nmx^2, 即 n+m|nmx, 由于gcd(a,b)=x,所以gcd(n,m)=1,由上述条件知gcd(n+m,nm)=1,
所以(n+m)|x。
想优化及含义
n+m|x,考虑这个式子能如何用来优化,一个不够上两个
n+m|x,x*(n+m)<=n,而要满足n+m|x -> x>=n+m
则推出n+m<=sqrt(n),n<=1e14,考虑枚举n+m算出答案
对于a+b=(n+m)*x,对于枚举的n+m找出合法的x即可,x合法需满足n+m|x,x*(n+m)<=n 即 x<=n/(n+m),n+m|x,
所以枚举i=n+m,x<=n/i,又因为n+m|x,对于取值范围内的x每i个合法一个总共n/i/i个
继续考虑i=n+m,合法的n,m可以有多少个这是只要满足n+m>1,n+m<=n,gcd(n,m)=1即可
gcd(n,m)=1,则gcd(n+m,m)=gcd(m,n)=1,即gcd(i,m)=1,合法的m即为i以内和i互质的数预处理欧拉函数即可。
T2
将方案数和长度dp拆开同时转移
第一问经典问题f[i]=max(f[i],f[j]+1) ( a[j]<a[i]&&j<i ) ,BIT即可O(nlogn)
g[i](方案数) =sigma(j=1->i-1, a[j]<a[i] ,f[j]=f[i]-1 ) g[j];
第二问可按f[i]为第一关键字,pos为第二关键字排序后用two-pointer双指针( 因为对于相同的f[i]来说位置单增,a[i]单调不升),将排序后
序列按照f分块 ,这时考虑用上一块转移下一块的g,那么f的限制就考虑到了由于排序我们破坏了原序列的相对位置所以要用一个pointer持续
插入持续更新来保证g[i]不算多,而a[i]单调不增,另一个pointer 即可维护a[i] .用一个变量sum即可更新g[i];
也可用二元组BIT由于暴力同时更新了f和g所以可以将f和g同时放入结构体赛进树状数组中,
对于每个c[i]存的是[i-lowbiti+1,i]的f 最大值以及这个区间中所有=f[i]的g[i]
动态更新即可
T3
暂鸽
总结:1.式子应先考虑其满足的前提条件并以此突破。
2.二维有时可以变一维。