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 |
给出两种解法:splay、线段树//splay: #include <cstdio> #include <iostream> #include <algorithm> using namespace std; template<typename T> inline T read() { T x=0,f=1;char c=getchar(); while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();} while (c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();} return x*f; } const int MAXN=100005; int n,m; struct Splay { struct BST { int lson,rson,father,size; long long val,cover,sum; }tree[MAXN]; #define root tree[0].rson inline void push_down(int now) { if (tree[now].cover==0) return ; if (tree[now].lson!=0) { tree[tree[now].lson].val+=tree[now].cover; tree[tree[now].lson].cover+=tree[now].cover; tree[tree[now].lson].sum+=tree[now].cover*tree[tree[now].lson].size; } if (tree[now].rson!=0) { tree[tree[now].rson].val+=tree[now].cover; tree[tree[now].rson].cover+=tree[now].cover; tree[tree[now].rson].sum+=tree[now].cover*tree[tree[now].rson].size; } tree[now].cover=0; } inline void size_update(int now) { if (now==0) return ; tree[now].size=tree[tree[now].lson].size+tree[tree[now].rson].size+1; tree[now].sum=tree[tree[now].lson].sum+tree[tree[now].rson].sum+tree[now].val; } inline void left_rotate(int now) { int fa=tree[now].father; push_down(fa);push_down(now); tree[fa].rson=tree[now].lson; tree[now].father=tree[fa].father; tree[fa].father=now; tree[now].lson=fa; if (tree[fa].rson!=0) tree[tree[fa].rson].father=fa; if (tree[tree[now].father].lson==fa) tree[tree[now].father].lson=now; else tree[tree[now].father].rson=now; size_update(fa);size_update(now); } inline void right_rotate(int now) { int fa=tree[now].father; push_down(fa);push_down(now); tree[fa].lson=tree[now].rson; tree[now].father=tree[fa].father; tree[fa].father=now; tree[now].rson=fa; if (tree[fa].lson!=0) tree[tree[fa].lson].father=fa; if (tree[tree[now].father].lson==fa) tree[tree[now].father].lson=now; else tree[tree[now].father].rson=now; size_update(fa);size_update(now); } inline void splay(int now,int &rt) { int fa,to=tree[rt].father;push_down(now); while (tree[now].father!=to) { fa=tree[now].father; if (tree[fa].father==to) { if (now>fa) left_rotate(now); else right_rotate(now); break; } if (now==tree[fa].lson) { if (tree[tree[fa].father].lson==fa) { right_rotate(fa); right_rotate(now); } else { right_rotate(now); left_rotate(now); } } else { if (tree[tree[fa].father].lson==fa) { left_rotate(now); right_rotate(now); } else { left_rotate(fa); left_rotate(now); } } } rt=now; } inline void build() { root=1; for (int i=n;i>=2;i--) tree[i-1].rson=i,tree[i].father=i-1,size_update(i-1); if (n>1) splay(n/2,root); } inline void modify(int l,int r,long long cover) { int now; if (l==1&&r==n) now=root; else if (l==1) { splay(r+1,root); now=tree[root].lson; } else if (r==n) { splay(l-1,root); now=tree[root].rson; } else { splay(l-1,root),splay(r+1,tree[root].rson); now=tree[tree[root].rson].lson; } tree[now].val+=cover; tree[now].cover+=cover; tree[now].sum+=cover*tree[now].size; size_update(tree[now].father); } inline long long query(int l,int r) { int now; if (l==1&&r==n) now=root; else if (l==1) { splay(r+1,root); now=tree[root].lson; } else if (r==n) { splay(l-1,root); now=tree[root].rson; } else { splay(l-1,root);splay(r+1,tree[root].rson); now=tree[tree[root].rson].lson; } return tree[now].sum; } }Tr; int main() { char c;int l,r; n=read<int>();m=read<int>(); for (int i=1;i<=n;i++) Tr.tree[i].sum=Tr.tree[i].val=read<long long>(),Tr.tree[i].size=1; Tr.build(); while (m--) { cin>>c;l=read<int>();r=read<int>(); switch (c) { case 'Q':printf("%lld\n",Tr.query(l,r));break; case 'C':Tr.modify(l,r,read<long long>());break; } } return 0; } /*----------------------------------------------------------------------------------------------------------------------------------------------------分割线*/ //线段树 #include <cstdio> #include <iostream> using namespace std; template<typename T> inline T read() { T x=0,f=1;char c=getchar(); while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();} while (c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();} return x*f; } const int MAXN=100005; int n,m; long long a[MAXN]; namespace stree { long long tree[MAXN<<2],val[MAXN<<2]; inline void build(int k,int l,int r) { if (l==r) {tree[k]=a[l];return ;} int mid=l+r>>1; build(k<<1,l,mid);build(k<<1|1,mid+1,r); tree[k]=tree[k<<1]+tree[k<<1|1]; } inline void update(int k,int l,int r,int _l,int _r,long long d) { if (_l<=l&&_r>=r) {tree[k]+=d*(r-l+1);val[k]+=d;return ;} int mid=l+r>>1; if (_l<=mid) update(k<<1,l,mid,_l,_r,d); if (_r>mid) update(k<<1|1,mid+1,r,_l,_r,d); tree[k]=tree[k<<1]+tree[k<<1|1]+val[k]*(r-l+1); } inline long long query(int k,int l,int r,int _l,int _r,long long ans=0) { if (_l<=l&&_r>=r) return tree[k]; int mid=l+r>>1; if (_l<=mid) ans+=query(k<<1,l,mid,_l,_r); if (_r>mid) ans+=query(k<<1|1,mid+1,r,_l,_r); return ans+val[k]*(min(r,_r)-max(l,_l)+1); } } int main() { char c;int x,y; n=read<int>();m=read<int>(); for (int i=1;i<=n;i++) a[i]=read<long long>(); stree::build(1,1,n); for (int i=1;i<=m;i++) { cin>>c;x=read<int>();y=read<int>(); if (c=='C') stree::update(1,1,n,x,y,read<long long>()); else printf("%lld\n",stree::query(1,1,n,x,y)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator