题意:

给一串数字,每个数字的位置是这个数第一次出现的位置。

每个询问对于序列的一个子区间,设一共有k个不同的数,求第ceil(k/2)个数的位置。

因为强制在线,所以离线乱搞pass掉。

主席树可解。

考虑一个数列:

p      1 2 3 4 5 6  // 原序列标号

a : 1 2 1 2 3 4  // 原序列

p1  1 2 1 2 5 6  // 子序列开始下标为1

p2        2 3 1 5 6

p3           3 4 5 6

p4              4 5 6

p5                 5 6

p6                    6

有一个规律就是对于以L为开始的子序列来说,只要求出[L, N]的子区间,R是不影响P(L)数组的。

那么就想到将数组倒过来建主席树。

树里存的是什么呢????

存的是…【此处想了10分钟……】…区间内不同数的个数(只考虑第一次出现的)

那么在用一个数组记录每个数第一个出现的位置,每添加一个数,该位置+1,如果一个数之前出现过,那么就要更改之前第一次出现的位置-1。

不是很会主席树,之前就写过一道模板题= =  强行没看题解,一顿乱搞还是搞出来了,但是估计写的很麻烦

#include <bits/stdc++.h>
using namespace std; const int N = ; struct node {
int l, r, v;
} T[N*]; int a[N];
int pos[N];
int root[N], cnt;
int ans;
// y is x previous version
void update(int l, int r, int &x, int y, int p, int v) {
T[++cnt] = T[y], T[cnt].v += v; x = cnt;
if (l == r) return ;
int mid = (l+r) >> ;
if (mid >= p) update(l, mid, T[x].l, T[y].l, p, v);
else update(mid+, r, T[x].r, T[y].r, p, v);
} // p1 > p2
void update(int l, int r, int &x, int y, int p1, int v1, int p2, int v2) {
T[++cnt] = T[y]; x = cnt;
if (l == r) return ;
int mid = (l+r) >> ;
// three conditions
// p1 > mid >= p2, p1 > p2 > mid, mid >= p1 > p2
if (p1 > mid && p2 <= mid) {
update(mid+, r, T[x].r, T[y].r, p1, v1);
update(l, mid, T[x].l, T[y].l, p2, v2);
} else if (p2 > mid) {
update(mid+, r, T[x].r, T[y].r, p1, v1, p2, v2);
} else {
update(l, mid, T[x].l, T[y].l, p1, v1, p2, v2);
}
} void query(int l, int r, int x, int k) {
if (l == r) {
ans = l; return ;
}
int mid = (l+r) >> ;
if (T[T[x].r].v >= k) {
ans = mid+;
query(mid+, r, T[x].r, k);
} else {
query(l, mid, T[x].l, k-T[T[x].r].v);
}
} int query(int l, int r, int x, int L, int R) {
if (l >= L && r <= R) return T[x].v;
int mid = (l+r) >> ;
int ans = ;
if (mid >= L) ans += query(l, mid, T[x].l, L, R);
if (mid < R) ans += query(mid+, r, T[x].r, L, R);
return ans;
} int main()
{
//freopen("in.txt", "r", stdin);
int t, cas = ;
scanf("%d", &t); while (t--) {
printf("Case #%d:", ++cas);
ans = ;
int n, q, l_, r_, l, r, k;
scanf("%d%d", &n, &q);
memset(pos, , sizeof pos); cnt = ;
for (int i = ; i <= n; ++i) scanf("%d", &a[n-i+]);
for (int i = ; i <= n; ++i) {
if (pos[a[i]]) update(, n, root[i], root[i-], i, , pos[a[i]], -);
else update(, n, root[i], root[i-], i, );
pos[a[i]] = i;
}
while (q--) {
scanf("%d%d", &l_, &r_);
l_ = (l_ + ans) % n + ;
r_ = (r_ + ans) % n + ;
l = min(l_, r_);
r = max(l_, r_);
l = n-l+, r = n-r+; swap(l, r);
k = query(, n, root[r], l, r);
query(, n, root[r], ceil(k/2.0));
ans = n-ans+;
printf(" %d", ans);
}
printf("\n");
}
return ;
}

HDU 5919 -- Sequence II (主席树)的更多相关文章

  1. HDU 5919 Sequence II 主席树

    Sequence II Problem Description   Mr. Frog has an integer sequence of length n, which can be denoted ...

  2. HDU 5919 Sequence II(主席树+逆序思想)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  3. HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)

    HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...

  4. 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[ ...

  5. hdu 5919 Sequence II (可持久化线段树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5919 大致题意: 给你一个长度为n的序列,q个询问,每次询问是给你两个数x,y,经过与上一次的答案进行运算 ...

  6. HDU5919 Sequence II(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

  7. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  8. HDU - 5919 Sequence II

    题意: 给定长度为n的序列和q次询问.每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线. 题解: 用主席树从右向左的插入点.对于当前点i,如果a[i]出现过,则把原位置 ...

  9. HDU 5919 Sequence II(主席树+区间不同数个数+区间第k小)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...

随机推荐

  1. KMP入门题目[不定期更新]

    HDU 1711 Number Sequence(模板题) #include <cstdio> ; ; int N, M; int textS[MAXN]; int tarS[MAXL]; ...

  2. UINavigationController学习笔记

    http://site.douban.com/129642/widget/notes/5513129/note/187701199/ 1-view controllers的关系:Each custom ...

  3. github的large file storeage

    https://git-lfs.github.com/ 1.从这个网址下载git-lfs-windows-amd64-1.1.0.exe,运行这个安装包 2.然后打开git bash 输入git lf ...

  4. [HDOJ3635]Dragon Balls(并查集,路径压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3635 题意:有n个龙珠,n个城市.初始状态第i个龙珠在第i个城市里.接下来有两个操作: T A B:把 ...

  5. 对List顺序,逆序,随机排列实例代码

    ackage  Test; import  java.util.Collections; import  java.util.LinkedList; import  java.util.List; p ...

  6. SGU 187 - Twist and whirl -- want to cheat

    原题地址:http://acm.sgu.ru/problem.php?contest=0&problem=187 太开心啦!!!!这道题从2013年开始困扰我!!今天晚上第四次下定决心把它写一 ...

  7. apache开源项目 --Struts

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

  8. apache开源项目 -- tajo

    一.体系架构 Tajo采用了Master-Worker架构(下图虚线框目前还在计划中),Master-Worker-Client之间的RPC通信是使用Protocol buffer + Netty来实 ...

  9. noip2000提高组题解

    事实再次向我证明了RP的重要性... 第一题:进制转换 是我最没有把握AC的一道题目却是我唯一一道AC的题目,真是讽刺.看完题目几乎完全没有往正常的解法(取余倒序)去想,直接写了搜索,因为数据范围在2 ...

  10. poj 2773 Happy 2006

    // 题意 :给你两个数 m(10^6),k(10^8) 求第k个和m互质的数是什么这题主要需要知道这样的结论gcd(x,n)=1 <==> gcd(x+n,n)=1证明 假设 gcd(x ...