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依次给每个气球涂一次颜色.但 ...
随机推荐
- 在百万数据中找出重复的数据sql
select * from (select count(name) as isone, name from tbl_org_departments group by name) t where t.i ...
- 后台字符串转化成json
function remotecontrol() { var progressbar = $("#progressbar"); $.ajax({ url: myurl, type: ...
- fill 函数
fill函数的作用是:将一个区间的元素都赋予val值.函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值. 例题:给你n ...
- POJ2109——Power of Cryptography
Power of Cryptography DescriptionCurrent work in cryptography involves (among other things) large pr ...
- Hbase二级索引
http://blog.sina.com.cn/s/blog_4a1f59bf01018apd.html
- Android开发之全屏显示的两种方法
1.通过修改清单文件中Theme,实现全屏 <application android:name=".MyApplication" android:allowBackup=&q ...
- Android开发之ListView-ArrayAdapter的使用
ArrayAdapter: ArrayAdapter<String>(Context context, int resource, int textViewResourceId, Stri ...
- Tomcat详解
解压缩下载的Tomcat压缩包,呈现的目录结构如下. bin:目录存放一些启动和关闭Tomcat的可执行程序和相关内容.conf:存放关于Tomcat服务器的全局配置.lib:目录存放Tomcat运行 ...
- CentOS6.5安装配置Samba
CentOS6.5安装配置Samba 本文的场景是虚拟机运行CentOS6.,本机是Win7,现欲把CentOS上的一个文件夹共享出来,Win的机器可以读写. Samba与window连接需要使用Ne ...
- poj 2635 The Embarrassed Cryptographer(数论)
题目:http://poj.org/problem?id=2635 高精度求模 同余模定理. 题意: 给定一个大数K,K是两个大素数的乘积的值.再给定一个int内的数L 问这两个大素数中最小的一个是 ...