虐狗大赛: 本来想让搞线段树和差分序列,结果数据太水暴力都能过 算了反正第一题就简单点吧 观察到询问很少,所以我们只需简化修改的时间复杂度 用另一棵线段树维护每个单身狗受攻击的次数 把减少攻击等价于增加生命即可,设次数为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那一维的上限可以减小 所谓树链剖分只是一个玩笑。。。
时间: 2024-10-13 15:22:49