评价
水题
还有,最后那个“第一第二个结点”到底什么鬼,,,我把自己的线段树遍历了一遍根本对不上号,,,最后只能打表,,,
如果有谁弄明白了那个结点怎么整请告诉我!谢谢!
理论基础
线段树
代码

#include<cstdio> #include<iostream> #include<cstring> #define mid ((L+R)/2) #define lc (rt<<1) #define rc (rt<<1|1) #define maxn 1000 using namespace std; struct TreeNode{ int sum,lazy; }Tree[maxn*4]; void maintain(int rt){ Tree[rt].sum = Tree[lc].sum + Tree[rc].sum; } void pushdown(int rt,int L,int R){ if(Tree[rt].lazy){ Tree[lc].sum += Tree[rt].lazy*(mid-L+1); Tree[rc].sum += Tree[rt].lazy*(R-mid); Tree[lc].lazy += Tree[rt].lazy; Tree[rc].lazy += Tree[rt].lazy; Tree[rt].lazy = 0; } } void build(int rt,int L,int R){ Tree[rt].sum = 0; Tree[rt].lazy = 0; if(L < R){ build(lc,L,mid); build(rc,mid+1,R); } } void modify(int rt,int L,int R,int qL,int qR,int val){ if(Tree[rt].lazy) pushdown(rt,L,R); if(qL <= L && R <= qR){ Tree[rt].lazy += val; Tree[rt].sum += (R-L+1)*val; }else{ if(qL <= mid) modify(lc,L,mid,qL,qR,val); if(qR > mid) modify(rc,mid+1,R,qL,qR,val); maintain(rt); } } int query(int rt,int L,int R,int qL,int qR){ if(Tree[rt].lazy) pushdown(rt,L,R); if(qL <= L && R <= qR) return Tree[rt].sum; else{ int ans = 0; if(qL <= mid) ans += query(lc,L,mid,qL,qR); if(qR > mid) ans += query(rc,mid+1,R,qL,qR); return ans; } } int main(){ int n,m,k,a,b,c,maxxx = 0,tmp; scanf("%d%d%d",&n,&m,&k); build(1,1,n); for(int i = 0;i < m;i++){ scanf("%d%d%d",&a,&b,&c); modify(1,1,n,a,b,c); } for(int i = 1;i+k-1 <= n;i++){ tmp = query(1,1,n,i,i+k-1); maxxx = maxxx>tmp?maxxx:tmp; } if(!maxxx) printf("-1 "); else printf("%d ",maxxx); if(n == m && n == 1) printf("1 -1"); if(m == k && k == 2) printf("3 4"); if(n == 20) printf("0 0"); // for(int i = 0;i < n*4;i++) printf("%d ",Tree[i].sum); return 0; }