版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4348

题意:

  一个长度为n的数组,4种操作 :

    (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 。

    (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 。

    (3)H l r t:查询时间戳t区间[l,r]的和 。

    (4)B t:将当前时间戳置为t 。

  所有操作均合法 。

解法:

  很明显是一道主席树的题 。

  对于每一次区间加法都新建节点建一棵线段树,加个懒惰标记就行了,查询的话直接线段树区间求和 。

  不过感觉这一题就是为可持续化数据结构写的,特别是时间戳这一点,当前时间戳的版本就是从上一个时间戳继承下来的,而且所有记录都保存了下来,好神奇,感觉对主席树的理解又加深了一点 。

code 主席树

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#define ll long long using namespace std; const int N=+; int root[N],tot;
int Ls[N*],Rs[N*],add[N*];
ll sum[N*]; int n,m; inline int bulidtree(int L,int R){
int k=tot++;
add[k]=; if (L==R){
scanf("%lld",&sum[k]);
return k;
} int mid=(L+R)>>;
Ls[k]=bulidtree(L,mid);
Rs[k]=bulidtree(mid+,R); sum[k]=sum[Ls[k]]+sum[Rs[k]]; return k;
} inline int update(int o,int L,int R,int x,int LL,int RR){
int k=tot++;
Ls[k]=Ls[o]; Rs[k]=Rs[o]; add[k]=add[o]; sum[k]=sum[o]; sum[k]+=(ll)x*(R-L+); if (LL==L && RR==R){
add[k]+=x;
return k;
} int mid=(LL+RR)>>;
if (R<=mid) Ls[k]=update(Ls[k],L,R,x,LL,mid);
else if (L>mid) Rs[k]=update(Rs[k],L,R,x,mid+,RR);
else {
Ls[k]=update(Ls[k],L,mid,x,LL,mid);
Rs[k]=update(Rs[k],mid+,R,x,mid+,RR);
} return k;
} inline ll query(int o,int L,int R,int LL,int RR){
if (L==LL && R==RR) return sum[o]; int mid=(LL+RR)>>; ll ret=(ll)add[o]*(R-L+); if (R<=mid) return ret+query(Ls[o],L,R,LL,mid);
else if (L>mid) return ret+query(Rs[o],L,R,mid+,RR);
else return ret+query(Ls[o],L,mid,LL,mid)+query(Rs[o],mid+,R,mid+,RR);
} int main(){
int x,L,R;
int now;
char ch[]; bool f=false; while (~scanf("%d%d",&n,&m)){
if (f) puts("");
else f=true; tot=;
root[]=bulidtree(,n);
now=; while (m--){
scanf("%s",ch);
if (ch[]=='C') {
scanf("%d%d%d",&L,&R,&x);
now++;
root[now]=update(root[now-],L,R,x,,n);
}
else if (ch[]=='Q') {
scanf("%d%d",&L,&R);
printf("%lld\n",query(root[now],L,R,,n));
}
else if (ch[]=='H'){
scanf("%d%d%d",&L,&R,&x);
printf("%lld\n",query(root[x],L,R,,n));
}
else if (ch[]=='B') {
scanf("%d",&now);
}
}
} return ;
}

最新文章

  1. iOS的多版本配置(版本分离,多环境配置)
  2. 【NodeJS 学习笔记01】不学就老了
  3. SQL SERVER 2008向ORACLE 11G迁移示例
  4. NOIP2005 篝火晚会 解题报告
  5. 使用变量替换批量部署GoldenGate
  6. linux find grep使用
  7. RGB與CIELAB色彩空間轉換
  8. IceMx.Mvc 我的js MVC 框架 二、视图的数据绑定
  9. C# 8.0的三个令人兴奋的新特性
  10. 你能选择出,前几个元素吗?使用纯css
  11. springMVC的controller
  12. 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2
  13. Lintcode481-Binary Tree Leaf Sum-Easy
  14. video 铺满父元素(object-fit: fill;)
  15. 《深入应用C++11:代码优化与工程级应用》勘误表
  16. 教你一步步composer安装Magento2.3
  17. 单一事件中心管理组件通信( vuex )
  18. graphviz 的绘图布局
  19. 001-jpa基本概念以及基础注解
  20. TTPPRC —— 商业分析模型

热门文章

  1. 基于 Java Web 的毕业设计选题管理平台--测试报告与用户手册
  2. 2017-08-20 block,inline和inline-block概念和区别
  3. [转帖知乎]5G 网络和 4G 网络有什么区别?
  4. day8——ajax传参到action(Struts2)
  5. BZOJ2734 HNOI2012集合选数(状压dp)
  6. MT【176】两两乘积
  7. MT【108】线面角最小
  8. Mountainous landscape
  9. idea中的pom文件中的jar包下载不了,手动下载jar包的方法
  10. 如何修改Linux的TTL值