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 ...
随机推荐
- Linux shell--基础指令
Linux shell--基础指令 浏览Linux文件系统 Linux中最基础也是最必要的一条指令 cd destination cd命令可接受单个参数destination,用以指定想切换到的目录名 ...
- 别不信!servlet获取到的参数值,也许完全出乎你的意料!
先贴出来简单得不能再简单的demo页面效果: 如下是spring mvc的Controller: @RequestMapping("mytest") @Controller pub ...
- Django 模板变量之 forloop
1. 模板变量之forloop.counter:从1开始自增1 模板代码如下: {% for row in v %} <tr> <td>{{forloop.counter}}& ...
- SQL语句添加表外键
ALTER TABLE 表名 ADD CONSTRAINT FK_ID FOREIGN KEY(外键列) REFERENCES 外键表(外键表主键)
- 非法指令(Illegal Instruction)问题定位
关键词:Illegal Instruction.SIGILL等. 进程在运行过程中会收到SIGILL信号,此类错误是由操作系统发送给进程的. SIGILL是某个进程中的某一句不能被CPU识别指令,这些 ...
- sed命令总结
目录 1.概述 2.查 1.打印整行(一或多) 2.正则打印包含关键字的行 2.增 3.删 4.改 5.后向引用 6.结合 7.练习 我叫张贺,贪财好色.一名合格的LINUX运维工程师,专注于LINU ...
- LINUX上安装JDK+tomcat+mysql操作笔记
1.环境准备: 1-1.centos 64位(本人的虚拟机安装此系统),安装步骤和网络配置已经在前两篇记录. 1-2.JDK 版本1.8 1-3.tomcat压缩包 1-4.CRT远程连接工具(可用其 ...
- 2019-2020-1 20199305《Linux内核原理与分析》第二周作业
C程序的反汇编 (一)实验截图 复制所需要的C程序到"剪切板" 在虚拟机环境下粘贴过来 接下来进行反汇编,通过输入gcc -S -o main.s main.c -m32得到32位 ...
- Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
docker pull nginx 遇到这个问题 Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: ...
- MySQL中使用group_concat遇到的坑
在使用group_concat的过程中遇到个问题,这里记录一下:在MySQL中有个配置参数group_concat_max_len,它会限制使用group_concat返回的最大字符串长度,默认是10 ...