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] .根 ...
随机推荐
- [转]在ASP.NET WebAPI 中使用缓存【Redis】
初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...
- win10 uwp 发布旁加载自动更新
在很多企业使用的程序都是不能通过微软商店发布,原因很多,其中我之前的团队开发了很久的应用,结果发现没有用户能从微软应用商店下载所以我对应用商店没有好感.但是作为一个微软粉丝,怎么能不支持 UWP 开发 ...
- linux获知当前时间
内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代 表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统 的 uptime. 如 ...
- 【74.00%】【codeforces 747A】Display Size
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 关于CPython中set集合的无序研究
set集合本身是无序的,但是无意间发现set集合中都是数字时set貌似有序了. 无论声明这个set时数字如何摆放,输出结果总是以一种固定的顺序!同样我将dict字典的key值设为int类型,这时候字典 ...
- eclipse快捷键记录
转自:http://blog.csdn.net/siphiababy/article/details/74179684 ctrl+2+L这个快捷键可自动补全代码,极大提升编码效率! 注:ctrl和2同 ...
- CF1151FSonya and Informatics
CF1151FSonya and Informatics 给一个长度为 n$ (n\leq 100)$的 \(0/1\) 串,进行 k\((k \leq 10^9)\)次操作,每次操作选择两个位置 \ ...
- Visio文本相关操作
三种方式:双击形状输入文本,插入文本框, 文本工具 文本块工具 选择后可以对文本进行移动旋转 如果要给文本加入边框 直接显示线条就可以了 因为都是文本框 添加特殊文本: 插入符号 插入域 比如当前时间 ...
- 通过nginx搭建基于python的web环境
前言: 在搭建开始前,我们先来梳理下web服务工作流程,先看下图: 1.用户(PC)向web服务器发起http请求 2.web服务器判断用户请求文件是否为静态文件,是则直接读取静态文件并返回给用户,不 ...
- Go网络编程
概述 网络协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则.假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名,应答OK给传输方: ...