poj 3468 分类: poj templates 2015-04-01 20:20 34人阅读 评论(0) 收藏
2015-04-01 20:20
405 查看
线段树区间增值+区间查询模板。
#include<map> #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<iostream> #include<algorithm> const int MAXN = 100005; int n , q, a[MAXN] = {0}; struct node { long long sum; long long add; }tree[MAXN<<2] = {0}; #define L(x) (x<<1) #define R(x) ((x<<1)|1) inline void update(int x){tree[x].sum = tree[L(x)].sum + tree[R(x)].sum;} inline void build(int ll,int rr,int si) { if(ll == rr) tree[si].sum = a[ll]; else { int mid = (ll+rr)>>1; build(ll,mid,L(si)); build(mid+1,rr,R(si)); update(si); } } inline void pushdown(int x,int ll,int rr) { int mid = (ll+rr)>>1; if(tree[x].add) { tree[L(x)].sum += tree[x].add*(mid-ll+1); tree[R(x)].sum += tree[x].add*(rr - mid); tree[L(x)].add += tree[x].add; tree[R(x)].add += tree[x].add; tree[x].add = 0; } } inline void add(int l,int r,int ll,int rr,int si,int val) { if(ll == l && rr == r) tree[si].sum += (long long)val*(rr-ll+1), tree[si].add += val; else { int mid = (ll+rr)>>1; pushdown(si,ll,rr); if(r<=mid) add(l,r,ll,mid,L(si),val); else if(l>mid)add(l,r,mid+1,rr,R(si),val); else { add(l,mid,ll,mid,L(si),val); add(mid+1,r,mid+1,rr,R(si),val); } update(si); } } inline long long count(int l,int r,int ll,int rr,int si) { if(ll == l && rr == r)return tree[si].sum; else { int mid = (ll+rr)>>1; pushdown(si,ll,rr); if(r<=mid) return count(l,r,ll,mid,L(si)); else if(l>mid)return count(l,r,mid+1,rr,R(si)); else return count(l,mid,ll,mid,L(si)) + count(mid+1,r,mid+1,rr,R(si)); update(si); } } #undef L #undef R int main() { #ifndef ONLINE_JUDGE freopen("poj3468.in","r",stdin); freopen("poj3468.out","w",stdout); #endif scanf("%d%d",&n,&q); for(int i = 1 ; i <= n ;i++) scanf("%d",&a[i]); build(1,n,1); for(int i = 1; i <= q; i++) { static int a,b,c; static char ch[5] = {'\0'}; scanf("%s",ch);scanf("%d%d",&a,&b); switch(ch[0]) { case 'C': scanf("%d",&c); add(a,b,1,n,1,c); break; case 'Q': printf("%I64d\n",count(a,b,1,n,1)); break; } } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- Poj 1050 分类: Translation Mode 2014-04-04 09:31 103人阅读 评论(0) 收藏
- Codeforce 438D-The Child and Sequence 分类: Brush Mode 2014-10-06 20:20 102人阅读 评论(0) 收藏
- poj 3667 分类: poj templates 2015-03-30 22:13 31人阅读 评论(0) 收藏
- 2015-03 月份学习总结 分类: 学习总结 2015-04-01 20:25 88人阅读 评论(0) 收藏
- iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏
- Poj 1029 分类: Translation Mode 2014-04-04 10:18 112人阅读 评论(0) 收藏
- dm642的中断 分类: DSP 2013-09-10 14:34 661人阅读 评论(0) 收藏
- Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏
- hiho~ 分类: hiho templates 2015-04-01 17:37 32人阅读 评论(0) 收藏
- ubuntu创建IdeaIU快捷启动方式 分类: 软件插件学习 2015-04-01 15:12 82人阅读 评论(0) 收藏
- SQLiteOpenHelper数据库创建与升级onCreat()、onUpgrade() 分类: Android数据存储 2015-03-24 17:40 34人阅读 评论(0) 收藏
- poj 2985 分类: poj 2015-03-07 21:25 47人阅读 评论(0) 收藏
- poj1741 分类: poj 2015-02-08 03:40 101人阅读 评论(0) 收藏
- poj 2777 分类: poj templates 2015-03-30 22:15 29人阅读 评论(0) 收藏
- Poj 1032 分类: Translation Mode 2014-04-04 09:09 111人阅读 评论(0) 收藏
- Poj 2528 Mayor's posters 分类: Brush Mode 2014-07-23 09:12 84人阅读 评论(0) 收藏
- poj 2828 分类: poj 2015-03-06 21:49 38人阅读 评论(0) 收藏
- poj 3481 分类: poj 2015-03-07 20:19 218人阅读 评论(2) 收藏
- poj 3686 分类: poj templates 2015-03-26 22:29 46人阅读 评论(0) 收藏
- sgu 136 分类: sgu 2015-03-14 22:38 34人阅读 评论(0) 收藏