标签:
虐狗大赛:
本来想让搞线段树和差分序列,结果数据太水暴力都能过
算了反正第一题就简单点吧
观察到询问很少,所以我们只需简化修改的时间复杂度
用另一棵线段树维护每个单身狗受攻击的次数
把减少攻击等价于增加生命即可,设次数为di,攻击为Ai,防御为Bi
则答案为Ai-Bi*di,这样做单次修改复杂度O(logn)
同时也由于询问很少,可以用差分序列代替线段树,单次时间复杂度O(1)
殉国:
题目大意:Ax+By=C,x>=0,y>=0,求x+y最大值,x+y最小值
x,y的解得个数
暴力算法1:枚举x,y更新O(N^2)20分
暴力算法2:枚举x,测试y是否符合情况,O(N) 40分-80分(原谅我数据太水)
很明显的扩展欧几里得
令gcd(A,B)=D;
Ax+By=C满足有解的必要条件是C mod D = 0
我们先解方程Ax+By=gcd(A,B),得到该方程一组解(p‘,q’)乘以C/D
即为原方程的一组解(p0,q0)
则任何(p,q)满足
p = p0 +B/D *t
q = q0–A/D *t(其中t为任意整数)都为原方程的解
我们解不等式p>=0&&q>=0得到关于t的一个区间[l,r]
(注意不等式的向下取整和向上取整)
则通解个数显然为r-l+1
最小最大解一定分别在l,r处取得(因为是线性方程)
时间复杂度O(logN)
燃灵之链:
K子序列最大和,由NOIP初赛的双子序列最大和改编而来
20分算法:O(2^n)的暴搜
70分算法:设状态f[i][k]表示前i个点含有k个子序列的最大值。
考虑动规:
设si=a1+a2+……ai
则显然
if(j!=i-1)f[i][k]=max(f[i][k],f[j][k-1]+s[i]-s[j+1]);(不相邻,开创一个新序列)
f[i][k]=max(f[i][k],f[j][k]);(j<i)
最终答案为f[N][K].
时间复杂度O(N^2*k)
100分算法:
膜蛤续命算法:
我们考虑本位是续命(延续上一个)还是开创一个新序列,我们设第i位不选的
为f[i][k][0],选为f[i][k][1]
则
f[i][k][0]=max(f[i-1][k][0],f[i-1][k][1]);//本位不选
f[i][k][1]=max(f[i-1][k-1][0]+a[i],f[i-1][k][1]+a[i]);//本位选,新子序列或延续上一位
时间复杂度为O(NK)
优化:
空间优化:滚动数组使空间复杂度下降为O(K)
时间常数优化:对于一个长度为L的序列,最多有(L+1)/2个子序列
所以k那一维的上限可以减小
所谓树链剖分只是一个玩笑。。。
标签:
原文地址:http://www.cnblogs.com/Satoshi/p/4919978.html