标签:
#include<iostream> #include<cstdio> #include<cstring> #define maxn 100010 using namespace std; int n,m,num,a[maxn],tmp[maxn]; char s[100]; struct node { int l,r; int lc,rc; int s[7],bj; }t[maxn*2+100]; int init() { int x=0;char s;bool f=0;s=getchar(); while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=1;s=getchar();} while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();} if(f==1)return -x;return x; } void sum(int k) { for(int i=0;i<=6;i++) t[k].s[i]=t[t[k].lc].s[i]+t[t[k].rc].s[i]; } void down(int k,int p) { //int tmp[maxn]; //memset(tmp,0,sizeof(tmp));这玩意耗时间 会T for(int i=0;i<=6;i++) tmp[(i+p)%7]=t[k].s[i]; for(int i=0;i<=6;i++) t[k].s[i]=tmp[i]; } void update(int k) { down(t[k].lc,t[k].bj); down(t[k].rc,t[k].bj); t[t[k].lc].bj=t[k].bj+t[t[k].lc].bj; t[t[k].rc].bj=t[k].bj+t[t[k].rc].bj; t[k].bj=0; } void Build(int ll,int rr) { int k=++num; t[k].l=ll;t[k].r=rr; if(ll!=rr-1) { t[k].lc=num+1; Build(ll,(ll+rr)/2); t[k].rc=num+1; Build((ll+rr)/2,rr); sum(k); } else t[k].s[a[ll]]++; } void change(int k,int ll,int rr,int p) { if(ll<=t[k].l&&rr>=t[k].r) { t[k].bj=(t[k].bj+p)%7; down(k,p); return; } if(t[k].bj)update(k); int mid=(t[k].l+t[k].r)/2; if(ll<mid)change(t[k].lc,ll,rr,p); if(rr>mid)change(t[k].rc,ll,rr,p); sum(k); } int find(int k,int ll,int rr) { if(ll<=t[k].l&&rr>=t[k].r)return t[k].s[0]; int ans=0; if(t[k].bj)update(k); int mid=(t[k].l+t[k].r)/2; if(ll<mid)ans+=find(t[k].lc,ll,rr); if(rr>mid)ans+=find(t[k].rc,ll,rr); return ans; } int main() { n=init(); int x,y,z; for(int i=1;i<=n;i++) { x=init(); a[i]=x%7; } Build(1,1+n); m=init(); for(int i=1;i<=m;i++) { scanf("%s",s); if(s[0]==‘c‘) { x=init();y=init(); printf("%d\n",find(1,x,y+1)); } if(s[0]==‘a‘) { x=init();y=init();z=init(); change(1,x,y+1,z%7); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/yanlifneg/p/5498432.html