2018.08.04 spoj TTM to the moon(主席树)
spoj传送门
vjudge传送门
主席树板子题。
支持历史版本的区间和,区间和,区间修改和时光倒流。
其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了。
如果想下传标记的话也行,需要在pushdown的时候新建一波节点。
代码:
#include<cstdio>
#include<cctype>
#define ll long long
#define N 100005
using namespace std;
inline ll read(){
ll ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
inline void write(ll x){
if(x<0)x=-x,putchar('-');
if(x>9)write(x/10);
putchar((x%10)^48);
}
inline ll max(ll a,ll b){return a>b?a:b;}
inline ll min(ll a,ll b){return a<b?a:b; }
int n,m,tot=0,rt[N*50],siz=0;
struct Node{int l,r;ll sum,add;}T[N*50];
inline void pushup(int p){T[p].sum=T[T[p].l].sum+T[T[p].r].sum;}
inline void build(int&p,int l,int r){
p=++tot;
if(l==r){T[p].sum=read();return;}
int mid=l+r>>1;
build(T[p].l,l,mid),build(T[p].r,mid+1,r),pushup(p);
}
inline void update(int&p,int las,int ql,int qr,int l,int r,ll v){
T[p=++tot]=T[las];
if(ql<=l&&r<=qr){T[p].add+=v;return;}
T[p].sum+=v*(min(qr,r)-max(ql,l)+1);
int mid=l+r>>1;
if(qr<=mid)update(T[p].l,T[las].l,ql,qr,l,mid,v);
else if(ql>mid)update(T[p].r,T[las].r,ql,qr,mid+1,r,v);
else update(T[p].l,T[las].l,ql,mid,l,mid,v),update(T[p].r,T[las].r,mid+1,qr,mid+1,r,v);
}
inline ll query(int p,int ql,int qr,int l,int r){
ll ret=T[p].add*(min(qr,r)-max(ql,l)+1);
if(ql<=l&&r<=qr)return T[p].sum+ret;
int mid=l+r>>1;
if(qr<=mid)return ret+query(T[p].l,ql,qr,l,mid);
if(ql>mid)return ret+query(T[p].r,ql,qr,mid+1,r);
return ret+query(T[p].l,ql,mid,l,mid)+query(T[p].r,mid+1,qr,mid+1,r);
}
int main(){
n=read(),m=read();
build(rt[0],1,n);
while(m--){
char op[2];
scanf("%s",op);
if(op[0]=='C'){int l=read(),r=read();ll v=read();++siz,update(rt[siz],rt[siz-1],l,r,1,n,v);}
if(op[0]=='Q'){int l=read(),r=read();printf("%lld\n",query(rt[siz],l,r,1,n));}
if(op[0]=='H'){int l=read(),r=read(),p=read();printf("%lld\n",query(rt[p],l,r,1,n));}
if(op[0]=='B')siz=read(),tot=rt[siz+1]-1;
}
return 0;
}
2018.08.04 spoj TTM to the moon(主席树)的更多相关文章
- SP11470 TTM - To the moon[主席树标记永久化]
SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...
- 新手C#string类常用函数的学习2018.08.04
ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower ...
- 新手C#int.Parse、int.TryParse的学习2018.08.04
int.Parse()用于将字符串转换为32为int类型,但是在遇到非数字或者类似1.545这种小数的时候会报错,后来采用了int.TryParse,这个在转换后会判断是否可以正常转换,若不能,会返回 ...
- 新手C#参数类型ref、out、params的学习2018.08.04
ref用于传递参数时,将实参传递到函数中,是引用参数,在使用前必须被赋值.string类型也同样适用. static void Main(string[] args) { string a1,a2; ...
- 新手C#重载、重写的学习2018.08.04
重载:在同一类(class)中,使用相同的方法名称,不同的参数和(不一定)不同的返回值类型构造成的方法. 举例: class OverLoadTest { public void Hello() { ...
- SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)
DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...
- SPOJ Count on a tree(主席树+LCA)
一.题目 COT - Count on a tree You are given a tree with N nodes. The tree nodes are numbered from 1 to ...
- SPOJ DQUERY D-query (在线主席树/ 离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...
- hdu4348 To the moon (主席树 || 离线线段树)
Problem Description Background To The Moon is a independent game released in November 2011, it is a ...
随机推荐
- 【转】Maven中-DskipTests和-Dmaven.test.skip=true的区别
主要区别是:是否编译测试类 -DskipTests:编译测试类,但不运行 -Dmaven.test.skip=true:不编译.不运行 转自 http://zephiruswt.blog.51cto. ...
- 常用html设置:
省略 居中 1. 省略 ellipsis: text-overflow:ellipsis: 要求容器必须是固定的,要不然无法做省略. table的省略 table{ table_layout:fixe ...
- Java使用poi生成Excel,生成两种表格下拉框
想要使用POI操作以xsl结尾的Excel,首先要下载poi相关的jar包,用到的jar有: poi-3.9.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.9.j ...
- 概率论与数理统计 Q&A:
--------------------------------- 大数定律:大量样本数据的均值(样本值之和除以样本个数),近似于随机变量的期望(标准概率*样本次数).(样本(部分)趋近于总体)中心极 ...
- Solving SharePoint Server 2010 - 503. The service is unavailable, After installation
Installed: SharePoint Server 2010 for Internet Enterprise Beta (x64) On: Windows Server 2008 Standar ...
- 基元线程同步构造之waithandle中 waitone使用
在使用基元线程同步构造中waithandle中waitone方法的讲解: 调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 Wait ...
- js json转对象
使用eval() 读取 for (var i=0;i< response.length; i++) { //alert(response[i].username) html=html+" ...
- spring boot 配置 freemarker
1.springboot 中自带的页面渲染工具为thymeleaf 还有freemarker 这两种模板引擎 简单比较下两者不同, 1.1freemaker 优点 freemarker 不足:thym ...
- Maven(Eclipse版)
前言: 由于最近工作学习,总是能碰到Maven的源码.虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下.这篇文章不是一个全面的Maven解析,而是一个简单的介绍,包括Eclips ...
- SharePoint 2010 外部数据类型
需求描述: 在sharepoint 2010有时需要访问外部的数据(如sql数据库). 参考文章: 外部内容类型 Business Connectivity Services ECT外部内容类型 Se ...