UVA 12436-Rip Van Winkle's Code(线段树的区间更新)
题意:
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(线段树的区间更新)的更多相关文章
- 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 ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1698:Just a Hook(线段树,区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- zoj3686(线段树的区间更新)
对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a ...
- Color the ball (线段树的区间更新问题)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
随机推荐
- Xcode常用设置
1.设置主题和字体大小 2.设置显示代码行号
- 演示demo开发问题及解决方案集锦
模型处理问题: 1. 3Dmax模型导入Unity单位设置: 自定义->单位设置->系统单位设置与显示单位比例都调成厘米 2. 3Dmax中材质贴图: 点击材质编辑器[在模式下可以选择精简 ...
- Nginx 的启动、停止、平滑重启、信号控制和平滑升级
Nginx 的启动 假设 nginx 安装在 /usr/local/nginx 目录中,那么启动 nginx 的命令就是: [root@localhost ~]# /usr/local ...
- android中的category静态值(转)
提供将要执行的action的额外信息,一般在隐式地启动activity时需要用到.常见的category如下 CATEGORY_ALTERNATIVE 设置这个activity是否可以被认为是用户正在 ...
- CF 136A Presents
http://codeforces.com/problemset/problem/136/A 题意 :就是输入很多数字,第 i 个数字 pi 代表着第 i 个人的礼物给了第 pi 个人,而让你输出的数 ...
- win8.1下使用vmware workstation 来编译ffmpeg
先吐槽下,T440预装的win8.1 采用 UEFI+GPT分区导致 无法使用传统的EasyBCD来达到win+ubuntu双系统效果, 尝试了2天全部失败,等以后有时间了 买块U盘再干掉win8 现 ...
- highChartTable 切换
<!doctype html> <html lang="en"> <head> <script type="text/javas ...
- SaaS系列介绍之一: SaaS的前身ASP介绍
1. 引言 未来将越来越不可预测,这是新经济最具挑战性的方面之一.商务和技术上的瞬息万变会产生变化,这既可以看作要防范的威胁,也可以看作应该欢迎的机遇. ...
- ENVI5.1安装破解教程
原文地址: ENVI5.1安装破解_百度经验 http://jingyan.baidu.com/article/020278118b5ded1bcd9ce57a.html ENVI5.1_x86 ...
- *IntelliJ IDEA使用Hibernate连接数据库
在IntelliJ IDEA中配置MySQL Database.