Sequence II HDU - 5919(主席树)
In the i-th query, you are given two integers lili and riri. Consider the subsequence ali,ali+1,ali+2,⋯,ariali,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)kip1(i),p2(i),⋯,pki(i) (in ascending order, i.e.,p(i)1<p(i)2<⋯<p(i)kip1(i)<p2(i)<⋯<pki(i)).
Note that kiki is the number of different integers in this subsequence. You should output p(i)⌈ki2⌉p⌈ki2⌉(i)for the i-th query.
Input
In the first line of input, there is an integer T (T≤2T≤2) denoting the number of test cases.
Each test case starts with two integers n (n≤2×105n≤2×105) and m (m≤2×105m≤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×105a1,a2,⋯,an,0≤ai≤2×105).
There are two integers lili and riri 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)li‘,ri‘(1≤li‘≤n,1≤ri‘≤n). As a result, the problem became more exciting.
We can denote the answers as ans1,ans2,⋯,ansmans1,ans2,⋯,ansm. Note that for each test case ans0=0ans0=0.
You can get the correct input li,rili,ri from what you read (we denote them as l‘i,r‘ili‘,ri‘)by the following formula:
Output
You should output one single line for each test case.
For each test case, output one line “Case #x: p1,p2,⋯,pmp1,p2,⋯,pm”, where x is the case number (starting from 1) and p1,p2,⋯,pmp1,p2,⋯,pm is the answer.
Sample Input
2
5 2
3 3 1 5 4
2 2
4 4
5 2
2 5 2 1 2
2 3
2 4
Sample Output
Case #1: 3 3
Case #2: 3 1
给出n个数,然后 m 个查询,查询对应区间的不同的数的个数 k, 以及第 (k+1)/2 个数的位置。
正序插入的主席树可以很容易的求出区间内不同数的个数,但是在求第 (k+1)/2 个数的位置时,由于树中有 L 之前的信息,不好直接查询出。
逆序插入的主席树和正序一样,都可以求出区间内不同数的个数,但在求第 (k+1)/2 个数的时候,没有 L 之前的信息,所以可以把问题转换成求这棵树上第 (k+1)/2 大的位置,就是普通的线段树了。
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int>
#define INOPEN freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 2e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m;
int cas, tol, T; struct Node{
int l, r;
int cnt;
} node[maxn * 40];
int a[maxn];
int rt[maxn];
int last[maxn]; void init() {
tol = 0;
mes(rt, 0);
mes(last, -1);
} void update(int l, int r, int &x, int y, int p, int v) {
x = ++tol;
node[x] = node[y];
node[x].cnt += v;
if(l == r) return ;
int mid = l + r >> 1;
if(p <= mid)
update(l, mid, node[x].l, node[y].l, p, v);
else
update(mid+1, r, node[x].r, node[y].r, p, v);
} int query_num(int l, int r, int pl, int pr, int rt) {
if(pl <= l && r <= pr) {
return node[rt].cnt;
}
int mid = l + r >> 1;
int ans = 0;
if(pl <= mid)
ans += query_num(l, mid, pl, pr, node[rt].l);
if(pr > mid)
ans += query_num(mid+1, r, pl, pr, node[rt].r);
return ans;
} int query_pos(int l, int r, int x, int k) {
if(l == r) return l;
int mid = l + r >> 1;
int cnt = node[node[x].l].cnt;
if(k <= cnt)
return query_pos(l, mid, node[x].l, k);
else
return query_pos(mid+1, r, node[x].r, k-cnt);
} int main() {
cas = 1;
scanf("%d", &T);
while(T--) {
init();
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) {
scanf("%d", &a[i]);
}
node[0].cnt = 0;
for(int i=n; i>=1; i--) {
if(last[a[i]] == -1) {
update(1, n, rt[i], rt[i+1], i, 1);
} else {
int tmp;
update(1, n, tmp, rt[i+1], last[a[i]], -1);
update(1, n, rt[i], tmp, i, 1);
}
last[a[i]] = i;
}
printf("Case #%d:", cas++);
int ans = 0;
while(m--) {
int l, r;
scanf("%d%d", &l, &r);
int tl = min((l+ans)%n+1, (r+ans)%n+1);
int tr = max((l+ans)%n+1, (r+ans)%n+1);
int k = query_num(1, n, tl, tr, rt[tl]);
k = (k + 1) / 2;
ans = query_pos(1, n, rt[tl], k);
printf(" %d", ans);
}
printf("\n");
}
return 0;
}
Sequence II HDU - 5919(主席树)的更多相关文章
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)
HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...
- Super Mario HDU 4417 主席树区间查询
Super Mario HDU 4417 主席树区间查询 题意 给你n个数(编号从0开始),然后查询区间内小于k的数的个数. 解题思路 这个可以使用主席树来处理,因为这个很类似查询区间内的第k小的问题 ...
- HDU 2655 主席树
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2665(主席树,无修改第k小)
Kth number Time Limit: 15000/5000 MS (Java/Others) ...
- #194 sequence(搜索+动态规划+主席树)
考虑按顺序暴搜子序列.如果序列中的数两两不同,显然每次给上一个找到的子序列添上后缀最小值,即为下一个要找的子序列.如果不能再加了就回溯继续考虑后缀次小.第三小……值,直到找到k个子序列. 有重复的数后 ...
- HDU 2852 主席树
KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 6278 主席树(区间第k大)+二分
Just h-index Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)To ...
- HDU 3333 & 主席树
题意: balabala SOL: 这题用主席树怎么做呢...貌似一模一样...一个一个建n棵的线段树.先把上一棵树复制下来,当a[i]出现过,就把这棵树里的那个位置去掉------一模一样的思维.. ...
随机推荐
- 使用Linq的泛型功能
泛型数据访问类: 业务抽象类使用数据访问类: 业务类继承业务抽象类: 使用业务类:
- 面向对象_内置函数 property
property 将方法伪装成为属性,可以不用加上()就可以调出其属性. 但是用__dict__,不能调出此属性 from math import pi class Circle: def __ini ...
- loadrunner脚本函数讲解
一. get请求和post请求区别:web_link(get).web_submit_form(post)依赖上下文,web_url.web_submit_data不依赖上下文,建议使用web_url ...
- private,protected,public和default的区别
private,protected,public和default的区别 除了default以外,其他都是Java语言的关键字.default代表的是对类成员没有进行修饰的情况.它本身也代表了一种访问控 ...
- webpack中插件 prerender-spa-plugin 来进行SEO优化(二十四)
vue.react对于开发单页应用来说带来了很好的用户的体验,但是同样有缺点,比如首页加载慢,白屏或SEO等问题的产生.为什么会出现这种情况呢?我们之前开发单页应用是这样开发的,比如首页 index. ...
- 目前在segmentfault写博客
不是打广告.只是由于自己体验之类的关系,转移到segmentfault了,地址 https://segmentfault.com/u/linlinma,欢迎关注和交流
- [Oracle维护工程师手记]Data Guard Broker中改属性是否需要两侧分别执行?
Data Guard Broker中改属性是否需要两侧分别执行? Data Guard Broker有一些属性,可以通过 show configuration 看到.我有时会想,这些个属性,是否是分别 ...
- HTML页面全屏/退出全屏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript日历控件开发
概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果 代码地址:https://github.com/aspwebchh/javascript-cont ...
- MacOS 安装 gdb 踩过的坑
今天在 OS X EI Capitan 10.11.6 中安装 gdb 的时候,出了一堆状况,写下此文以便以后能够时刻提醒自己. 解决方案 1.安装 gdb $ brew install gdb $ ...