hdu 5919 Sequence II (可持久化线段树)
链接: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 (可持久化线段树)的更多相关文章
- HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)
HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...
- HDU 5919 Sequence II(可持久化线段树)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...
- 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(主席树+区间不同数个数+区间第k小)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...
- HDU 5919 Sequence II 主席树
Sequence II Problem Description Mr. Frog has an integer sequence of length n, which can be denoted ...
- 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 (主席树)
题意: 给一串数字,每个数字的位置是这个数第一次出现的位置. 每个询问对于序列的一个子区间,设一共有k个不同的数,求第ceil(k/2)个数的位置. 因为强制在线,所以离线乱搞pass掉. 主席树可解 ...
- HDU - 5919 Sequence II
题意: 给定长度为n的序列和q次询问.每次询问给出一个区间(L,R),求出区间内每个数第一次出现位置的中位数,强制在线. 题解: 用主席树从右向左的插入点.对于当前点i,如果a[i]出现过,则把原位置 ...
- HDU 3397 Sequence operation 多标记线段树
/* 一开始维护了两个标记 开了两个数组 想的是 可能当前两种操作都要做 但是太复杂了 不好处理 其实 当前要做的标记可以只有一个 我们在Insert的时候 要打的标记是2即翻转区间: 1.如果原来是 ...
随机推荐
- Zephyr的Shell
1 前言 通过Shell可以跟子系统打交道,子系统也可以提供很多接口供外部设置和读取信息. 下面就Shell的Kconfig配置.Shell的使用以及如何新建一个Shell命令展开. 可以说Shell ...
- 开源HTTP解析器---http-parser和fast-http
由于项目中遇到需要发送http请求,然后再解析接收到的响应.大概在网上搜索了一下,有两个比较不错,分别是http-parser和fast-http. http-parser是由C编写的工具:fast- ...
- (推荐)用C++来开发Skyline应用
原文地址:http://www.hailongchang.org/index.php/archives/category/terraexplorer 供大家学习参考.
- tensorflow笔记:多层LSTM代码分析
tensorflow笔记:多层LSTM代码分析 标签(空格分隔): tensorflow笔记 tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) ten ...
- DOS文件转换成UNIX文件格式详解
转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...
- Java Web应用开发中的一些概念
最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...
- NTP服务部署和测试
1. 概述2. 部署3. 配置4. 客户端配置4.1 客户端安装ntpdate4.2 同步设置 1. 概述 本篇博客主要记录如何部署一台NTP服务器,用于内网时间同步. 时间服务器对于集群内部节点之间 ...
- NB-IOT_BC95_B5常用AT指令集
.AT+<cmd>=? 测试命令,用于向模块询问支持的设置项目. .AT+<cmd>? 读取命令,用于让模块上报某个命令代表的设置项当前的值. .AT+<cmd>= ...
- redis持久化策略梳理及主从环境下的策略调整记录
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...
- Python_装饰器_29
# 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数 万能参数 # 装饰器的作用 # 原则 :开放封闭原则 # 语法糖 :@ # 装饰器的固定模式 import time # print( ...