uva12436 回头再做一次
线段树维护等差数列,结点维护首项+公差即可
#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 回头再做一次的更多相关文章
- cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做
搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...
- poj2464扫描线好题,回头再做
扫描线+区间更新 题解 /* st[i],ol[i]表示y坐标大于y[i]和小于y[i]的点 两颗线段树建立在y轴上,区间[l,r]ol线选在[l,r]时st的分数 每次查询完成后再更新一次 遍历每条 ...
- hdu4942线段树模拟rotate操作+中序遍历 回头再做
很有意思的题目,详细题解看这里 https://blog.csdn.net/qian99/article/details/38536559 自己的代码不知道哪里出了点问题 /* rotate操作不会改 ...
- el-popover 的显示或隐藏,要在拿到真实dom之后再做控制
el-popover 的显示或隐藏,要在拿到真实dom之后再做控制
- 【java】【多线程】等待开启的多个线程都执行完成,再做事情,怎么实现
今天在controller中写一个接口用来测试模拟多个请求同时到达 下订单的情况, 怎么能有效保证高并发下的库存和销量的一致性呢?[具体实现方法:https://www.cnblogs.com/sxd ...
- Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD.SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗? 很显然,答案是否定的! 对该问题产生疑问的根源还是对Sp ...
- dp 46(再做一遍)
Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多 ...
- 不想再做"鸟蛋"
至今为止学习C++两个学期了,有过迷茫,有过自信,有过崩溃,有过希望,有过伤心,有过高兴.这一路走来,C++虐我千百遍,我待C++如"初恋". ...
- 不愿看到Java开发者再做的10件事
William F. Buckley.Jr 曾经说过,“保守主义者是那些逆着历史潮流不断喊停的人,其他人都不愿意这么做或者对他们这么做显得没有耐性”.虽然我对此了解不多,但是每次看到有Java开发人员 ...
随机推荐
- Prometheus Node_exporter
Node Exporter node_exporter 主要用于 *NIX 系统监控, 用 Golang 编写. 功能对照表 默认开启的功能 名称 说明 系统 arp 从 /proc/net/arp ...
- GBDT用于分类问题
一.简介 GBDT在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,gbdt在各种竞赛是大放异彩.原因大概有几个 一:效果确实挺不错. 二:既可以用于分类 ...
- 编译安装php-7.1.17及部分扩展
./configure --prefix=/usr/local/php-7.1.17 --disable-debug --enable-shmop --with-gd --with-jpeg-dir= ...
- elasticsearch-head安装及启动
head是用于监控Elasticsearch状态的客户端插件,包括数据可视化,增删改查工具,es语句的可视化等等. 5.0之后的安装方式如下: git clone git://github.com/m ...
- 函数和常用模块【day06】:xml模块(六)
本节内容 1.简述 2.xml格式 3.xml节点操作 4.创建新的xml文件 一.简述 xml是实现不同语言或者程序之间进行数据交换的协议,跟json差不多,但是json使用起来更简单,不过,古时候 ...
- Unity做AR
Unity做AR呢这里借助了高通的AR包 这里是视频教程 http://www.tudou.com/programs/view/dnvEbIubNzI/ 这里是结果演示 http://www.tu ...
- php循环删除文件夹和目录
一定要注意文件夹中的两个目录----> .(当前目录) ..(上级目录) 需要对这两个目录进行过滤, 否则在删除或者遍历是会一直,对于..甚至会向你指定的文件夹的上级目录循环操作,删除重要 ...
- oracle解除锁表【原】
在日常操作中,经常会有不小心被锁表的情况发生 一般造成原因有: 开发人员不小心执行了 for update 查询语句后,没有解锁 不合理代码中开启事务(begin transaction)后,没有关闭 ...
- Neural Networks and Deep Learning 课程笔记(第二周)神经网络的编程基础 (Basics of Neural Network programming)
总结 一.处理数据 1.1 向量化(vectorization) (height, width, 3) ===> 展开shape为(heigh*width*3, m)的向量 1.2 特征归一化( ...
- Linux 命令详解(六)Linux 守护进程的启动方法
Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html