| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:AC代码In Reply To:AC代码 Posted by:ACINE at 2018-02-27 19:45:20 > #include<cstdio> > #include<iostream> > > #define N 100000 > #define ll long long > > using namespace std; > > char ord; > int n,q; > ll A[N+10]; > > struct node > { > int l,r; > ll sum; > ll val; > }date[6*N]; > > void init(int root,int l,int r) > { > date[root].l=l; > date[root].r=r; > > if(l==r) { > > date[root].sum=A[l]; > > return; > } > > int mid=(l+r)>>1; > > init(root*2,l,mid); > init(root*2+1,mid+1,r); > > date[root].sum=date[root*2].sum+date[root*2+1].sum; > } > > void update(int root,int a,int b,ll c) > { > if(date[root].val!=0) { > > date[root*2].val+=date[root].val; > date[root*2+1].val+=date[root].val; > date[root*2].sum+=date[root].val*(date[root*2].r-date[root*2].l+1); > date[root*2+1].sum+=date[root].val*(date[root*2+1].r-date[root*2+1].l+1); > date[root].val=0; > } > > if(date[root].l==a&&date[root].r==b) { > > date[root].val=c; > date[root].sum+=c*(date[root].r-date[root].l+1); > > return; > } > > int mid=(date[root].l+date[root].r)>>1; > > if(a<=mid&&b<=mid) update(root*2,a,b,c); > else if(a>mid&&b>mid) update(root*2+1,a,b,c); > else { > > update(root*2,a,mid,c); > update(root*2+1,mid+1,b,c); > } > > date[root].sum=date[root*2].sum+date[root*2+1].sum; > } > > ll query(int root,int a,int b) > { > if(date[root].val) { > > date[root*2].val+=date[root].val; > date[root*2+1].val+=date[root].val; > date[root*2].sum+=date[root].val*(date[root*2].r-date[root*2].l+1); > date[root*2+1].sum+=date[root].val*(date[root*2+1].r-date[root*2+1].l+1); > date[root].val=0; > } > > if(date[root].l==a&&date[root].r==b) return date[root].sum; > > int mid=(date[root].l+date[root].r)>>1; > > if(a<=mid&&b<=mid) return query(root*2,a,b); > else if(a>mid&&b>mid) return query(root*2+1,a,b); > return query(root*2,a,mid)+query(root*2+1,mid+1,b); > } > > int main() > { > scanf("%d%d",&n,&q); > > for(int i=1;i<=n;i++) scanf("%lld",&A[i]); > > init(1,1,n); > > for(int i=1;i<=q;i++) { > > scanf("%s",&ord); > > if(ord=='C') { > > int a,b; > ll c; > > scanf("%d%d%lld",&a,&b,&c); > > update(1,a,b,c); > } > else { > > int a,b; > > scanf("%d%d",&a,&b); > > printf("%lld\n",query(1,a,b)); > } > } > > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator