码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 4919 线段树练习4

时间:2016-07-06 23:16:51      阅读:416      评论:0      收藏:0      [点我收藏+]

标签:

线段树水题。
#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; }

 

codevs 4919 线段树练习4

标签:

原文地址:http://www.cnblogs.com/ziliuziliu/p/5648364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!