UVA-12436 Rip Van Winkle's Code (线段树区间更新)
题目大意:一个数组,四种操作:
long long data[250001];
void A( int st, int nd ) {
for( int i = st; i <= nd; i++ ) data[i] = data[i] + (i - st + 1);
}
void B( int st, int nd ) {
for( int i = st; i <= nd; i++ ) data[i] = data[i] + (nd - i + 1);
}
void C( int st, int nd, int x ) {
for( int i = st; i <= nd; i++ ) data[i] = x;
}
long long S( int st, int nd ) {
long long res = 0;
for( int i = st; i <= nd; i++ ) res += data[i];
return res;
}
模拟这四种操作。
题目分析:三种更新操作,一种询问操作。三种更新实际上是两种,add更新(等差数列做加减运算仍是等差数列)和set更新,add更新的懒标记记录首项、尾项和公差。
代码如下:
# include<bits/stdc++.h>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2) const int N=250000; struct Node
{
LL sum;
LL x,d,st,ed;
bool lazy_set;
bool lazy_add;
};
Node tr[(N+5)*4+100];
char op[2]; void clear_lazy(int rt)
{
tr[rt].lazy_add=false;
tr[rt].d=tr[rt].st=tr[rt].ed=0;
} void change1(int rt,int l,int r,LL st,LL ed,LL d)
{
tr[rt].lazy_add=true;
tr[rt].sum+=(LL)(r-l+1)*(st+ed)/2;
tr[rt].st+=st;
tr[rt].ed+=ed;
tr[rt].d+=d;
} void change2(int rt,int l,int r,LL x)
{
tr[rt].lazy_set=true;
tr[rt].sum=(LL)(r-l+1)*x;
tr[rt].x=x; clear_lazy(rt);
} void pushUp(int rt)
{
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
} void pushDown(int rt,int l,int r)
{
if(tr[rt].lazy_set){ change2(rt<<1,l,mid,tr[rt].x);
change2(rt<<1|1,mid+1,r,tr[rt].x);
tr[rt].lazy_set=false;
}
if(tr[rt].lazy_add){ LL st=tr[rt].st;
LL ed=tr[rt].ed;
int d=tr[rt].d; change1(rt<<1,l,mid,st,st+d*(mid-l),d);
change1(rt<<1|1,mid+1,r,st+d*(mid-l+1),ed,d); clear_lazy(rt);
}
} void build(int rt,int l,int r)
{
tr[rt].lazy_set=false;
tr[rt].lazy_add=false;
tr[rt].sum=tr[rt].d=0;
tr[rt].st=tr[rt].ed=0;
if(l==r) return ;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
} void update1(int rt,int l,int r,int L,int R,LL d)
{
if(L<=l&&r<=R){
if(d>0){
change1(rt,l,r,l-L+1,r-L+1,d);
}else{
change1(rt,l,r,R-l+1,R-r+1,d);
}
}else{
pushDown(rt,l,r);
if(L<=mid) update1(rt<<1,l,mid,L,R,d);
if(R>mid) update1(rt<<1|1,mid+1,r,L,R,d);
pushUp(rt);
}
} void update2(int rt,int l,int r,LL L,LL R,LL x)
{
if(L<=l&&r<=R){
change2(rt,l,r,x);
}else{
pushDown(rt,l,r);
if(L<=mid) update2(rt<<1,l,mid,L,R,x);
if(R>mid) update2(rt<<1|1,mid+1,r,L,R,x);
pushUp(rt);
}
} LL query(int rt,int l,int r,LL L,LL R)
{
if(L<=l&&r<=R) return tr[rt].sum;
pushDown(rt,l,r);
LL res=0;
if(L<=mid) res+=query(rt<<1,l,mid,L,R);
if(R>mid) res+=query(rt<<1|1,mid+1,r,L,R);
return res;
} int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
build(1,1,N);
LL a,b,c;
while(n--)
{
scanf("%s",op);
if(op[0]=='A'){
scanf("%lld%lld",&a,&b);
update1(1,1,N,a,b,1ll);
}else if(op[0]=='B'){
scanf("%lld%lld",&a,&b);
update1(1,1,N,a,b,-1ll);
}else if(op[0]=='C'){
scanf("%lld%lld%lld",&a,&b,&c);
update2(1,1,N,a,b,c);
}else{
scanf("%lld%lld",&a,&b);
printf("%lld\n",query(1,1,N,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(线段树)
UVA 12436 - Rip Van Winkle's Code option=com_onlinejudge&Itemid=8&page=show_problem&cate ...
- Uva 12436 Rip Van Winkle's Code
Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...
- POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】
任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total S ...
- codevs 1690 开关灯 线段树区间更新 区间查询Lazy
题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
随机推荐
- Html.ActionLink , Url.Action
也来总结一下 以后省的忘了 都是从controller中获取到action名字返回 html.actionlink 返回的是带<a> 标签的超链接 url.action 是返回正常cont ...
- javascript 变量声明有var与无var 的区别
1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量.使用var定义var a = 'hello World';function bb(){var a = 'hello B ...
- c规范(1)
1文件结构 头文件.h 保存文件声明 定义文件.c 程序实现 2版本标示 用注释 (1)版权信息. (2)文件名称,标识符,摘要. (3)当前版本号,作者 修改者,完成日期. (4)版本历史信息. ...
- 实用的WPF Xml的简易读写类以及用法示例
转自:http://www.silverlightchina.net/html/study/WPF/2012/0808/17980.html 最近真是写博客写的不可收拾,今天再来一篇. 因为做一些程序 ...
- The constness of a method should makes sense from outside the object
C++的encapsulation机制使得我们可以使得一个类的逻辑接口和内部表示有很大的差异,比如下面这个矩形类: class Rectangle { public: int width() cons ...
- JAVA判断当前时间是上午am还是下午pm
//结果为"0"是上午 结果为"1"是下午 public class GregorianTest { public static void main(Strin ...
- Js的 "继承"
Js 和 Java , C等语言不是很一样 . 其他语言有 类和实例 但是Js就比较特殊 , 所以 类和实例 只能说是大多数面向对象编程的语言的基本概念 . Js比较特殊 , 它不去分类和实例的概念 ...
- Eclipse的maven构建一个web项目,以构建SpringMVC项目为例
http://www.cnblogs.com/javaTest/archive/2012/04/28/2589574.html springmvc demo实例教程源代码下载:http://zuida ...
- Quirks模式是什么?
什么是DOCTYPE: DOCTYPE,或者称为 Document Type Declaration(文档类型声明,缩写 DTD).通常情况下,DOCTYPE 位于一个 HTML 文档的最前面的 位置 ...
- 学习和使用PHP应该注意的10件事
1 多阅读手册和源代码 没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西,特别是很多有关于字符串和数组的 函数.就在这些函数里面包括许多有用的功能,如果你仔细阅读手册,你会经常 ...