HDU 5919 Sequence II 主席树
Sequence II
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
nn
,有mm
次查询,每次查询一个区间[l,r][l,r]
,求区间中每一种数在区间中第一次出现的位置的中位数,强制在线。#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int N = 2e5 + , M = 1e6, mod = 1e9+, inf = 2e9; int T,n,q,a[N],l[N*],r[N*],v[N*],sz,root[N],ans[N],last[N]; void update(int x, int &y, int ll, int rr, int k,int c) {
y = ++sz;
v[y] = v[x] + c;
r[y] = r[x];
l[y] = l[x];
if(ll == rr) return ;
int mid = (ll+rr)>>;
if(k <= mid) update(l[x], l[y], ll, mid, k,c);
else update(r[x], r[y], mid + , rr, k,c);
}
int query(int x,int ll,int rr,int s,int t) {
if (s <= ll && rr <= t) return v[x];
int mid = ll + rr >> , res = ;
if (s <= mid) res += query(l[x], ll, mid, s, t);
if (t > mid) res += query(r[x], mid + , rr, s, t);
return res;
} int finds(int x,int ll,int rr,int k) {
if(ll == rr) return ll;
int mid = ll + rr >> ;
if(v[l[x]] >= k) return finds(l[x],ll,mid,k);
else return finds(r[x],mid+,rr,k-v[l[x]]);
} int main() {
int cas = ;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&q);
sz = ;
memset(last,,sizeof(last));
memset(v,,sizeof(v));
memset(l,,sizeof(l));
memset(r,,sizeof(r));
ans[] = ;
root[n+] = ;
for(int i = ; i <= n; ++i) scanf("%d",&a[i]);
for(int i = n; i >= ; --i) {
int x = root[i] = ;
update(root[i+],x,,n,i,);
if(last[a[i]]) {
update(x,root[i],,n,last[a[i]],-);
} else root[i] = x;
last[a[i]] = i;
}
int L,R;
for(int i = ; i <= q; ++i) {
scanf("%d%d",&L,&R);
L = ((L + ans[i-])%n) + ;
R = ((R + ans[i-])%n) + ;
if(L > R) swap(L,R);
int sum = query(root[L],,n,L,R) + >> ;
ans[i] = finds(root[L],,n,sum);
}
printf("Case #%d: ",++cas);
for(int i = ; i < q; ++i) printf("%d ",ans[i]);
cout<<ans[q]<<endl;
}
return ;
}
HDU 5919 Sequence II 主席树的更多相关文章
- HDU 5919 Sequence II(主席树+逆序思想)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)
HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...
- HDU 5919 -- Sequence II (主席树)
题意: 给一串数字,每个数字的位置是这个数第一次出现的位置. 每个询问对于序列的一个子区间,设一共有k个不同的数,求第ceil(k/2)个数的位置. 因为强制在线,所以离线乱搞pass掉. 主席树可解 ...
- HDU 5919 Sequence II(主席树)题解
题意:有A1 ~ An组成的数组,给你l r,L = min((l + ans[i - 1]) % n + 1, (r + ans[i - 1]) % n + 1),R = max((l + ans[ ...
- hdu 5919 Sequence II (可持久化线段树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5919 大致题意: 给你一个长度为n的序列,q个询问,每次询问是给你两个数x,y,经过与上一次的答案进行运算 ...
- HDU5919 Sequence II(主席树)
Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU - 5919 Sequence II
题意: 给定长度为n的序列和q次询问.每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线. 题解: 用主席树从右向左的插入点.对于当前点i,如果a[i]出现过,则把原位置 ...
- HDU 5919 Sequence II(主席树+区间不同数个数+区间第k小)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...
随机推荐
- ocket.chat 使用 Meteor 开发的实时协作工具,类似 丁丁。
ocket.chat 使用 Meteor 开发的实时协作工具,类似 丁丁. https://rocket.chat/
- android studio插件提升工作效率
SonarLint 代码质量管理插件 ButterKnife Zelezny ButterKnife 生成器,快速根据布局文件生成属性对象. SelectorChapek 设计师给我们提供好了各种资源 ...
- Python~if,while,for~顺序,判断,循环
if A: for -in : while x: if A:elif:else: 不能直接用int进行迭代,而必须加个range. range(len(L)) int ob ...
- Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装
简单介绍 关于运行时权限的说法,早在Google发布android 6.0的时候,大家也听得蛮多的.从用户的角度来讲,用户是受益方,更好的保护用户的意思,而对于开发者来说,无疑增加了工作量. 对于6. ...
- JavaBean中set/get的命名规范
今天遇到了这样的问题,在jsp取session中的值时,取不到.有个SessionUser对象,该对象有个uId属性,set/get方法为setUId/getUId,在jsp页面通过el表达式取值${ ...
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
/*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...
- 240个jquery插件(转)
http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/File upload Ajax File U ...
- 解的个数(codevs 1213)
题目描述 Description 已知整数x,y满足如下面的条件: ax+by+c = 0 p<=x<=q r<=y<=s 求满足这些条件的x,y的个数. 输入描述 Input ...
- JS_ECMA基本语法中的几种封装的小函数-1
今天给大家介绍js ECMA中几个封装的小函数以及一些常用的函数小案例: 1,找重复的函数 <script> //在数组里面找重复: function findInArr(n,arr){ ...
- Jpinyin笔记