博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树(区间修改)
阅读量:4693 次
发布时间:2019-06-09

本文共 2035 字,大约阅读时间需要 6 分钟。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long longinline int read() { int x = 0,ff = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') ff = -1; ch = getchar(); } while(isdigit(ch)) { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } return x * ff;}inline void write(ll x) { if(x < 0) putchar('-'),x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0');}const int INF = 0x3f3f3f3f;const int MAXN = 5e5 + 100;const int MAXM = 3e3 + 10;int n,m,a[MAXN];struct Tree { int left,right; ll sum,add; #define l(x) t[x].left #define r(x) t[x].right #define sum(x) t[x].sum #define add(x) t[x].add}t[MAXN];void build(int p,int l,int r) { l(p) = l; r(p) = r; if(l == r) {sum(p) = a[l]; return ; } int mid = (l + r) / 2; build(p * 2,l,mid); build(p * 2 + 1,mid + 1,r); sum(p) = sum(p * 2) + sum(p * 2 + 1);}void spread(int p) { if(add(p)) { sum(p * 2) += add(p) * (r(p * 2) - l(p * 2) + 1); sum(p * 2 + 1) += add(p) * (r(p * 2 + 1) - l(p * 2 + 1) + 1); add(p * 2) += add(p); add(p * 2 + 1) += add(p); add(p) = 0; }}void change(int p,int l,int r,int d) { if(l <= l(p) && r >= r(p)) { sum(p) += (ll) d * (r(p) - l(p) + 1); add(p) += d; return ; } spread(p); int mid = (l(p) + r(p)) / 2; if(l <= mid) change(p * 2,l,r,d); if(r > mid) change(p * 2 + 1,l,r,d); sum(p) = sum(p * 2) + sum(p * 2 + 1);}ll ask(int p,int l,int r) { if(l <= l(p) && r >= r(p)) return sum(p); spread(p); int mid = (l(p) + r(p)) / 2; ll val = 0; if(l <= mid) val += ask(p * 2,l,r); if(r > mid) val += ask(p * 2 + 1,l,r); return val;}int main() { n = read(); m = read(); for(int i = 1; i <= n; ++i) a[i] = read(); build(1,1,n); for(int i = 1; i <= m; ++i) { char op; int l,r,d; cin >> op; l = read(); r = read(); if(op == 'C') { d = read(); change(1,l,r,d); } else { write(ask(1,l,r)); putchar('\n'); } } return 0;}

 

转载于:https://www.cnblogs.com/AK-ls/p/10612521.html

你可能感兴趣的文章
一元运算符重载
查看>>
c中的malloc函数
查看>>
c++继承中的对象模型
查看>>
c++中的new和delete
查看>>
c++继承中同名成员处理
查看>>
值传递,引用传递,指针传递
查看>>
浅拷贝和深拷贝
查看>>
结构体嵌套一个例子
查看>>
虚析构和纯虚析构
查看>>
空对象占用的内存空间
查看>>
构造函数调用规则
查看>>
基类成员访问方式
查看>>
编译安装MySQL
查看>>
expect脚本远程登录、远程执行命令和脚本传参简单用法
查看>>
隐藏Apache版本号及版本敏感信息
查看>>
pssh安装及使用
查看>>
LAMP环境搭建之编译安装指南(php-5.3.27.tar.gz)
查看>>
linux后台运行、关闭、查看后台任务常用命令
查看>>
将集群WEB节点静态数据迁移到共享存储器(LNMP环境)
查看>>
挂载nfs提示:mount.nfs: access denied by server while mounting...
查看>>