线段树维护等差数列,结点维护首项+公差即可

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef long long ll;
const int maxn = ; #define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << ], rc[maxn << ], v[maxn << ];
ll nd[maxn << ], ad[maxn << ], s[maxn << ]; void pushup(int u);
void pushdown (int u); inline int length(int u) {
return rc[u] - lc[u] + ;
} inline void change (int u, ll a) {
v[u] = ;
ad[u] = ;
nd[u] = a;
s[u] = a * length(u);
} inline void maintain (int u, ll a, ll d) {
if (v[u] && lc[u] != rc[u]) {
pushdown(u);
pushup(u);
} v[u] = ;
nd[u] += a;
ad[u] += d;
ll n = length(u);
s[u] += a * n + (((n-) * n) / ) * d;
} inline void pushup (int u) {
s[u] = s[lson(u)] + s[rson(u)];
} inline void pushdown (int u) {
if (v[u]) {
change(lson(u), nd[u]);
change(rson(u), nd[u]);
v[u] = nd[u] = ;
} else if (nd[u] || ad[u]) {
maintain(lson(u), nd[u], ad[u]);
maintain(rson(u), nd[u] + length(lson(u)) * ad[u], ad[u]);
nd[u] = ad[u] = ;
}
} void build (int u, int l, int r) {
lc[u] = l;
rc[u] = r;
nd[u] = ad[u] = s[u] = ; if (l == r)
return;
int mid = (l + r) / ;
build(lson(u), l, mid);
build(rson(u), mid + , r);
pushup(u);
} void modify(int u, int l, int r, ll a, ll d) {
if (l <= lc[u] && rc[u] <= r) {
maintain(u, a + d * (lc[u] - l), d);
return;
} pushdown(u);
int mid = (lc[u] + rc[u]) / ;
if (l <= mid)
modify(lson(u), l, r, a, d);
if (r > mid)
modify(rson(u), l, r, a, d);
pushup(u);
} void set(int u, int l, int r, ll a) {
if (l <= lc[u] && rc[u] <= r) {
change(u, a);
return;
} pushdown(u);
int mid = (lc[u] + rc[u]) / ;
if (l <= mid)
set(lson(u), l, r, a);
if (r > mid)
set(rson(u), l, r, a);
pushup(u);
} ll query (int u, int l, int r) {
if (l <= lc[u] && rc[u] <= r)
return s[u]; pushdown(u);
ll ret = ;
int mid = (lc[u] + rc[u]) / ;
if (l <= mid)
ret += query(lson(u), l, r);
if (r > mid)
ret += query(rson(u), l, r);
pushdown(u);
return ret;
} int N; int main () {
while (~scanf("%d", &N)) {
char op[];
int l, r, x;
build(, , );
while (N--) {
scanf("%s%d%d", op, &l, &r);
if (op[] == 'A')
modify(, l, r, , );
else if (op[] == 'B')
modify(, l, r, r - l + , -);
else if (op[] == 'C') {
scanf("%d", &x);
set(, l, r, x);
} else
printf("%lld\n", query(, l, r));
}
}
return ;
}

uva12436 回头再做一次的更多相关文章

  1. cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做

    搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...

  2. poj2464扫描线好题,回头再做

    扫描线+区间更新 题解 /* st[i],ol[i]表示y坐标大于y[i]和小于y[i]的点 两颗线段树建立在y轴上,区间[l,r]ol线选在[l,r]时st的分数 每次查询完成后再更新一次 遍历每条 ...

  3. hdu4942线段树模拟rotate操作+中序遍历 回头再做

    很有意思的题目,详细题解看这里 https://blog.csdn.net/qian99/article/details/38536559 自己的代码不知道哪里出了点问题 /* rotate操作不会改 ...

  4. el-popover 的显示或隐藏,要在拿到真实dom之后再做控制

    el-popover 的显示或隐藏,要在拿到真实dom之后再做控制

  5. 【java】【多线程】等待开启的多个线程都执行完成,再做事情,怎么实现

    今天在controller中写一个接口用来测试模拟多个请求同时到达 下订单的情况, 怎么能有效保证高并发下的库存和销量的一致性呢?[具体实现方法:https://www.cnblogs.com/sxd ...

  6. Spark在处理数据的时候,会将数据都加载到内存再做处理吗?

    对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD.SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗? 很显然,答案是否定的! 对该问题产生疑问的根源还是对Sp ...

  7. dp 46(再做一遍)

    Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多 ...

  8. 不想再做"鸟蛋"

    至今为止学习C++两个学期了,有过迷茫,有过自信,有过崩溃,有过希望,有过伤心,有过高兴.这一路走来,C++虐我千百遍,我待C++如"初恋".                    ...

  9. 不愿看到Java开发者再做的10件事

    William F. Buckley.Jr 曾经说过,“保守主义者是那些逆着历史潮流不断喊停的人,其他人都不愿意这么做或者对他们这么做显得没有耐性”.虽然我对此了解不多,但是每次看到有Java开发人员 ...

随机推荐

  1. python -- 题目不看别人的自己写然后比较

    题目一 ''' 编写Python脚本,分析xx.log文件,按域名统计访问次数倒序输出 xx.log文件内容如下: https://www.sogo.com/ale.html https://www. ...

  2. log4j入门

    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录.在apache网站:jakarta.apache.org/log4j 可以免费下载到Log ...

  3. bootstrap modal垂直居中 (转)

    根据博友的经验,总结后请使用方法一就行了 一,修改bootstrap.js 源码 原来的: Modal.prototype.adjustDialog = function () { ].scrollH ...

  4. CSS魔法(一) 盒子模型

    序言 盒子模型(橘子橘子皮) 一个盒子,包括:外边距(margin).边框(border).内边距(padding)以及最中间的内容(content). margin.padding <styl ...

  5. The provider is not compatible with the version of Oracle client

    保留下安装文件夹里的所有文件.然后把我那个很小应用软件(需要访问远程的oracle数据库)放在这个文件夹里.删除一下直接感觉无用的文件,先抽取可 能用不着的文件,保留放在另一个备用的文件夹里,然后运行 ...

  6. JavaScript之创建动态脚本

    //option= {type,src,text,isCreateScriptBySrc} function createDynamicScript(option){ var script = doc ...

  7. 2、Saltstack的数据系统

      一.Grains grains是salt用来收集minion端底层系统信息的接口.比如,操作系统type.域名 .IP地址.内存及其他相关系统属性信息等.存储在minion端,用于保存minion ...

  8. Spring源码解读

    beanfactory https://www.cnblogs.com/lspz/p/6244948.html requestmapping https://blog.csdn.net/u012557 ...

  9. tidb 架构 ~Tidb学习系列(1)

    一 简介:今天来研究Tidb 二 安装测试: 0 下载Tidb wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz   按如 ...

  10. canny 算子python实现

    1. Canny介绍 Canny算子与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法.John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标: 1 ...