【POJ】A Simple Problem with Integers(线段树区间修增减求和)
来源:互联网 发布:乌镇人工智能报告 编辑:程序博客网 时间:2024/05/16 19:10
线段树区间修改增加问题,模板题,注意懒惰处理。
134434492013010521003468Accepted4308K1610MSC++2362B2014-09-15 15:46:35
#include<cstdio>#include<cstring>#include<iostream>#include<vector>#include<queue>#include<map>#include<cstdlib>#include<stack>#include<set>#include<string>using namespace std;typedef long long LL;typedef unsigned long long ULL;#define esp 1e-10const int maxn = 100000 + 10;#define MAXD 100int n , m;LL tree[maxn << 2];LL mark[maxn << 2];void BuildTree(int L,int R,int pos){ if(L == R){ scanf("%I64d",&tree[pos]); return ; } int m = (L + R) >> 1; BuildTree(L, m , pos << 1); BuildTree(m + 1, R , (pos << 1)|1); tree[pos] = tree[pos << 1] + tree[(pos << 1)|1]; return ;}void UpDate(int l,int r,int add,int L,int R,int pos){ if(l <= L && R <= r){ mark[pos] += add; tree[pos] += add * (R - L + 1); return ; } int m = (L + R) >> 1; int len = R - L + 1; if(mark[pos]){ //懒惰标记下移 mark[pos << 1] += mark[pos]; mark[(pos << 1)|1] += mark[pos]; tree[pos << 1] += mark[pos] * (len - (len >> 1)); tree[(pos << 1)|1] += mark[pos] * (len >> 1); mark[pos] = 0; } if(l <= m) UpDate(l,r,add,L,m,pos << 1); if(r > m) UpDate(l,r,add,m + 1,R,(pos << 1)|1); tree[pos] = tree[pos << 1] + tree[(pos << 1)|1]; return ;}LL Query(int l,int r,int L,int R,int pos){ if(l <= L && R <= r){ return tree[pos]; } int m = (L + R) >> 1; int len = R - L + 1; if(mark[pos]){ //懒惰标记下移 mark[pos << 1] += mark[pos]; mark[(pos << 1)|1] += mark[pos]; tree[pos << 1] += mark[pos] * (len - (len >> 1)); tree[(pos << 1)|1] += mark[pos] * (len >> 1); mark[pos] = 0; } LL ret = 0; if(l <= m) ret += Query(l,r,L,m,pos << 1); if(r > m) ret += Query(l,r,m + 1,R,(pos << 1)|1); return ret;}int main(){ char str[MAXD]; scanf("%d%d",&n,&m); BuildTree(1,n,1); for(int i = 0 ; i < m ; i++){ scanf("%s",str); if(str[0] == 'Q'){ int x ,y; scanf("%d%d",&x,&y); LL ans = Query(x,y,1,n,1); printf("%I64d\n",ans); } else if(str[0] == 'C'){ int x,y,z; scanf("%d%d%d",&x,&y,&z); UpDate(x,y,z,1,n,1); } } return 0;}
0 0
- 【POJ】A Simple Problem with Integers(线段树区间修增减求和)
- poj 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
- POJ 3468 A Simple Problem with Integers(线段树 成段增减,区间求和)
- POJ 3468 A Simple Problem with Integers (线段树 区间增减 区间求和)
- POJ 3468——A Simple Problem with Integers(线段树 成端增减,区间求和)
- POJ3468 A Simple Problem with Integers 线段树|树状数组BIT(区间增减,求和)
- poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)
- 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和
- A Simple Problem with Integers(线段树,区间求和)
- Poj 3468 A Simple Problem with Integers (线段树 区间更新 区间求和)
- POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)
- POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)
- poj 3468 A Simple Problem with Integers(线段树+区间更新+区间求和)
- POJ-3468-A Simple Problem with Integers(线段树区间修改+区间求和)
- poj 3468 A Simple Problem with Integers(线段树区间修改+区间求和)
- POJ 3468 A Simple Problem with Integers (区间增减)
- 【线段树 && 区间增减】POJ 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers(线段树区间更新+求和)
- HugePage简介和KVM中使用HugePage
- Gdb调试的tui模式
- 关于jquery_1.9以上版本
- Active Object模式
- 回调函数举例(callbackfunction)
- 【POJ】A Simple Problem with Integers(线段树区间修增减求和)
- RSA算法原理
- ssh: symbol lookup error: ssh: undefined symbol: EVP_aes_128_ctr
- 一个奇怪的问题, debian下的证书全部不可信了.Fortigate防火墙和中间人攻击
- 进程调试、进程管理
- 标准C++中的string类的用法总结
- IOS 发布应用程序到App Store
- linux下导入、导出mysql数据库命令
- sqlite学习总结