2019CCPC网络选拔赛 hdu6703 array(主席树+set)
题意
给你一个1~n的排列,由两种操作:
1 pos:将a[pos]+10 000 000
2 r k:求大于等于k且不等于a[1~r]的数的最小值。
强制在线。
思路
如果没有1操作,那么我们直接主席树就OK了。
考虑不真正的进行修改,每次1操作就把a[pos]插进set,因为加10 000 000后肯定是大于n的,而k是小于等于n的,所以set里的数是可以用的。要和1r的数都不相同,那么我们用主席树查找区间r+1n+1的大于等于k的最小值即可,为什么是n+1呢,因为k<=n,如果k==n,那么满足条件且最小的数必定是n+1了。修改后的数的值变大了,而k<=n,显然这个修改后的值是对答案无影响的,但原来的值仍然是可以利用的,所以我们可以在set里二分查找第一个大于等于k的数,然后和主席树查到的取个最小值即可。
至于主席树查询的技巧:要剪枝,当sum[v]-sum[u]<=0时,表示这个区间不存在大于等于k的数,直接return inf;先判断是否k<=mid,才能往区间左边走,如果找到满足条件的数了我们就不必再往区间右边找了,因为右边的数肯定比左边大,相当于减了一半的时间。
代码
#include<bits/stdc++.h>
#define mid (l+r)/2
using namespace std;
const int N = 1e5+5;
int n, q, sz, num = 0;
int a[N], b[N], T[N];
int sum[N<<5], L[N<<5], R[N<<5],mi[N<<5];
#define inf 0x3f3f3f3f
inline int build(int l, int r)
{
int rt = ++ num;
sum[rt] = 0;
if (l < r)
{
L[rt] = build(l, mid);
R[rt] = build(mid+1, r);
}
return rt;
}
inline int update(int pre, int l, int r, int x)
{
int rt = ++ num;
L[rt] = L[pre];
R[rt] = R[pre];
sum[rt] = sum[pre]+1;
if (l < r)
{
if (x <= mid) L[rt] = update(L[pre], l, mid, x);
else R[rt] = update(R[pre], mid+1, r, x);
}
return rt;
}
inline int query(int u, int v, int l, int r, int k)
{
if(sum[v]-sum[u]<=0)
return inf;
if(l==r)
return l;
int ans=inf;
if(k<=mid)
ans=min(ans,query(L[u], L[v], l, mid, k));
if(ans==inf)
ans=min(ans,query(R[u], R[v], mid+1, r, k));
// cout<<ans<<endl;
return ans;
}
set<int> s;
int main()
{
int TT;
scanf("%d",&TT);
while(TT--)
{
s.clear();
scanf("%d%d", &n, &q);
num=0;
T[0] = build(1, n+1);
for (int i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
T[i] = update(T[i-1], 1, n+1, a[i]);
}
T[n+1]=update(T[n],1,n+1,n+1);
int ans=0;
while (q --)
{
int o,x,y;
scanf("%d", &o);
if(o==1)
{
scanf("%d",&x);
x^=ans;
s.insert(a[x]);
// ans=0;
}
else
{
scanf("%d%d",&x,&y);
x^=ans,y^=ans;
// cout<<x<<" "<<y<<endl;
set<int>::iterator it=s.lower_bound(y);
int t=inf;
if(it!=s.end())
t=*it;
// cout<<"t"<<t<<endl;
ans=min(query(T[x],T[n+1],1,n+1,y),t);
printf("%d\n",ans);
}
}
}
return 0;
}
2019CCPC网络选拔赛 hdu6703 array(主席树+set)的更多相关文章
- 2019ccpc网络赛hdu6703 array(线段树)
array 题目传送门 解题思路 操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数.注意到k的范围是小于等于n的,且n的范围是\(10^5\),远 ...
- hdoj6703 2019 CCPC网络选拔赛 1002 array
题意 description You are given an array a1,a2,...,an(∀i∈[1,n],1≤ai≤n). Initially, each element of the ...
- hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀数组
题意:给你一个长度为n的字符串,有q个询问,每次询问一个子串s(l,r)第k次出现的位置,若子串出现次数少于k次输出-1. 解题思路:先把SA跑出来,然后对于每次询问可以由l和rank[]找到l在所有 ...
- hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀自动机+线段树合并
解题思路: fail树上用权值线段树合并求right/endpos集合,再用倍增找到待查询串对应节点,然后权值线段树求第k大. #include<bits/stdc++.h> using ...
- HDU6703 array (线段树)
题意:长为1e5的全排列 有两个操作 把一个数删掉 询问1,r这个区间内 找到一个数大于等于x 且这个数不等于区间内的所有数 题解:建一颗权值线段树 线段树里存值为i的数在原数组中的坐标 维护坐标的最 ...
- hdu6075 2019CCPC网络选拔赛1004 path
题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值 解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询. 具体实 ...
- [2019CCPC网络赛][hdu6704]K-th occurrence(后缀数组&&主席树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6704 题意为查询子串s[l...r]第k次出现的位置. 写完博客后5分钟的更新 写完博客才发现这份代码 ...
- 2019CCPC网络赛 C - K-th occurrence HDU - 6704(后缀数组+ST表+二分+主席树)
题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. ...
- HDU 6447 - YJJ's Salesman - [树状数组优化DP][2018CCPC网络选拔赛第10题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 Problem DescriptionYJJ is a salesman who has tra ...
随机推荐
- 【Gradle】Gradle插件
Gradle插件 插件的作用 把插件应用到项目中,插件会扩展项目的功能,帮助在项目构建过程中做很多事情. 1.可以添加任务到项目中,帮助完成测试.编译.打包等. 2.可以添加依赖配置到项目中,可以通过 ...
- 解决MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.问题
突然发现昨天刚搭建的websocket不能连接了,提示: MISCONF Redis is configured to save RDB snapshots, but it is currently ...
- docker-compose 使用自定义网络并绑定 IP
0x00 事件 原先使用了 docker network create mynetwork 的方式创建了自定义网络,在使用 docker-compose 工具运行服务的时候,需要容器使用 mynetw ...
- 深入理解计算机系统cp1:存储单位与编码
摘要: 理解计算机是如何存储数据的. 原文:深入理解计算机系统cp1:存储单位与编码 作者:Chor Fundebug经授权转载,版权归原作者所有. 1. 存储单位 位:即 bit,表示二进制位,要么 ...
- WPF-自定义控件引用外部样式+转换器
引用单个外部样式 <UserControl.Resources> <ResourceDictionary Source="pack://application:,,,/XM ...
- Kafka学习(一)
官网 kafka.apache.org 集群部署 消息中间键 --> 分布式流式平台 Kafka Streaming Flume: 1个进程包含三个角色 source channle sink ...
- MSSQL 字段分组拼接
方法1:缺点,不去重,不去空:见表1 with t as( select 'A' parent, 'A1' child union all select 'A', 'A1' union all sel ...
- 9. Vue - vue-cli
一.前端开发工具 1. Node.js Node.js是一个基于Chrome v8引擎的JavaScript运行环境.JavaScript本来只能跑在浏览器上,然后Node.js就是一种能让js直 ...
- 算法问题实战策略 MEETINGROOM 附一份tarjan模板
地址 https://algospot.com/judge/problem/read/MEETINGROOM 解答 2-sat 代码样例过了 没有ac. 我又没有正确代码对拍..... 已确认是输出 ...
- CSP-S需备模板大全
CSP-S需备模板大全 谨以此文祝愿自己\(CSP-S\,\,2019\,\,\color{red}{RP++!!}\) 算法 二分 while(l<r) { int mid=(l+r+1)&g ...