hdu 4348 To the moon (主席树)
版权声明:本文为博主原创文章,未经博主允许不得转载。
题意:
一个长度为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 ;
}
hdu 4348 To the moon (主席树)的更多相关文章
- HDU 4348 To the moon 主席树 在线更新
http://acm.hdu.edu.cn/showproblem.php?pid=4348 以前做的主席树没有做过在线修改的题做一下(主席树这种东西正经用法难道不是在线修改吗),标记永久化比较方便. ...
- hdu 4348 To the moon (主席树区间更新)
传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...
- HDU 4348 To the moon 主席树
题意: 给出一个长度为\(n(n \leq 10^5)\)的序列,最开始时间\(t=0\),支持下面几个操作: \(C \, l \, r \, d\):将区间\([l,r]\)每个数都加上\(d\) ...
- hdu 4348 To the moon 主席树区间更新
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Prob ...
- hdu 4348 To the moon (主席树 区间更新)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4348 题意: 4种操作: C l r c 区间[l,r]加c,时间+1 Q l r 询问当前时 ...
- HDU 4348 To the moon(主席树 区间更新)题解
题意: 给一个数组A[1] ~ A[n],有4种操作: Q l r询问l r区间和 C l r v给l r区间每个数加v H l r t询问第t步操作的时候l r区间和 B t返回到第t步操作 思路: ...
- HDU 4348 To the moon(主席树区间修改)
题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...
- HDU 4348 To the moon (主席树区间更新)
题意:首先给你n个数,开始时间为0,最后按照操作输出 给你四种操作: 1. C l r d : 在(l,r)区间都加上d,时间加一2. Q l r : 询问现在(l,r)的区间和3. H l r ...
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
随机推荐
- PAT 甲级 1079 Total Sales of Supply Chain
https://pintia.cn/problem-sets/994805342720868352/problems/994805388447170560 A supply chain is a ne ...
- python 如何写CMD命令工具
#-*- coding: UTF- -*- import argparse import sys: sys.argv.append('--help') parser = argparse.Argume ...
- Gerrit 配置同步到多个仓库
1.修改replication.config文件 [remote "xxx"] projects = Yilule.Core.Service #aliyun仓库 url = git ...
- [转载]Docker 完全指南
Docker 完全指南 原作者地址: https://wdxtub.com/2017/05/01/docker-guide/ 发表于 2017-05-01 | 更新于 2017-08-03 | ...
- 转帖:Android 官方推荐 : DialogFragment 创建对话框
转: Android 官方推荐 : DialogFragment 创建对话框 复制内容,留作备份 1. 概述 DialogFragment在android 3.0时被引入.是一种特殊的Fragment ...
- leetcode Database4
一.Department Top Three Salaries The Employee table holds all employees. Every employee has an Id, an ...
- Duplicate spring bean id
问题背景:从本地调用服务器的dubbo接口进行测试 实现思路:基于IDEA+Spring+maven+Dubbo搭建测试项目,从本地直接调用 具体实现思路可参考博客:https://www.cnb ...
- Valid BFS? CodeForces - 1037D(思维 bfs)
我真是一只菜狗......emm... 题意: 判断一个从1开始的队列是否可以按照bfs的顺序 进行遍历..必须从1开始...然后后边依次是bfs顺序 解析: 看代码能看懂吧...emm...就是把每 ...
- MT【98】三元对称不等式
评:这是一道浙江省省赛题,这里利用对称性,设$x\le y\le z$从而解决了问题.值得注意的是此处三元轮换对称正好也是完全对称,但如果变成一般的$n\ge4$元对称问题时,就不能设大小关系.事实上 ...
- 【bzoj4765】 普通计算姬
题意 给出一棵有根树,$n$个点每个都有一个点权.$m$组操作每次可以修改一个点权或者询问编号在区间$[l,r]$的点的子树权值和的和. Solution 我们对节点编号分块,每一块统计该块中的节点的 ...