[CC-FNCS]Chef and Churu
2018-09-21 10:31
363 查看
[CC-FNCS]Chef and Churu
题目大意:
一个长度为\(n(n\le10^5)\)的数列\(A_{1\sim n}\),另有\(n\)个函数,第\(i\)个函数会返回数组中标号在\(l_i\sim r_i\)之间的元素的和。\(q(q\le10^5)\)次询问,询问包含以下两种:
- 将数组的第\(x\)个元素修改为\(y\);
- 询问标号在\(m\)和\(n\)之间的函数的值的和。
思路:
对函数分块,树状数组维护\(A\)的前缀和。
时间复杂度\(\mathcal O(n\sqrt n\log n)\)。
源代码:
#include<cmath> #include<cstdio> #include<cctype> #include<algorithm> inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } typedef unsigned long long uint64; const int N=1e5+1,B=317; int n,a ,block,cnt [B],bel ,beg[B],end[B]; uint64 sum[B]; struct Func { int l,r; }; Func f ; class FenwickTree { private: uint64 val ; int lowbit(const int &x) const { return x&-x; } public: void modify(int p,const int &x) { for(;p<=n;p+=lowbit(p)) { val[p]+=x; } } uint64 query(int p) const { uint64 ret=0; for(;p;p-=lowbit(p)) { ret+=val[p]; } return ret; } uint64 query(const int &l,const int &r) const { return query(r)-query(l-1); } }; FenwickTree bit; class SegmentTree { #define _left <<1 #define _right <<1|1 #define mid ((b+e)>>1) private: int val[N<<2]; public: void build(const int &p,const int &b,const int &e) { val[p]=0; if(b==e) return; build(p _left,b,mid); build(p _right,mid+1,e); } void modify(const int &p,const int &b,const int &e,const int &l,const int &r) { if(b==l&&e==r) { val[p]++; return; } if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r)); if(r>mid) modify(p _right,mid+1,e,std::max(mid+1,l),r); } int query(const int &p,const int &b,const int &e,const int &x) const { int ret=val[p]; if(b==e) return ret; if(x<=mid) ret+=query(p _left,b,mid,x); if(x>mid) ret+=query(p _right,mid+1,e,x); return ret; } #undef _left #undef _right #undef mid }; SegmentTree sgt; inline void init() { for(register int i=bel[1];i<=bel ;i++) { sgt.build(1,1,n); for(register int j=beg[i];j<=end[i];j++) { sgt.modify(1,1,n,f[j].l,f[j].r); sum[i]+=bit.query(f[j].l,f[j].r); } for(register int j=1;j<=n;j++) { cnt[j][i]=sgt.query(1,1,n,j); } } } inline uint64 query(const int &l,const int &r) { uint64 ret=0; if(bel[l]==bel[r]) { for(register int i=l;i<=r;i++) { ret+=bit.query(f[i].l,f[i].r); } return ret; } for(register int i=l;i<=end[bel[l]];i++) { ret+=bit.query(f[i].l,f[i].r); } for(register int i=bel[l]+1;i<bel[r];i++) { ret+=sum[i]; } for(register int i=beg[bel[r]];i<=r;i++) { ret+=bit.query(f[i].l,f[i].r); } return ret; } int main() { n=getint(),block=sqrt(n)*2; for(register int i=1;i<=n;i++) { a[i]=getint(); bit.modify(i,a[i]); bel[i]=i/block; if(!beg[bel[i]]) beg[bel[i]]=i; end[bel[i]]=i; } for(register int i=1;i<=n;i++) { f[i].l=getint(); f[i].r=getint(); } init(); const int q=getint(); for(register int i=0;i<q;i++) { const int opt=getint(),x=getint(),y=getint(); if(opt==1) { bit.modify(x,y-a[x]); for(register int i=bel[1];i<=bel ;i++) { sum[i]+=(uint64)(y-a[x])*cnt[x][i]; } a[x]=y; } if(opt==2) { printf("%llu\n",query(x,y)); } } return 0; }
相关文章推荐
- CodeChef - FNCS Chef and Churu(分块)
- [CC]Chef and Churu
- 【codechef FNCS】【Chef and Churu】【分块】
- 【CodeChef】Chef and Churu 分块+树状数组
- [CC-CHANOQ]Chef and odd queries
- CC NOV14 Chef and Churu 分块+BIT维护单点.
- [CC-CHEFINV]Chef and Swaps
- [CC-XXOR]Chef and Easy Problem
- 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu
- CodeChef Chef and Churu Problem
- CodeChef Chef and Churu [分块]
- [CC]Chef and Graph Queries
- codechef November Challenge 2014 .Chef and Churu
- CodeChef Sereja and LCM(矩阵快速幂)
- Codeforces Round #251 (Div. 2) A - Devu, the Singer and Churu, the Joker
- How to use CCRenderTexture for Motion Blur, Screenshots and Drawing Sketches
- CC Sereja and Ballons (主席树)
- Range Minimum Queries (CodeChef ANDMIN )
- codechef The Ball And Cups题解
- 【Codechef】【Chef and Graph Queries】Lct 可持久化线段树