
差分
穷源溯流
路很长,尽管走便是。
-
原创 牛客练习赛77 小G的GCD(差分)
观察样例 2 ,可以发现答案为 (3+3+3),对于 k 的倍数:ak,其贡献到 (a+1)k 位置时改变,不由得想到差分的性质const int N=1e6+5; int n,m; int i,j,k; ll a[N];int main(){ while(~sdd(n,k)){ for(int i=k;i<=n;i+=k) a[i]=i; ll ans=0; for(int i=1;i<=n;i++) a[i]+=a[i-1]...2021-02-26 22:28:554
0
-
原创 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 Easy Equation(差分)
const int N=3e6+5; int n,m; int i,j,k; ll g[N],f[N];int main(){ int a,b,c,d; while(~sdd(a,b)){ sdd(c,d); for(int i=0;i<=a;i++) g[i]++,g[i+b+1]--; for(int i=1;i<=a+b;i++) g[i]+=g[i-1]; //i 为 x+y 的方案数 for(int i=0;i<=...2021-02-25 22:52:189
0
-
原创 洛谷 P2859 [USACO06FEB]Stall Reservations S(差分+贪心)
一道区间覆盖的题目,看起来挺水,但是也没那么简单我们可以利用差分将每一头牛的产奶时间在数组上表示,时间复杂度 O(1)这样可以计算出最多需要多少个棚子最后枚举所有奶牛所在的棚子的编号即可const int N=5e4+5; int i,j,k; int n,m; //int a[N]; struct Node { int id; int l,r; void read(){ sdd(l,r)...2021-01-16 20:27:2624
0
-
原创 洛谷 P4231 三步必杀(差分×2)
等差数列,用差分不用想差分数组 d 维护当前数值与前一数值的差值,两遍前缀和即可题目样例给的公差与首相是相同的,但是大部分情况是不同的,在尾项应直接减去本次操作所带来的所有影响const int N=1e7+5; int i,j,k; int n,m; ll d[N];int main(){ //IOS; while(~sdd(n,m)){ int l,r,s,e; for(int i=1;i&l...2020-12-19 14:26:4333
1
-
原创 洛谷 P3948 数据结构(差分+前缀和)
读懂了题意,题目没有说清楚 n 的取值范围,由于在线次数很少,离线次数过多,不得不考虑最后离线时利用 O(1) 的复杂度在线的时候暴力即可 ,复杂度 O(1000*n) const int N=1e5+5; int i,j,k; int n,m; int a[N]; ll d[N]; int mod,minn,maxx,final;void add(){ int l=read(),r=read(),w=read(...2020-12-15 22:53:5770
1
-
原创 洛谷 P1438 无聊的数列(线段树+差分)
一开始的时候也是没有思路,但是看到了考点里有差分对于区间更新:对 l 位置 +k 对区间 [l+1,r] +d 对 r+1 位置 -(k+(r-l)*d)那么单点查询变成了a[p]+sum[p](sum[p] 为差分的前缀和)当然要注意,在更新区间时,要判断 l+1 与 r 的大小关系,以及对 r+1 位置的更新时,可能涉及到第 n+1 个数,所以在建树过程中不妨多开一个点以下代码无建树过程,因为初始差分值为 0const int N=1e5+5;...2020-12-05 08:58:54102
0
-
原创 洛谷 P6812 「MCOI-02」Ancestor 先辈(线段树+差分)
题意不大清楚,不过就是判断所给区间 [l,r] 是否是个单调递增(非严格)序列判断区间 [l,r] 是否是一个单调递增序列,可得任意一个数 a[i]-a[i-1]>=0 所以考虑差分设 d[i] 为 a[i] 的差分数组,所以题目转化成要判断 (l,r] 区间上的差分数组 d 的最小值大于 0而且题目涉及区间更新,所以用树状数组,但是树状数组我不会怎么更新区间最小值所以题目成了线段树裸题,分块也应该可以const int N=1e6+5; int i,...2020-12-03 16:18:0862
0
-
原创 洛谷 P5026 Lycanthropy(差分×2)
题目看上去用差分应该不难,一开始的时候打算开两个数组来维护差值的前缀和与后缀和,但是考虑的情况很多,经过化简之后,可以只维护前缀和题意要搞清楚,要考虑到所有点,我就是因为当数组越界的时候不管,一直找不出错来为了防止数组下标是负数,数组从 -3*v 作为原点差分过后,一遍前缀和是点 x 与 x-1 的差值,所以需要再跑一遍前缀和const int N=1e6+5; int i,j,k; int n,m; int a[N]; int d[N&l...2020-12-03 11:40:03108
0
-
原创 洛谷 P2205 [USACO13JAN]Painting the Fence S(差分+思维)
可以利用差分的思想,在区间 [l,r] 的起点 l 处 col+1,在 r+1 处 col-1,这样再根据当前 col 的值与 k 值比较,可以发现当 col 刚刚被加至 =k 时,之后的区间才会对答案有贡献 当 col 刚刚被减至 <k 时,之前的区间会产生贡献 所有区间遍历完毕,col=0,即不会产生遍历完所有区间还有区间又贡献的情况最后要注意,题目中要求的涂块,而不是涂点const int N=1e5+5; int i,j,k; int n,m;...2020-11-30 10:43:13117
0
-
原创 洛谷 P2184 贪婪大陆(树状数组+差分)
题意不太明确,炸弹并不会覆盖区间根据差分的思维,在 [l,r] 区间内添加一枚炸弹,diff[l]++,diff[r+1]-- 查询区间内有多少颗炸弹时,需要遍历区间 [l,r] ,如果利用树状数组维护的话,复杂度会小很多const int N=1e5+5; int i,j,k; int n,m; int a[N]; int c[N][2];void add(int x,int k){ for(;x<=n;x+=lowbit...2020-11-29 10:48:45107
0
-
原创 洛谷 P1083 借教室(差分+二分)
一眼差分,被差分虐的太惨了题目知道用差分求解后比那的简单许多,区间大小为 1e6 ,利用二分枚举可以最多到第几天满足教室数目,所以答案就是 ans+1const int N=1e6+5; int i,j,k; int n,m; int a[N]; struct Node { int l,r,d; void read(){ sddd(d,l,r); } }seg[N]; int diff...2020-11-29 09:49:18107
0