链接:http://acm.hdu.edu.cn/showproblem.php?pid=5919

大致题意:

给你一个长度为n的序列,q个询问,每次询问是给你两个数x,y,经过与上一次的答案进行运算会得到一个区间[x,y],假设这个区间内有k个数,对k个数第一次出现的位置进行排序取第(k+1)/2个数。

思路:

看题意可知要求的是区间不同数的个数和区间第k小,强制在线,

之前正好写过求区间不同数的个数的三种解法:离线树状数组,主席树,莫队,因为这道题是强制在线,莫队和离线树状数组都不能用,这里就直接用主席树了。

题目要求各个数第一次出现的位置,那么我们只要从后向前插入,重复出现的取消之前的标记,这样维护的标记就都是当前坐标i到n区间内第一次出现的,用主席树维护下就好了。

用主席树求出区间不同数的个数num后, 直接再求区间第(num+1)/2小就好了

注意数组要开大点。。之前数组开小了 超时了

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 2e5 + ;
#define mid int m = (l + r) >> 1
int ls[M*],rs[M*],sum[M*],root[M],a[M],vis[M],idx,ans[M],n; void init()
{
idx = ;root[n+] = ; ans[] = ;
memset(ls,,sizeof(ls));
memset(vis,,sizeof(vis));
memset(rs,,sizeof(rs));
memset(sum,,sizeof(sum));
} void update(int old,int &k,int l,int r,int p,int c){
k = ++idx;
ls[k] = ls[old]; rs[k] = rs[old];
sum[k] = sum[old] + c;
if(l == r) return ;
mid;
if(p <= m) update(ls[old],ls[k],l,m,p,c);
else update(rs[old],rs[k],m+,r,p,c);
} int query(int x,int L,int R,int l,int r){ //求区间不同数的个数
if(L <= l&&R >= r) return sum[x];
mid,ret = ;
if(L <= m) ret += query(ls[x],L,R,l,m);
if(R > m) ret += query(rs[x],L,R,m+,r);
return ret;
} int query1(int x,int l,int r,int k){ //求区间第k小
if(l == r) return l;
mid,ret = sum[ls[x]];
if(ret >= k) return query1(ls[x],l,m,k);
else return query1(rs[x],m+,r,k - ret);
} int main()
{
int t,cas = ,q,x,y;
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&q);
for(int i = ;i <= n;i ++) scanf("%d",&a[i]);
for(int i = n;i >= ;i --){
int tmp = ;
if(vis[a[i]] == ) update(root[i+],root[i],,n,i,); //添加新标记
else{
update(root[i+],tmp,,n,vis[a[i]],-); //把之前的标记清掉
update(tmp,root[i],,n,i,); //添加新标记
}
vis[a[i]] = i;
}
for(int i = ;i <= q;i ++){
scanf("%d%d",&x,&y);
x = ((x + ans[i-])%n) + ;
y = ((y + ans[i-])%n) + ;
if(x > y) swap(x,y); //倒着输入的,所以取较小的
int num = (query(root[x],x,y,,n) + ) >> ; //得到中位数是区间内第num/2小的数
ans[i] = query1(root[x],,n,num); //求区间内第(num+1)/2小的数
}
printf("Case #%d: ",cas++);
for(int i = ;i < q;i ++) printf("%d ",ans[i]);
printf("%d\n",ans[q]);
}
return ;
}

hdu 5919 Sequence II (可持久化线段树)的更多相关文章

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

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

  2. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

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

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

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

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

  5. HDU 5919 Sequence II 主席树

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

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

  7. HDU 5919 -- Sequence II (主席树)

    题意: 给一串数字,每个数字的位置是这个数第一次出现的位置. 每个询问对于序列的一个子区间,设一共有k个不同的数,求第ceil(k/2)个数的位置. 因为强制在线,所以离线乱搞pass掉. 主席树可解 ...

  8. HDU - 5919 Sequence II

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

  9. HDU 3397 Sequence operation 多标记线段树

    /* 一开始维护了两个标记 开了两个数组 想的是 可能当前两种操作都要做 但是太复杂了 不好处理 其实 当前要做的标记可以只有一个 我们在Insert的时候 要打的标记是2即翻转区间: 1.如果原来是 ...

随机推荐

  1. Zephyr的Shell

    1 前言 通过Shell可以跟子系统打交道,子系统也可以提供很多接口供外部设置和读取信息. 下面就Shell的Kconfig配置.Shell的使用以及如何新建一个Shell命令展开. 可以说Shell ...

  2. 开源HTTP解析器---http-parser和fast-http

    由于项目中遇到需要发送http请求,然后再解析接收到的响应.大概在网上搜索了一下,有两个比较不错,分别是http-parser和fast-http. http-parser是由C编写的工具:fast- ...

  3. (推荐)用C++来开发Skyline应用

    原文地址:http://www.hailongchang.org/index.php/archives/category/terraexplorer 供大家学习参考.

  4. tensorflow笔记:多层LSTM代码分析

    tensorflow笔记:多层LSTM代码分析 标签(空格分隔): tensorflow笔记 tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) ten ...

  5. DOS文件转换成UNIX文件格式详解

    转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...

  6. Java Web应用开发中的一些概念

    最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...

  7. NTP服务部署和测试

    1. 概述2. 部署3. 配置4. 客户端配置4.1 客户端安装ntpdate4.2 同步设置 1. 概述 本篇博客主要记录如何部署一台NTP服务器,用于内网时间同步. 时间服务器对于集群内部节点之间 ...

  8. NB-IOT_BC95_B5常用AT指令集

    .AT+<cmd>=? 测试命令,用于向模块询问支持的设置项目. .AT+<cmd>? 读取命令,用于让模块上报某个命令代表的设置项当前的值. .AT+<cmd>= ...

  9. redis持久化策略梳理及主从环境下的策略调整记录

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...

  10. Python_装饰器_29

    # 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数 万能参数 # 装饰器的作用 # 原则 :开放封闭原则 # 语法糖 :@ # 装饰器的固定模式 import time # print( ...