首页 > 代码库 > poj 3468
poj 3468
#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <cmath>#include <string>#include <vector>#include <list>#include <map>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <numeric>#include <functional>using namespace std;#define LL __int64#define DB double#define N 100500const int INF = 0x3f3f3f3f;const LL INFF = 1LL << 60;const DB EPS = 1e-9;const DB OO = 1e15;const DB PI = acos(-1.0);LL sum[N*4],col[N*4],ql,qr,v;char s[3];void Pushup(LL rt){ sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(LL rt,LL l,LL r){ col[rt] = 0; if(l == r) {scanf("%I64d",&sum[rt]);return ;} LL m = (l+r)>>1; build(rt<<1,l,m); build(rt<<1|1,m+1,r); Pushup(rt); return ;}void Pushdown(LL rt,LL m){ if(col[rt]) { col[rt<<1] += col[rt]; col[rt<<1|1] += col[rt]; sum[rt<<1] += (m-(m>>1))*col[rt]; sum[rt<<1|1] += (m>>1)*col[rt]; col[rt] = 0; return ; }}void updata(LL rt,LL l,LL r){ if(l>=ql&&r<=qr) { sum[rt] += (r-l+1)*v; col[rt] += v; return ; } Pushdown(rt,r-l+1); LL m = (l+r)>>1; if(ql<=m) updata(rt<<1,l,m); if(m<qr) updata(rt<<1|1,m+1,r); Pushup(rt);}LL Query(LL rt,LL l,LL r){ LL ans = 0 ,m; if(ql<=l&&r<=qr) return sum[rt]; Pushdown(rt,r-l+1); m = (l+r)>>1; if(ql<=m) ans+=Query(rt<<1,l,m); if(qr>m) ans+=Query(rt<<1|1,m+1,r); return ans;}int main(){ LL n,m; while(~scanf("%I64d %I64d",&n,&m)) { build(1,1,n); while(m--) { scanf("%s",s); if(s[0] == ‘C‘) { scanf("%I64d %I64d %I64d",&ql,&qr,&v); updata(1,1,n); }else { scanf("%I64d %I64d",&ql,&qr); LL ans = Query(1,1,n); printf("%I64d\n",ans); } } } return 0;}
线段树区间修改
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。