hdu6703 线段树+set
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6703
给你一个数组两种操作。操作一是将pos位置的数字加上10000000;操作二是给你个r和k,问你最小的不小于k且没在数组a的[1,r]这个区间内出现过,并输出这个数。(pos,r,k均需异或上一次的答案,初始答案为零)。
因为k不大于n所以如果某个位置的数进行了操作一那么就代表下一次的操作二选出来的数可能是这个数。
我们用线段树维护最大的位置,线段树的节点表示值,节点存的是这个值在数组a中的位置。每次进行操作二时,我们查询线段树区间[k,n]内大于r的最小值。
因为如果进行了操作一后,线段树找出的值不一定就是最小的了,所以我们还要从所有进行了操作一的数中找出最小的且大于等于k的数,答案就是这两个数中最小的数。
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define maxn 100005
int maxx[maxn<<],a[maxn],b[maxn],v[maxn];
int t,n,m;
inline void pushup(int rt)
{
maxx[rt]=max(maxx[rt<<],maxx[rt<<|]);
}
inline void build(int l,int r,int rt)
{
if(l==r)
{
maxx[rt]=b[l];
return ;
}
int mid=l+r>>;
build(ls);build(rs);
pushup(rt);
}
inline int fid(int k,int l,int r,int rt)//返回的是在不考虑操作一下符合的最小值
{
if(l==r)
{
if(maxx[rt]>=k)return l;
else return n+;
}
int mid=l+r>>;
int ret=n+;
//如果左儿子的最大值大于k,那么就往左区间找,因为这代表值在[l,mid]内的数有出现数组a的第r个之后的(r是题目给的r)
if(maxx[rt<<]>=k)ret=min(ret,fid(k,ls));
//如果右儿子的最大值大于k,那么就往右区间找
else if(maxx[rt<<|]>=k)ret=min(ret,fid(k,rs));
return ret;
}
inline int query(int L,int R,int k,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
return fid(k,l,r,rt);
}
int mid=l+r>>;
int ret=n+;
if(L<=mid)ret=min(ret,query(L,R,k,ls));
if(R>mid)ret=min(ret,query(L,R,k,rs));
return ret;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]=i;
v[i]=;
}
build(,n,);
int op,ans=;
set<int>s;
set<int>::iterator it;
while(m--)
{
scanf("%d",&op);
if(op==)
{
int pos;
scanf("%d",&pos);
pos^=ans;
if(!v[pos])
{
s.insert(a[pos]);
v[pos]=;
}
}
else
{
int r,k;
scanf("%d%d",&r,&k);
r^=ans;k^=ans;
ans=n+;//答案最大即为n+1
if(r!=n)
{
ans=query(k,n,r+,,n,);//查询区间[k,n]内大于r+1的最小的数
}
it=s.lower_bound(k);//从进行了操作一的数中找到符合条件的最小值
if(it!=s.end())
{
ans=min(ans,(*it));//取最小的一个
}
printf("%d\n",ans);
}
}
}
return ;
}
hdu6703 线段树+set的更多相关文章
- 对权值线段树剪枝的误解--以HDU6703为例
引子 对hdu6703,首先将问题转化为"询问一个排列中大于等于k的值里,下标超过r的最小权值是多少" 我们采用官方题解中的做法:权值线段树+剪枝 对(a[i],i)建线段树,查询 ...
- ccpc网赛 hdu6703 array(权值线段树
http://acm.hdu.edu.cn/showproblem.php?pid=6703 大意:给一个n个元素的数组,其中所有元素都是不重复的[1,n]. 两种操作: 将pos位置元素+1e7 查 ...
- 2019ccpc网络赛hdu6703 array(线段树)
array 题目传送门 解题思路 操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数.注意到k的范围是小于等于n的,且n的范围是\(10^5\),远 ...
- HDU-6703 array (线段树)
题意 一个长度为n的排列a,\(\forall i\in [1,n] ,1\le a_i \le n\) , m次操作,每次操作: (1,pos),把 \(a_{pos}\) 变为\(a_{pos} ...
- HDU6703 array (线段树)
题意:长为1e5的全排列 有两个操作 把一个数删掉 询问1,r这个区间内 找到一个数大于等于x 且这个数不等于区间内的所有数 题解:建一颗权值线段树 线段树里存值为i的数在原数组中的坐标 维护坐标的最 ...
- BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)
换markdown写了.. 题意: 给你一个1e5的字符串,1e5组询问,求\([l_1,r_1]\)的所有子串与\([l_2,r_2]\)的lcp 思路: 首先可以发现答案是具有单调性的,我们考虑二 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
随机推荐
- 【codeforces 766C】Mahmoud and a Message
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 插播一条 WMI修复教程
一般情况下,WMI都会好好的工作,但偶尔也会出现小问题. 这些小问题会影响到正在使用WMI的程序,比如设置的有线和无线网络依然还是依赖WMI的.如果WMI自己都没办法工作,有些数据就获取不到了. 先看 ...
- UVA 1625 "Color Length" (基础DP)
传送门 •参考资料 [1]:HopeForBetter •题意 •题解(by 紫书) •我的理解 用了一上午的时间,参考紫书+上述博文,终于解决了疑惑: 定义第一个颜色序列用串 s 表示,第二个用串 ...
- UVA 12563 "Jin Ge Jin Qu hao" (背包)
传送门 debug了好一会,突然发现,输出错了,emmm......... 明天再写debug历程: (PS:ipad debug是真的繁琐) 题意: 题解: 尽管题干中给的 t 的范围很大,但是 t ...
- JS的防抖与节流学习笔记
防抖(debounce):当持续触发事件时,在一定的时间段内,只有最后一次触发的事件才会执行. 例: function debounce(fn, wait) { var timer = null; r ...
- Linux 内核热插拔事件产生
一个热插拔事件是一个从内核到用户空间的通知, 在系统配置中有事情已经改变. 无论何 时一个 kobject 被创建或销毁就产生它们. 这样事件被产生, 例如, 当一个数字摄像头 使用一个 USB 线缆 ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- POJ1741 点分治模板
传送门:http://poj.org/problem?id=1741 题意: 求树上两点间路径长度小于k的点对个数 题解: 参考资料 守望的淀粉质略解:https://www.luogu.org/bl ...
- 牛客练习赛4 A Laptop
传送门:https://ac.nowcoder.com/acm/contest/16/A 题意: 每个物品有2个属性,求有多少个物品的两个属性完全小于另一个物品 题解: 求逆序对板子题 代码: /** ...
- 数据预处理以及探索性分析(EDA)
1.根据某个列进行groupby,判断是否存在重复列. # Count the unique variables (if we got different weight values, # for e ...