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和第一个数出现的位置(将这些位置组 ...
随机推荐
- Java 抽象类与oop三大特征
面向对象主要有三大特性:继承和多态.封装. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为: abstract voi ...
- leetcode Add and Search Word - Data structure design
我要在这里装个逼啦 class WordDictionary(object): def __init__(self): """ initialize your data ...
- 省市县联动dropdownlist
下面就是在提交按钮的单击事件中填写代码(代码区)(前提是把省市县的数据库建好) protected void Page_Load(object sender, EventArgs e) ...
- 一道常考fork题挖掘
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int ...
- sql语句按照汉字拼音首字母排序
oracle : 在oracle9i中新增了按照拼音.部首.笔画排序功能.设置NLS_SORT值SCHINESE_RADICAL_M 按照部首(第一顺序).笔划(第二顺序)排序SCHINESE_STR ...
- IOS - 响应者链条
简单来说就是:一级一级的找到响应的视图,如果没有就传给UIWindow实例和UIApplication实例,要是他们也处理不了,就丢弃这次事件... 对于IOS设备用户来说,他们操作设备的方式主要有三 ...
- 获得同级iframe页面的指定ID元素的几种实现方法
1.JS实现: var object= window.parent.frames("要获得的iframe的name").contentDocument.getElementById ...
- ios 横竖屏通知
屏幕切换时,会发送一个通知.只要注册一个通知: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(do ...
- cmd for备忘
=============参数 /d (参数只能显示当前目录下的目录名字)=================== rem 显示d:\work\目录下与*.txt相匹配的文件(如果报错就%i-> ...
- [网络流24题] 太空飞行计划(cogs 727)
[问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪 ...