HDU 6703 array

 

题意:

  给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同。

  有两种操作:1. 将 \(a_{pos}\) 的值加上 100000000;2. 询问不等于任何 \(a[i], (1 \le i \le r)\) 且不小于 \(k\) 的最小值。

 

思路:

  注意 \(n,k\) 的范围都不超过 100000,对于操作一,相当于删除了这个数(询问的答案一定在区间 \([k, n+1]\) 内)。

  现在问题转化为:

  求值在 \([k,n+1]\) 内并且坐标大于 \(r\) 的最小值。

  我们用线段树节点表示 \(a_i\) 的值,每个节点维护当前区间 \([l, r]\) 的下标最大值。那么query每次先找左子树(下标更小),没找到再找右子树。

 

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r const int maxn = 100010;
const int INF = 0x3f3f3f3f;
int tree[maxn<<2];
int arr[maxn];
int id[maxn]; void build(int rt, int l, int r) {
if(l==r) {
tree[rt] = id[l];
return;
}
int mid = (l+r)>>1;
build(lson);
build(rson);
tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
} int query(int L, int R, int rt, int l, int r, int val) {
if(l==r) {
return l;
} int ans = INF;
int mid = (l+r)>>1; if(L<=mid && val<tree[rt<<1])
ans = query(L, R, lson, val);
if(ans!=INF) return ans; if(mid<R && val<tree[rt<<1|1])
ans = query(L, R, rson, val);
return ans;
} void update(int rt, int l, int r, int pos) {
if(l==r) {
tree[rt] = INF;
return;
} int mid = (l+r)>>1;
if(pos<=mid)
update(lson, pos);
else
update(rson, pos); tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
} int n, m;
int main() {
int t; cin>>t;
while(t--) {
scanf("%d %d", &n, &m);
int len = 0;
for(int i=1;i<=n;i++) {
scanf("%d", &arr[i]);
id[arr[i]] = i;
len = max(len, arr[i]);
} id[++len] = INF; build(1, 1, len); int ans = 0;
while(m--) {
int op;
scanf("%d", &op);
if(op==1) {
int pos;
scanf("%d", &pos);
pos = pos^ans;
update(1, 1, len, arr[pos]);
} else {
int r, k;
scanf("%d %d", &r, &k);
r = r^ans, k = k^ans; ans = query(k, len, 1, 1, len, r);
printf("%d\n", ans);
}
}
memset(id, 0, sizeof(id));
} return 0;
}

最新文章

  1. (第六天)DOM
  2. php生成对象的研究
  3. python协程与异步I/O
  4. 内容在某div中滚动
  5. Lucene 入门需要了解的东西
  6. 编译器的未来——我们还需要C++么?
  7. NGUI系列教程二
  8. Apache提示You don&#39;t have permission to access / on this server问题解决
  9. JavaScript开发规范
  10. Audio Offload
  11. C++学习笔记1--基础知识
  12. PHP的json_encode中文被转码的问题
  13. 单用户模式与救援模式:linux学习第三篇
  14. WebStrom中实现Vue项目的快速启动
  15. BBS论坛(十二)
  16. hive中的分桶表
  17. java基础基础总结----- Date
  18. ubuntu下安装配置minicom(解决默认的端口/dev/tty8,改不过来的问题)
  19. cmd命令使用笔记
  20. 深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作

热门文章

  1. Shell while循环详解
  2. JavaScript ---- 原型,原型链(什么是原型)
  3. 数字IC设计工程师成长之路
  4. PHP ftp_rename() 函数
  5. hive的行列互转
  6. [NOI.AC] count
  7. HDU3342:判断有向图中是否存在3元环-Tarjan或拓扑排序
  8. class8_Canvas 画布
  9. CodeForces 1166E The LCMs Must be Large
  10. mybatis浅显认识