HDU 3333 Turing Tree(树状数组/主席树)
题意
给定一个长度为 \(n\) 的序列,\(m\) 个查询,每次查询区间 \([L,R]\) 范围内不同元素的和。
\(1\leq T \leq 10\)
\(1 \leq n\leq 30000\)
\(1\leq m\leq 100000\)
思路
这道题没有强制在线,又没有修改,离线会比在线好想。
可以从第 \(1\) 个数到第 \(n\) 个数一次添加,并去除之前的相同元素,以此为顺序。就是说对于 \(m\) 个询问,按右端点进行排序,以此添加进每个数字并只保留最右端的数,借助 \(\text{map}\) 去重,区间和用树状数组维护。
假如要强制在线,该怎么办呢?
假如我们能力开下 \(n\) 个树状数组,就可以在线的查询了,可是 \(n\) 个树状数组肯定开不下,那动态开点线段树?可以,但是每次也是要把原来的线段树复制一遍,复杂度一累,时间过不去。
主席树的作用就体现出来了,回顾离线的写法,每次只会修改 \(1-2\) 个位置,那在前缀的基础上,保留原来的历史版本不就行了?这就是可持久化,详见代码。
代码
#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
typedef long long LL;
using namespace std;
const int N=3e5+5;
const int NN=1e7+2e6+5;struct ChairmanTree
{int lson[NN],rson[NN];LL sum[NN];int rt[N],tot;int &operator [](const int x){return rt[x];}void build(){memset(rt,0,sizeof(rt));sum[tot=0]=lson[0]=rson[0]=0;}void create(int &k){sum[++tot]=sum[k],lson[tot]=lson[k],rson[tot]=rson[k],k=tot;}void update(int &k,int x,int val,int l,int r){create(k);if(l==r){sum[k]+=val;return;}int mid=(l+r)>>1;if(x<=mid)update(lson[k],x,val,l,mid);else update(rson[k],x,val,mid+1,r);sum[k]=sum[lson[k]]+sum[rson[k]];}LL query(int k,int L,int R,int l,int r){if(!k)return 0;if(L<=l&&r<=R)return sum[k];int mid=(l+r)>>1;if(R<=mid)return query(lson[k],L,R,l,mid);else if(L>mid)return query(rson[k],L,R,mid+1,r);else return query(lson[k],L,R,l,mid)+query(rson[k],L,R,mid+1,r);}
}CT;
map<int,int>mp;int main()
{int T,n,m;scanf("%d",&T);while(T--){mp.clear();scanf("%d",&n);CT.build();FOR(i,1,n){int x;scanf("%d",&x);CT[i]=CT[i-1];if(mp[x])CT.update(CT[i],mp[x],-x,1,n);CT.update(CT[i],i,x,1,n);mp[x]=i;}scanf("%d",&m);while(m--){int x,y;scanf("%d%d",&x,&y);printf("%lld\n",CT.query(CT[y],x,y,1,n));}}return 0;
}
转载于:https://www.cnblogs.com/Paulliant/p/10144336.html
HDU 3333 Turing Tree(树状数组/主席树)相关推荐
- 线。段。树--树状数组-主席树
简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...
- COGS-257-动态排名系统-树状数组+主席树
描述 给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作: 1.查询A[i],A[i+1],A[i+2],...,A[j](1<=i< ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- hdu 4417 Super Mario 树状数组||主席树
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)
题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...
- bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 8144 Solved: 3378 [ ...
- [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)
problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi. 如果到 iii 时,栈顶已经为 pip_ipi ...
- HDU 3333 Turing Tree(树状数组+离线处理+离散化)
题目大意 给一个 n(1≤n≤30000) 个数,数的范围是 0~109.现在给了 Q 个询问,询问的内容是:一个区间 [L, R] 中,所有不同的数的和是多少? 其实和 HDU 3874 一个意思 ...
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
最新文章
- 微信公众平台OAuth2.0授权
- asp.net FileUpload随想随记
- 【Android】资源加载过程
- solr 配置mysql数据源_solr data-config.xml配置文件的见解mysql数据源
- 使用before、after伪类制作三角形
- php post请求后端拿不到值_PHP Post获取不到非表单数据的问题解决办法
- c语言单链表超市出库,c语言-单链表(二)
- 可以获取get post url 传递参数的统一方法
- SQL SERVER 用户自定义函数如何定义.
- 服务器系统read,虚拟磁盘服务器系统的开发与实现-Read.PDF
- 百度面试题:从海量日志中提取访问百度次数最多的IP
- HTML转义字符最全集合
- cocos2d-x2.2.5走四棋儿源代码“开源”
- html改变鼠标指针形状代码,鼠标指针形状效果大全 cursor
- 网易蜗牛读书与微信读书竞品分析
- 计算机电路基础答案刘怀望,计算机电路基础
- Java方法重写和重载的区别
- 第二章 指令:计算机的语言
- 谈谈EOS的出块时间,不可逆时间,BFT
- 解决-手机通过Charles连接代理无法上网,亲测可用