题意

给你一个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)的更多相关文章

  1. 2019ccpc网络赛hdu6703 array(线段树)

    array 题目传送门 解题思路 操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数.注意到k的范围是小于等于n的,且n的范围是\(10^5\),远 ...

  2. 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 ...

  3. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀数组

    题意:给你一个长度为n的字符串,有q个询问,每次询问一个子串s(l,r)第k次出现的位置,若子串出现次数少于k次输出-1. 解题思路:先把SA跑出来,然后对于每次询问可以由l和rank[]找到l在所有 ...

  4. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀自动机+线段树合并

    解题思路: fail树上用权值线段树合并求right/endpos集合,再用倍增找到待查询串对应节点,然后权值线段树求第k大. #include<bits/stdc++.h> using ...

  5. HDU6703 array (线段树)

    题意:长为1e5的全排列 有两个操作 把一个数删掉 询问1,r这个区间内 找到一个数大于等于x 且这个数不等于区间内的所有数 题解:建一颗权值线段树 线段树里存值为i的数在原数组中的坐标 维护坐标的最 ...

  6. hdu6075 2019CCPC网络选拔赛1004 path

    题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值 解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询. 具体实 ...

  7. [2019CCPC网络赛][hdu6704]K-th occurrence(后缀数组&&主席树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6704 题意为查询子串s[l...r]第k次出现的位置. 写完博客后5分钟的更新 写完博客才发现这份代码 ...

  8. 2019CCPC网络赛 C - K-th occurrence HDU - 6704(后缀数组+ST表+二分+主席树)

    题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. ...

  9. 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 ...

随机推荐

  1. 【Gradle】Gradle插件

    Gradle插件 插件的作用 把插件应用到项目中,插件会扩展项目的功能,帮助在项目构建过程中做很多事情. 1.可以添加任务到项目中,帮助完成测试.编译.打包等. 2.可以添加依赖配置到项目中,可以通过 ...

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

  3. docker-compose 使用自定义网络并绑定 IP

    0x00 事件 原先使用了 docker network create mynetwork 的方式创建了自定义网络,在使用 docker-compose 工具运行服务的时候,需要容器使用 mynetw ...

  4. 深入理解计算机系统cp1:存储单位与编码

    摘要: 理解计算机是如何存储数据的. 原文:深入理解计算机系统cp1:存储单位与编码 作者:Chor Fundebug经授权转载,版权归原作者所有. 1. 存储单位 位:即 bit,表示二进制位,要么 ...

  5. WPF-自定义控件引用外部样式+转换器

    引用单个外部样式 <UserControl.Resources> <ResourceDictionary Source="pack://application:,,,/XM ...

  6. Kafka学习(一)

    官网 kafka.apache.org 集群部署 消息中间键 --> 分布式流式平台 Kafka Streaming Flume: 1个进程包含三个角色 source channle sink ...

  7. MSSQL 字段分组拼接

    方法1:缺点,不去重,不去空:见表1 with t as( select 'A' parent, 'A1' child union all select 'A', 'A1' union all sel ...

  8. 9. Vue - vue-cli

    一.前端开发工具 1. Node.js ​ Node.js是一个基于Chrome v8引擎的JavaScript运行环境.JavaScript本来只能跑在浏览器上,然后Node.js就是一种能让js直 ...

  9. 算法问题实战策略 MEETINGROOM 附一份tarjan模板

    地址 https://algospot.com/judge/problem/read/MEETINGROOM 解答  2-sat 代码样例过了 没有ac. 我又没有正确代码对拍..... 已确认是输出 ...

  10. CSP-S需备模板大全

    CSP-S需备模板大全 谨以此文祝愿自己\(CSP-S\,\,2019\,\,\color{red}{RP++!!}\) 算法 二分 while(l<r) { int mid=(l+r+1)&g ...