hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II
Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 849 Accepted Submission(s): 204
In the i-th query, you are given two integers li and ri. Consider the subsequence ali,ali+1,ali+2,⋯,ari.
We can denote the positions(the positions according to the original sequence) where an integer appears first in this subsequence as p(i)1,p(i)2,⋯,p(i)ki (in ascending order, i.e.,p(i)1<p(i)2<⋯<p(i)ki).
Note that ki is the number of different integers in this subsequence. You should output p(i)⌈ki2⌉for the i-th query.
Each test case starts with two integers n (n≤2×105) and m (m≤2×105). There are n integers in the next line, which indicate the integers in the sequence(i.e., a1,a2,⋯,an,0≤ai≤2×105).
There are two integers li and ri in the following m lines.
However, Mr. Frog thought that this problem was too young too simple so he became angry. He modified each query to l‘i,r‘i(1≤l‘i≤n,1≤r‘i≤n). As a result, the problem became more exciting.
We can denote the answers as ans1,ans2,⋯,ansm. Note that for each test case ans0=0.
You can get the correct input li,ri from what you read (we denote them as l‘i,r‘i)by the following formula:
For each test case, output one line “Case #x: p1,p2,⋯,pm”, where x is the case number (starting from 1) and p1,p2,⋯,pm is the answer.
5 2
3 3 1 5 4
2 2
4 4
5 2
2 5 2 1 2
2 3
2 4
Case #2: 3 1
- /*
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
- problem:
- 给你n个数字,和m个查询.
- 将[l,r]之间数第一次出现的位置信息弄成一个新的数组,然后找出其中k/2大的数.(k为位置的数量)
- solve:
- 通过主席树能够找出[l,r]之间有多少个不同的数,然后利用再用一个查询找出第k大的即可.
- (都是类似与线段树的操作, T[i]存的是[1,n]的信息, 尽管说的只是[i,n] ,只是[1,i-1]的还没更新而已. 所以查询的时候出了点问题)
- hhh-2016-10-07 16:48:19
- */
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <stdio.h>
- #include <cstring>
- #include <vector>
- #include <math.h>
- #include <queue>
- #include <set>
- #include <map>
- //#define lson i<<1
- //#define rson i<<1|1
- #define ll long long
- #define clr(a,b) memset(a,b,sizeof(a))
- using namespace std;
- const int maxn = 200100;
- const int N = maxn * 100;
- template<class T> void read(T&num)
- {
- char CH;
- bool F=false;
- for(CH=getchar(); CH<'0'||CH>'9'; F= CH=='-',CH=getchar());
- for(num=0; CH>='0'&&CH<='9'; num=num*10+CH-'0',CH=getchar());
- F && (num=-num);
- }
- int stk[70], tp;
- template<class T> inline void print(T p)
- {
- if(!p)
- {
- puts("0");
- return;
- }
- while(p) stk[++ tp] = p%10, p/=10;
- while(tp) putchar(stk[tp--] + '0');
- putchar('\n');
- }
- int lson[N],rson[N],c[N];
- int a[maxn],T[maxn];
- int tot,n,m;
- int build(int l,int r)
- {
- int root = tot++;
- c[root ] = 0;
- if(l != r)
- {
- int mid = (l+r)>>1;
- lson[root] = build(l,mid);
- rson[root] = build(mid+1,r);
- }
- return root;
- }
- int update(int root,int pos,int val)
- {
- int newroot = tot ++ ,tmp= newroot;
- c[newroot] = c[root] + val;
- int l = 1,r = n;
- while(l < r)
- {
- int mid = (l + r) >> 1;
- if(pos <= mid)
- {
- lson[newroot] = tot++;
- rson[newroot] = rson[root];
- newroot = lson[newroot] ;
- root = lson[root];
- r = mid;
- }
- else
- {
- lson[newroot] = lson[root],rson[newroot] = tot++;
- newroot = rson[newroot],root = rson[root];
- l = mid + 1;
- }
- c[newroot] = c[root] + val;
- }
- return tmp;
- }
- int query(int root,int pos)
- {
- int cnt = 0;
- int l = 1,r = n;
- while(pos < r)
- {
- int mid = (l + r) >> 1;
- if(pos <= mid)
- {
- root = lson[root];
- r = mid;
- }
- else
- {
- cnt += c[lson[root]];
- root = rson[root];
- l = mid + 1;
- }
- }
- return cnt + c[root];
- }
- int Find(int root,int k)
- {
- int l = 1,r = n;
- while(l <= r)
- {
- int mid = (l + r) >> 1;
- if(l == r)
- return l;
- if(c[lson[root]] >= k)
- {
- root = lson[root];
- r = mid;
- }
- else
- {
- k -= c[lson[root]];
- root = rson[root];
- l = mid +1 ;
- }
- }
- }
- int main()
- {
- int t,cas = 1;
- // freopen("in.txt","r",stdin);
- read(t);
- while(t--)
- {
- tot = 0;
- read(n),read(m);
- for(int i = 1; i <= n; i++)
- scanf("%d",&a[i]);
- T[n + 1] = build(1,n);
- map<int,int> mp;
- for(int i = n; i >= 1; i--)
- {
- if(mp.find(a[i]) == mp.end())
- {
- T[i] = update(T[i + 1],i,1);
- }
- else
- {
- int tp = update(T[i+1],mp[a[i]],-1);
- T[i] = update(tp,i,1);
- }
- mp[a[i]] = i;
- }
- int ans = 0;
- int l,r;
- printf("Case #%d:",cas++);
- for(int i = 1; i <= m; i++)
- {
- read(l),read(r);
- // cout << l <<" " <<r << endl;
- l = (l + ans) % n + 1;
- r = (r + ans)%n + 1;
- if(l > r)
- swap(l,r);
- int num = (query(T[l],r)+1) >> 1;
- // if(!num) num = 1;
- ans = Find(T[l],num);
- printf(" %d",ans);
- }
- printf("\n");
- }
- return 0;
- }
hdu 5919 主席树(区间不同数的个数 + 区间第k大)的更多相关文章
- HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
xiaoxin and his watermelon candy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5654 Description Du ...
- Super Mario HDU 4417 主席树区间查询
Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...
- SPOJ 3267 求区间不同数的个数
题意:给定一个数列,每次查询一个区间不同数的个数. 做法:离线+BIT维护.将查询按右端点排序.从左到右扫,如果该数之前出现过,则将之前出现过的位置相应删除:当前位置则添加1.这样做就保证每次扫描到的 ...
- 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)
取板粗 好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...
- HDU 4348 主席树区间更新
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- SPOJ:D-query(非常规主席树求区间不同数的个数)
Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) ...
- SPOJ - DQUERY (主席树求区间不同数的个数)
题目链接:https://vjudge.net/problem/SPOJ-DQUERY 题目大意:给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数. 解题思路:从左向右一个一 ...
- HDU 6278 主席树(区间第k大)+二分
Just h-index Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)To ...
- POJ 2104 HDU 2665 主席树 解决区间第K大
两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R ...
随机推荐
- 201621123031 《Java程序设计》第6周学习总结
作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...
- 201621123043 《Java程序设计》第1周学习总结
1. 本章学习总结 Jdk的安装: eclipse的基本使用方法 Java发展史 jdk.jre.jvm 关键词之间的联系:是整个java的核心,包括了一堆java.java基础的类库.java运行环 ...
- C简单实现双向链表
<pre name="code" class="cpp">//链表结构 typedef struct DulNode { DataType data ...
- 【iOS】swift 让程序挂起后,能在后台继续运行任务
1,程序的挂起和退出 由于iOS设备资源有限.当用户点击了home键,或者另一个应用程序启动了.那么原先那个程序便进入后台被挂起,不是退出,只是停止执行代码,同时它的内存被锁定.当应用程序恢复时,它会 ...
- 新手入门 git
Git是目前世界上最先进的分布式版本控制系统 特点:高端大气上档次 什么是版本控制系统 系统自动记录文件改动 方便同事协作管理 不用自己管理一堆类似的文件了,也不需要把文件传来传去.如果想查看某次改动 ...
- python使用tesseract-ocr完成验证码识别(安装部分)
一.tesseract-ocr安装 Ubuntu版本: 1.tesseract-ocr安装 sudo apt-get install tesseract-ocr 2.pytesseract安装 sud ...
- TFTP通信原理
TFTP的通信流程 TFTP共定义了五种类型的包格式,格式的区分由包数据前两个字节的Opcode字段区分,分别是: · l 读文件请求包:Read request,简写为RRQ,对应Opcode字段值 ...
- Python内置函数(26)——enumerate
英文文档: enumerate(iterable, start=0) Return an enumerate object. iterable must be a sequence, an itera ...
- Apollo单向SSL认证(2)
一.生成ks和ts 二.连接测试 1.配置 2.测试
- kubernetes入门(09)kubernetes1.7集群安装(2017/11/13)
CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇) https://www.cnblogs.com/liangDream/p/7358847.html 一. ...