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(主席树)的更多相关文章

  1. SP11470 TTM - To the moon[主席树标记永久化]

    SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...

  2. 新手C#string类常用函数的学习2018.08.04

    ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower ...

  3. 新手C#int.Parse、int.TryParse的学习2018.08.04

    int.Parse()用于将字符串转换为32为int类型,但是在遇到非数字或者类似1.545这种小数的时候会报错,后来采用了int.TryParse,这个在转换后会判断是否可以正常转换,若不能,会返回 ...

  4. 新手C#参数类型ref、out、params的学习2018.08.04

    ref用于传递参数时,将实参传递到函数中,是引用参数,在使用前必须被赋值.string类型也同样适用. static void Main(string[] args) { string a1,a2; ...

  5. 新手C#重载、重写的学习2018.08.04

    重载:在同一类(class)中,使用相同的方法名称,不同的参数和(不一定)不同的返回值类型构造成的方法. 举例: class OverLoadTest { public void Hello() { ...

  6. SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)

    DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...

  7. 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  ...

  8. SPOJ DQUERY D-query (在线主席树/ 离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...

  9. hdu4348 To the moon (主席树 || 离线线段树)

    Problem Description Background To The Moon is a independent game released in November 2011, it is a ...

随机推荐

  1. JS 操作 file标签只上传照片

    在当前高版本浏览器里 在标签里加这个属性就够用了 accept="image/*" $('input[type="file"]').live('change', ...

  2. jetty异常

    异常一: java.net.BindException: Address already in use: bind jvm 1 | 2017-10-18 15:08:10,792+0800 WARN ...

  3. Java Socket通信实例

    一.简单的客户端与服务器一对一连接: Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Scket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关 ...

  4. Mybatis知识(1)

    1.#{}和${}的区别是什么? #{}是预编译处理,${}是字符串替换. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: M ...

  5. 使用ngxtop实时监控nginx

    Ngxtop实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top,所以这个软件起名ngxtop.有了ngxtop,你可以实时了解到当前nginx的访问状况,再也不需要tail ...

  6. PowerDesigner表生成 EXCEL

    今天收到一个需求,要把数据库设计给一个excel版本的,百度出来一个脚本文件,很好用发现,留个纪念 在pd中,shift+ctrl+X,打开脚本运行,脚本如下,附件也留了一份: '********** ...

  7. 大型运输行业实战_day06_1_购票功能简单实现

    1.添加购票按钮 对应的html代码 因为列表是js函数动态填充的,故添加按钮应该在js函数中,完整代码如下: /** * 注意在调用该函数时必须输入参数 * 查询+ 分页 * */ function ...

  8. Spring @Configuration

    下面是一个典型的spring配置文件(application-config.xml): <beans> <bean id="orderService" class ...

  9. 奇偶数判断1(if,else if语句)

    public class 奇偶数判断 { public static void main(String [] args){ float s = 9f; //取单浮点型变量s,可为任意值 float h ...

  10. 每月IT摘录201805

    摘录自互联网的前辈心得: 一.技术:0.精通一个淘汰的技术对你没有任何价值.学习的精力有限,更应该花在值得学的技术上.比如网络.操作系统.数据结构.算法1.工作要有定力,更多的应该是关心问题如何更有效 ...