题目大意:一个数组,四种操作:

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 (线段树区间更新)的更多相关文章

  1. Uva 12436 Rip Van Winkle's Code

    Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...

  2. UVA 12436 - Rip Van Winkle&#39;s Code(线段树)

    UVA 12436 - Rip Van Winkle's Code option=com_onlinejudge&Itemid=8&page=show_problem&cate ...

  3. Uva 12436 Rip Van Winkle&#39;s Code

    Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...

  4. POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】

    任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  5. codevs 1690 开关灯 线段树区间更新 区间查询Lazy

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  6. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  7. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  8. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  9. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  10. HDU 1698 线段树 区间更新求和

    一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...

随机推荐

  1. K2上海总部技术培训分享笔记

    第一部门 WinDdg 入门指南 1.NGen.exe --> native code 预编译,省去了.NET程序编译器JIT过程,是程序第一次运行也非常快. NGen 参考资料:http:// ...

  2. SrcollView分页加载数据(MainActivity)

    package com.baidu.mylistscroll; import java.util.ArrayList;import java.util.List; import com.baidu.a ...

  3. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  4. Twitter CEO:有望进军中国 不会改变原则

    新浪科技讯 8月12日下午消息,据台湾“中央社”报道,Twitter CEO科斯特洛(Dick Costolo)日前接受<日经新闻>专访时指出,Twitter有望进军中国大陆,科斯特洛表示 ...

  5. SharePoint 2013 开发——APP开发的考虑和建议

    博客地址:http://blog.csdn.net/FoxDave 需要考虑的方面: 1. 记得CSOM授予网站集及以下的权限,而场解决方案需要整个场的访问权限. 2. 由于应用程序是彼此完全独立 ...

  6. 一个完整的ansible实施目录示例

    当前目录:

  7. 《CheckboxDemo.java》

    import java.awt.*; import java.applet.Applet; public class CheckboxDemo extends Applet { String Uni[ ...

  8. 详解模块定义(.def)文件

    一个完整的Windows应用程序(C++程序)通常由五种类型的文件组成:源程序文件,头文件,资源描述文件,项目文件,模块定义文件.本文主要讲解模块定义文件. 模块定义 (.def)文件为链接器提供有关 ...

  9. (转)Position定位:relative | absolute

    原文:http://hi.baidu.com/zxc0420/item/9ada5110845ba1e89c778a08 Position定位:relative | absolute 定位一直是WEB ...

  10. 王家卫i

    〈旺角卡门〉 因为我很了解我自己,我不能对你承诺什么. 你不要说两次,说两次我就相信了. 我宁愿做一日英雄,都不想成世做条虫! 厨房里有煮好的饭,另外我还买了几个杯子,我知道,用不了多久就都会被打破, ...