UVA 12436 - Rip Van Winkle's Code(线段树)
UVA 12436 - Rip Van Winkle's Code
题意:区间改动一个加入等差数列,一个把区间设为某个值,然后询问区间和
思路:关键在于等差数列的地方,线段树的每一个结点加入一个首项和公差,因为等差数列加上一个等差数列还是一个等差数列。利用这个性质就能够进行维护了,注意set操作会覆盖掉等差数列的操作
代码:
#include <cstdio>
#include <cstring> #define lson(x) ((x<<1)+1)
#define rson(x) ((x<<1)+2) typedef long long ll;
const int N = 250005;
int n; struct Node {
ll l, r, a1, d, c, val;
int setc;
} node[N * 4]; void build(ll l, ll r, int x = 0) {
node[x].l = l; node[x].r = r;
node[x].a1 = node[x].d = node[x].val = node[x].setc = 0;
if (l == r) return;
ll mid = (l + r) / 2;
build(l, mid, lson(x));
build(mid + 1, r, rson(x));
} void pushup(int x) {
node[x].val = node[lson(x)].val + node[rson(x)].val;
} void pushdown(int x) {
if (node[x].setc) {
node[lson(x)].c = node[rson(x)].c = node[x].c;
node[lson(x)].val = (node[lson(x)].r - node[lson(x)].l + 1) * node[x].c;
node[rson(x)].val = (node[rson(x)].r - node[rson(x)].l + 1) * node[x].c;
node[lson(x)].setc = node[rson(x)].setc = 1;
node[lson(x)].a1 = node[lson(x)].d = node[rson(x)].a1 = node[rson(x)].d = 0;
node[x].setc = 0;
}
node[lson(x)].a1 += node[x].a1;
node[lson(x)].d += node[x].d;
ll l = node[x].l, r = node[x].r;
ll mid = (l + r) / 2;
ll amid = node[x].a1 + node[x].d * (mid - l + 1);
ll len1 = (mid - l + 1), len2 = (r - mid);
node[lson(x)].val += node[x].a1 * len1 + len1 * (len1 - 1) / 2 * node[x].d;
node[rson(x)].a1 += amid;
node[rson(x)].d += node[x].d;
node[rson(x)].val += amid * len2 + len2 * (len2 - 1) / 2 * node[x].d;
node[x].a1 = node[x].d = 0;
} void A(ll l, ll r, ll d, int x = 0) {
if (node[x].l >= l && node[x].r <= r) {
ll st = node[x].l - l + 1;
if (d == -1) st = r - node[x].l + 1;
node[x].a1 += st;
node[x].d += d;
ll len = node[x].r - node[x].l + 1;
node[x].val += st * len + len * (len - 1) / 2 * d;
return;
}
pushdown(x);
ll mid = (node[x].l + node[x].r) / 2;
if (l <= mid) A(l, r, d, lson(x));
if (r > mid) A(l, r, d, rson(x));
pushup(x);
} void C(ll l, ll r, ll c, int x = 0) {
if (node[x].l >= l && node[x].r <= r) {
node[x].setc = 1;
node[x].c = c;
node[x].val = (node[x].r - node[x].l + 1) * c;
node[x].a1 = node[x].d = 0;
return;
}
pushdown(x);
ll mid = (node[x].l + node[x].r) / 2;
if (l <= mid) C(l, r, c, lson(x));
if (r > mid) C(l, r, c, rson(x));
pushup(x);
} ll S(ll l, ll r, int x = 0) {
if (node[x].l >= l && node[x].r <= r)
return node[x].val;
pushdown(x);
ll mid = (node[x].l + node[x].r) / 2;
ll ans = 0;
if (l <= mid) ans += S(l, r, lson(x));
if (r > mid) ans += S(l, r, rson(x));
pushup(x);
return ans;
} int main() {
while (~scanf("%d", &n)) {
build(1, 250000);
ll a, b, c;
char Q[2];
while (n--) {
scanf("%s%lld%lld", Q, &a, &b);
if (Q[0] == 'C') scanf("%lld", &c);
if (Q[0] == 'A') A(a, b, 1);
if (Q[0] == 'B') A(a, b, -1);
if (Q[0] == 'C') C(a, b, c);
if (Q[0] == 'S') printf("%lld\n", S(a, b));
}
}
return 0;
}
UVA 12436 - Rip Van Winkle's Code(线段树)的更多相关文章
- Uva 12436 Rip Van Winkle's Code
Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...
- Uva 12436 Rip Van Winkle's Code
Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
"Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...
- UVA 12501 Bulky process of bulk reduction ——(线段树成段更新)
和普通的线段树不同的是,查询x~y的话,给出的答案是第一个值的一倍加上第二个值的两倍一直到第n个值的n倍. 思路的话,就是关于query和pushup的方法.用一个新的变量sum记录一下这个区间里面按 ...
- UVA-12436 Rip Van Winkle's Code (线段树区间更新)
题目大意:一个数组,四种操作: long long data[250001]; void A( int st, int nd ) { for( int i = st; i <= nd; i++ ...
- POJ训练计划2528_Mayor's posters(线段树/成段更新+离散化)
解题报告 id=2528">地址传送门 题意: 一些海报,覆盖上去后还能看到几张. 思路: 第一道离散化的题. 离散化的意思就是区间压缩然后映射. 给你这么几个区间[1,300000] ...
- Uva 12299 带循环移动的RMQ(线段树)
题目链接:https://vjudge.net/contest/147973#problem/C 题意:传统的RMQ是一个不变的数组a求区间最值.现在要循环移动(往前移动). 分析:求区间问题,很容易 ...
- UVa 1471 Defense Lines - 线段树 - 离散化
题意是说给一个序列,删掉其中一段连续的子序列(貌似可以为空),使得新的序列中最长的连续递增子序列最长. 网上似乎最多的做法是二分查找优化,然而不会,只会值域线段树和离散化... 先预处理出所有的点所能 ...
随机推荐
- git的权威指南
CHENYILONG 博客 git的权威指南 全屏 © chenyilong.本站由Postach.io 博客
- HDU 2073 无限的路 (模拟)
题目链接 Problem Description 甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形: 甜甜的好朋友蜜蜜发现 ...
- JQuery效果隐藏/显示
hide() 方法 语法 $(selector).hide(speed,callback) show() 方法 语法 $(selector).show(speed,callback) 参数 描述 sp ...
- Gentoo rc-update service ‘net.eth0′ does not exist
最近迷上了Gentoo,并相信以后也会把更多的精力放在Gentoo上,不过Gentoo的安装的过程的确让很多人却步. 本文只提到添加net.eth0到默认的运行级别时一个很小的报错解决. # nano ...
- 启动tomcat的时候爆出如下错误
The JRE_HOME environment variable is not defined correctly This environment 解决办法: https://blog.csdn. ...
- linux下cpu物理个数、多核、超线程判断解析
在Linux体系中,供给了proc文件体系显示体系的软硬件信息.若是想懂得体系中CPU的供给商和相干设备信息,则可以经由过程/proc/cpuinfo文件获得.本文章针对该文件进行简单的总结. 基于指 ...
- Linux学习笔记:常用命令grep、iconv、cp、mv、rm
本篇记录一些近期常用的命令. 一.grep过滤 grep过滤 不包含某些字符串 cat test.txt | grep -v '.jpg' 过滤jpg结尾的图片 cat test.txt | grep ...
- matlab进阶
常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...
- Go语言 IDE之Gogland配置使用
Gogland 是 JetBrains 公司推出的 Go 语言集成开发环境.Gogland 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系.目前正式版尚未发布.官方:htt ...
- tail -f 与 tail -F的区别
使用tail -f监控某个文件,将在另一个窗口将该文件删除后,然后再新创建,那么我们会发现tail -f的监制失效了.而使用tail -F会再次进行监控.