题意

给定一个长度为 \(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(树状数组/主席树)相关推荐

  1. 线。段。树--树状数组-主席树

    简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...

  2. COGS-257-动态排名系统-树状数组+主席树

    描述 给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作: 1.查询A[i],A[i+1],A[i+2],...,A[j](1<=i< ...

  3. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  4. hdu 4417 Super Mario 树状数组||主席树

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  5. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  6. bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 8144  Solved: 3378 [ ...

  7. [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)

    problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi​. 如果到 iii 时,栈顶已经为 pip_ipi​ ...

  8. HDU 3333 Turing Tree(树状数组+离线处理+离散化)

    题目大意 给一个 n(1≤n≤30000) 个数,数的范围是 0~109.现在给了 Q 个询问,询问的内容是:一个区间 [L, R] 中,所有不同的数的和是多少? 其实和 HDU 3874 一个意思 ...

  9. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

最新文章

  1. 微信公众平台OAuth2.0授权
  2. asp.net FileUpload随想随记
  3. 【Android】资源加载过程
  4. solr 配置mysql数据源_solr data-config.xml配置文件的见解mysql数据源
  5. 使用before、after伪类制作三角形
  6. php post请求后端拿不到值_PHP Post获取不到非表单数据的问题解决办法
  7. c语言单链表超市出库,c语言-单链表(二)
  8. 可以获取get post url 传递参数的统一方法
  9. SQL SERVER 用户自定义函数如何定义.
  10. 服务器系统read,虚拟磁盘服务器系统的开发与实现-Read.PDF
  11. 百度面试题:从海量日志中提取访问百度次数最多的IP
  12. HTML转义字符最全集合
  13. cocos2d-x2.2.5走四棋儿源代码“开源”
  14. html改变鼠标指针形状代码,鼠标指针形状效果大全 cursor
  15. 网易蜗牛读书与微信读书竞品分析
  16. 计算机电路基础答案刘怀望,计算机电路基础
  17. Java方法重写和重载的区别
  18. 第二章 指令:计算机的语言
  19. 谈谈EOS的出块时间,不可逆时间,BFT
  20. 解决-手机通过Charles连接代理无法上网,亲测可用

热门文章

  1. SparkSql学习笔记(包含IDEA编写的本地代码)
  2. Android指纹识别
  3. VS2010上连接SQLite数据库
  4. ThinkPHP—URL的访问以及各种方法的操作
  5. python 中re模块学习随笔
  6. 浅谈压缩感知(十六):感知矩阵之RIP
  7. NetBPM工作流的一个示例-请假审批
  8. script标签中的defer和async属性
  9. 【Vue2.0】— TodoList案例(十七)
  10. 月收入不足三千的人,每月的开销都是怎样的?