标签:
http://acm.fzu.edu.cn/problem.php?pid=2171
成段增减,区间求和.add累加更新的次数。
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <string> #include <algorithm> #include <string> #include <set> #include <functional> #include <numeric> #include <sstream> #include <stack> #include <map> #include <queue> #pragma comment(linker, "/STACK:102400000,102400000") #define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long #define inf 0x7f7f7f7f #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define L(x) (x) << 1 #define R(x) (x) << 1 | 1 #define MID(l, r) (l + r) >> 1 #define Min(x, y) (x) < (y) ? (x) : (y) #define Max(x, y) (x) < (y) ? (y) : (x) #define E(x) (1 << (x)) #define iabs(x) (x) < 0 ? -(x) : (x) #define OUT(x) printf("%I64d\n", x) #define lowbit(x) (x)&(-x) #define Read() freopen("a.txt", "r", stdin) #define Write() freopen("b.txt", "w", stdout); #define maxn 100010 #define mod 1000000007 using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int sum[maxn<<2]; int add[maxn<<2]; void PushUp(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void PushDown(int rt,int m) { if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=(m-(m>>1))*add[rt]; sum[rt<<1|1]+=(m>>1)*add[rt]; add[rt]=0; } } void build(int l,int r,int rt) { add[rt]=0; if(l==r) { scanf("%d",&sum[rt]); return; } int m=(l+r)>>1; build(lson); build(rson); PushUp(rt); } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R) { add[rt]+=c; sum[rt]+=c*(r-l+1); return; } PushDown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) update(L,R,c,lson); if(m<R) update(L,R,c,rson); PushUp(rt); } int query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { return sum[rt]; } PushDown(rt,r-l+1); int m=(l+r)>>1; int ret=0; if(L<=m) ret+=query(L,R,lson); if(m<R) ret+=query(L,R,rson); return ret; } int main() { // freopen("a.txt","r",stdin); int n,m,q; while(~scanf("%d%d%d",&n,&m,&q)) { build(1,n,1); int ans,x; while(q--) { scanf("%d",&x); ans=query(x,x+m-1,1,n,1); update(x,x+m-1,-1,1,n,1); printf("%d\n",ans); } } return 0; }
FZU Problem 2171 防守阵地 II (线段树区间更新模板题)
标签:
原文地址:http://www.cnblogs.com/nowandforever/p/4581490.html