题意:

long long data[250001];

void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = data[i] + (i - st + 1); }

void B( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = data[i] + (nd - i + 1); }

void C( int st, int nd, int x ) { for( int i = st; i \le nd; i++ ) data[i] = x; }

long long S( int st, int nd ) { long long res = 0; for( int i = st; i \le nd; i++ ) res += data[i]; return res; }

四个函数,对应四种操作A、B、C、S给出m个操作,求s操作时返回的结果。

分析:

明显的线段树的区间更新,但懒惰标记的选择要想一想,C这个操作好处理、我们观察A、B发现都是加上一个等差数列、等差数列加等差数列还是等差数列、那我们选择等差数列的首项和公差做标记。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<1|1
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
#define N 250001
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = ;
struct node{
ll a1,d,sum,setv;
int l,r;
}t[N<<];
void pushup(int rt){
t[rt].sum=t[rt<<].sum+t[rt<<|].sum;
}
void pushdown(int rt){
if(t[rt].setv!=INF){
t[rt<<].setv=t[rt<<|].setv=t[rt].setv;
t[rt<<].a1=t[rt<<].d=t[rt<<|].a1=t[rt<<|].d=;
t[rt<<].sum=1LL*(t[rt<<].r-t[rt<<].l+)*t[rt].setv;
t[rt<<|].sum=1LL*(t[rt<<|].r-t[rt<<|].l+)*t[rt].setv;
t[rt].setv=INF;
}
if(t[rt].a1||t[rt].d){
ll len1=t[rt<<].r-t[rt<<].l+;
ll len2=t[rt<<|].r-t[rt<<|].l+;
ll tmp1=t[rt].a1;
ll tmp2=tmp1+len1*t[rt].d;
t[rt<<].a1+=tmp1;
t[rt<<|].a1+=tmp2;
t[rt<<].d+=t[rt].d;
t[rt<<|].d+=t[rt].d;
t[rt<<].sum+=tmp1*len1+len1*(len1-)/*t[rt].d;//等差数列求和
t[rt<<|].sum+=tmp2*len2+len2*(len2-)/*t[rt].d;
t[rt].a1=t[rt].d=;
}
}
void build(int l,int r,int rt){
t[rt].l=l;
t[rt].r=r;
t[rt].sum=t[rt].a1=t[rt].d=;
t[rt].setv=INF;
if(l==r)return;
int m=(l+r)>>;
build(lson);
build(rson);
pushup(rt);
}
void update_add(int l,int r,int rt,ll d){
if(l<=t[rt].l&&r>=t[rt].r){
ll a1=(d==)?(t[rt].l-l+):(r-t[rt].l+);//确定首项
ll len=t[rt].r-t[rt].l+;
t[rt].a1+=a1;
t[rt].d+=d;
t[rt].sum+=a1*len+len*(len-)/*d;
return;
}
pushdown(rt);
int m=(t[rt].l+t[rt].r)>>;
if(l<=m)update_add(l,r,rt<<,d);
if(r>m)update_add(l,r,rt<<|,d);
pushup(rt);
}
void update_set(int l,int r,int rt,ll x){
if(l<=t[rt].l&&r>=t[rt].r){
t[rt].setv=x;
t[rt].a1=t[rt].d=;
t[rt].sum=1LL*(t[rt].r-t[rt].l+)*x;
return;
}
pushdown(rt);
int m=(t[rt].l+t[rt].r)>>;
if(l<=m)update_set(l,r,rt<<,x);
if(r>m)update_set(l,r,rt<<|,x);
pushup(rt);
}
ll query(int l,int r,int rt){
if(l<=t[rt].l&&r>=t[rt].r){
return t[rt].sum;
}
pushdown(rt);
ll num=;
int m=(t[rt].l+t[rt].r)>>;
if(l<=m)num+=query(l,r,rt<<);
if(r>m)num+=query(l,r,rt<<|);
return num;
}
int main()
{
int n,tll,trr;
ll x;
char op[];
build(,N,);
scanf("%d",&n);
while(n--){
scanf("%s%d%d",op,&tll,&trr);
if(op[]=='A'){
update_add(tll,trr,,);
}
else if(op[]=='B')
update_add(tll,trr,,-);
else if(op[]=='C'){
scanf("%lld",&x);
update_set(tll,trr,,x);
}
else if(op[]=='S'){
printf("%lld\n",query(tll,trr,));
}
}
return ;
}

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. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. hdu 1698:Just a Hook(线段树,区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. hdu1698线段树的区间更新区间查询

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...

  8. zoj3686(线段树的区间更新)

    对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a ...

  9. Color the ball (线段树的区间更新问题)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

随机推荐

  1. SVN 迁移

    前段时间公司的SVN服务器做升级,需要做SVN迁移,百度谷歌了解了大概,在测试环境试了一下,没什么问题,然后改在正式环境做,迁移成功.之前用的是1.6,我看了下官网有1.8,征得同意后就直接升级加迁移 ...

  2. GameAdmin

    username:root e-mail :123@qq.com password:123

  3. 修改MYSQL数据库表的字符集

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  4. POJ1260Pearls

    http://poj.org/problem?id=1260 题意 :这个题大概是讲,给你几种等级不同的珠宝,然后告诉你它的数量和价值,等级是升序排列的,且随等级的升高价值也随之升高,但为了防止有的客 ...

  5. MysqlHelper类

    连接方式:server=localhost;port=3306;userid=root;password=123456789;database=mysql;persist security info= ...

  6. cocos2d-x 添加 libLocalStorage 库...

    说明:由于libLocalStorage底层是用sqlite实现的,所以要先按上面官方提供的集成sqlite的文档,将sqlite添加到项目中. 重点还是android的编译配置,加粗的是需要增加的配 ...

  7. [topcoder]FlowerGarden

    1.此题很勉强算DP.找了半天网上思路,是个三层的循环,n^3.2.基本思路就是先找到在第一个位置的花.这样就双层遍历,找到所有和其他不冲突的花中最高的一个,然后放到结果的首位.然后去掉此花,继续使用 ...

  8. FocusWriter

    2. FocusWriter 如果你正在从事某种写作——小说.博客.文档等——你绝对希望认识一下FocusWriter.它已经有近十年的发布历史了,但是一直是我们最喜欢的无分心写作应用之一.如果你希望 ...

  9. Bridging signals ZOJ 3627 POJ1631 HDU1950

    题意:给出一个从1-n的数字排列,求最长上升子序列长度. 直接说解法吧.新开一个数组d,d[i]表示的是能构成长度为i的上升子序列的在原序列中最后的那个数值.程序的主要过程:当循环到第i个的时候,如果 ...

  10. Hadoop常用命令汇总

    启动Hadoop 进入HADOOP_HOME目录. 执行sh bin/start-all.sh 关闭Hadoop 进入HADOOP_HOME目录. 执行sh bin/stop-all.sh 1.查看指 ...