题干:

Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the subsequence ai, ai+1, ..., aj.

Input

  • Line 1: n (1 ≤ n ≤ 30000).
  • Line 2: n numbers a1, a2, ..., an (1 ≤ ai ≤ 106).
  • Line 3: q (1 ≤ q ≤ 200000), the number of d-queries.
  • In the next q lines, each line contains 2 numbers i, j representing a d-query (1 ≤ i ≤ j ≤ n).

Output

  • For each d-query (i, j), print the number of distinct elements in the subsequence ai, ai+1, ..., aj in a single line.

Example

Input
5
1 1 2 1 3
3
1 5
2 4
3 5Output
3
2
3 

解题报告:

AC代码:(树状数组,mp存位置,其实也可以用一个pre数组去存位置,(需要先都初始化成-1),用时分别是170ms和150ms)

#include<bits/stdc++.h>using namespace std;
map<int ,int> mp;
struct Node {int l,r;int id;
} node[200000 + 5];
int n,m,c[30000 + 5],ans[200000 + 5];
int a[30000 + 5];
int lowbit(int x) {return x&-x;
}
void update(int x,int val) {while(x<=n) {c[x] += val;x+=lowbit(x);}
}
int query(int x) {int res = 0;while(x>0) {res += c[x];x-=lowbit(x);}return res;
}
bool cmp(const Node & a,const Node & b) {return a.r < b.r;
}
int main()
{while(~scanf("%d",&n) ) {memset(c,0,sizeof c);mp.clear();for(int i = 1; i<=n; i++) {scanf("%d",&a[i]);}scanf("%d",&m);for(int i = 1; i<=m; i++) {scanf("%d%d",&node[i].l,&node[i].r);node[i].id = i;}int cur = 1;sort(node+1,node+m+1,cmp);for(int i = 1; i<=m; i++) {while(cur <= node[i].r) {if(mp[a[cur] ] == 0) update(cur,1);else {update(mp[a[cur] ] ,-1);update(cur,1);}mp[a[cur] ] = cur;cur++;}ans[node[i].id] = query(node[i].r) - query(node[i].l - 1);}for(int i = 1; i<=m; i++) {printf("%d\n",ans[i]);}}return 0 ;
}

AC代码2:

#include<bits/stdc++.h>using namespace std;
const int MAX = 30000 + 5;
struct TREE {int l,r;int val;
} tree[MAX * 40];
int n,tot;
int pre[1000000 + 5],root[MAX],a[MAX];
int build(int l,int r) {int ne = ++tot;tree[ne].val = 0;tree[ne].l=tree[ne].r = 0;if(l == r) return ne;int m = (l+r)/2;tree[ne].l = build(l,m);tree[ne].r = build(m+1,r);return ne;
}
int update(int pos,int c,int val,int l,int r) {int ne = ++tot;tree[ne] = tree[c];tree[ne].val += val;if(l == r) return ne;int m = (l+r)/2;if(m >= pos) tree[ne].l = update(pos,tree[c].l,val,l,m);else tree[ne].r = update(pos,tree[c].r,val,m+1,r);return ne; }
int query(int pos,int c,int l,int r) {if(l == r) return tree[c].val;int m = (l+r)/2;if(m>=pos) return tree[tree[c].r].val + query(pos,tree[c].l,l,m);else return query(pos,tree[c].r,m+1,r);
}
int main()
{cin>>n;memset(pre,-1,sizeof pre);for(int i = 1; i<=n; i++) scanf("%d",a+i);root[0] = build(1,n);//构造主席树 for(int i = 1; i<=n; i++) {if(pre[a[i]] == -1) {root[i] = update(i,root[i-1],1,1,n);}else {int tmp = update(pre[a[i]],root[i-1],-1,1,n);root[i] = update(i,tmp,1,1,n);    }pre[a[i]]=i;}int q,x,y;cin>>q;while(q--) {scanf("%d%d",&x,&y);printf("%d\n",query(x,root[y],1,n));}return 0 ;
}

莫队算法:(还未做、。、)

【SPOJ - DQUERY】D-query(权值树状数组 或 主席树 或 莫队)相关推荐

  1. ICPC 徐州 H Yuuki and a problem (树状数组套主席树)

    Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...

  2. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  3. H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

    H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...

  4. 【BZOJ1901】Dynamic Rankings,树状数组套主席树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...

  5. #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)

    #279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...

  6. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  7. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

  8. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  9. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

最新文章

  1. contentProvider中有关query方法的使用
  2. sublime存模板_Sublime Text新建.vue模板并高亮
  3. linux7电脑配置要求,安装win7系统电脑配置有何要求--win10专业版
  4. js mztreeview 双击事件_Mac下的Node.js安装教程
  5. (马世龙)Linux下CACTI完全搭建技术文档二
  6. MySQL purge 线程
  7. virtualbox 给linux共享文件夹
  8. 威金Worm.Viking病毒分析及处理
  9. 提问的智慧 (How To Ask Questions The Smart Way)
  10. FineBI 的登录锁定配置修改
  11. quic client的数据发送流程
  12. ObjectMapper实现将Java对象转为json字符串
  13. 2022-2028年全球与中国救生艇行业市场前瞻与投资战略规划分析
  14. Arduino 开发ESP8266(ESP12F)模块
  15. 易淘食创始人口述:做外卖O2O的诀窍是“打穿商家”
  16. 工厂想要精益管理需要做好哪些基础性工作?
  17. ubuntu22.04 安装、DataGrip远程连接、卸载 MySQL8.0.33
  18. 基于OSG 和FCL 的碰撞仿真
  19. 从王者荣耀看设计模式(虚拟代理模式)
  20. 颅顶层次结构冠状切面图,大脑冠状切面解剖图

热门文章

  1. 计算机配置对电子竞技的影响,配置高并不是唯一优点 看看电竞硬件还要啥?...
  2. js 获取url问号前_PHP获取指定网页的HTML代码并执行输出
  3. ArcGIS将CAD等高线转换为TIN/DEM数据
  4. Kamailio 简介
  5. CE下基于Zylonite硬件平台的SD卡驱动开发
  6. python解释型语言的区别_什么是解释型语言?
  7. python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度
  8. 【转】DICOM开发工具总结
  9. 【转】从零开始学图形学:10分钟看懂贝塞尔曲线
  10. 【转】SVN各种颜色状态