标签:
线段树水题。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 100500 using namespace std; int n,a[maxn],m; int sum[maxn<<2][8],lazy[maxn<<2],tot=0,root,ls[maxn<<2],rs[maxn<<2]; int aa,bb,x; char type[5]; void pushup(int now) { for (int i=0;i<=6;i++) sum[now][i]=sum[ls[now]][i]+sum[rs[now]][i]; } void pushdown(int now) { if (lazy[now]==0) return; int regis[10]; for (int i=0;i<=6;i++) regis[i]=sum[ls[now]][i]; for (int i=0;i<=6;i++) sum[ls[now]][(i+lazy[now])%7]=regis[i]; for (int i=0;i<=6;i++) regis[i]=sum[rs[now]][i]; for (int i=0;i<=6;i++) sum[rs[now]][(i+lazy[now])%7]=regis[i]; lazy[ls[now]]+=lazy[now];lazy[rs[now]]+=lazy[now]; lazy[now]=0; } void build(int &now,int left,int right) { now=++tot;lazy[now]=0; if (left==right) { sum[now][a[left]%7]++; return; } int mid=(left+right)>>1; build(ls[now],left,mid); build(rs[now],mid+1,right); pushup(now); } void modify(int now,int left,int right,int l,int r,int x) { pushdown(now); if ((left==l) && (right==r)) { lazy[now]+=x; int regis[10]; for (int i=0;i<=6;i++) regis[i]=sum[now][i]; for (int i=0;i<=6;i++) sum[now][(i+x)%7]=regis[i]; return; } int mid=(left+right)>>1; if (r<=mid) modify(ls[now],left,mid,l,r,x); else if (l>=mid+1) modify(rs[now],mid+1,right,l,r,x); else { modify(ls[now],left,mid,l,mid,x); modify(rs[now],mid+1,right,mid+1,r,x); } pushup(now); } int ask(int now,int left,int right,int l,int r) { pushdown(now); if ((left==l) && (right==r)) return sum[now][0]; int mid=(left+right)>>1; if (r<=mid) return ask(ls[now],left,mid,l,r); else if (l>=mid+1) return ask(rs[now],mid+1,right,l,r); else return ask(ls[now],left,mid,l,mid)+ask(rs[now],mid+1,right,mid+1,r); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); build(root,1,n); scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%s",type); if (type[0]==‘a‘) { scanf("%d%d%d",&aa,&bb,&x); modify(root,1,n,aa,bb,x); } else { scanf("%d%d",&aa,&bb); printf("%d\n",ask(root,1,n,aa,bb)); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/ziliuziliu/p/5648364.html