题意:

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

每个询问对于序列的一个子区间,设一共有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. [HDOJ2795]Billboard(线段树,单点更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 题意:w*h的公告板要贴公告,公告是w*1的,每个公告有先后顺序,要使每个公告贴的位置尽可能地高 ...

  2. ie6调试工具Debugbar

    http://www.my-debugbar.com/wiki/Doc/DebugbarInstall

  3. linux/unix网络编程之epoll

    转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...

  4. Effective C++学习笔记 条款04:确定对象被使用前已先被初始化

    一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. class A { pu ...

  5. 命名空间“System.Web”中不存在类型或命名空间名称“Script”(是缺少程序集引用吗?)

    网上有些资料说,在项目上鼠标右键,添加引用→.Net→System.Web.Entensions就可以了. 实际上很多时候在项目中的添加引用窗口上,根本找不到System.Web.Entensions ...

  6. UVa 10943 (数学 递推) How do you add?

    将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ ...

  7. Share SDK 第三方登录

    import java.util.HashMap; import org.apache.http.Header; import android.app.Activity; import android ...

  8. fmri当前相关软件工具整理

    1.spm; 2.afni; 3.fsl; 4.drtools; 5.prtools; 6.phycaa+; 7.cca-fmri;

  9. django - django 承接nginx请求

    # -*- coding: utf-8 -*- import os import sys import tornado.ioloop import tornado.web import tornado ...

  10. 【转】有趣的Autolayout示例-Masonry实现

    原文网址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/ 好久没有写Blog了,这段时间有点忙啊=.=本文举了3个比较有“特点 ...