CCPC 2019 网络赛 1002 array (权值线段树)
Posted izcat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCPC 2019 网络赛 1002 array (权值线段树)相关的知识,希望对你有一定的参考价值。
HDU 6703
?
题意:
? 给定一个数组 \(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,对于操作一,相当于删除了这个数(询问的答案一定在区间 \([1, n]\) 内)。
?
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 val)
if(l==r)
tree[rt] = INF;
return;
int mid = (l+r)>>1;
if(val<=mid)
update(lson, val);
else
update(rson, val);
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;
以上是关于CCPC 2019 网络赛 1002 array (权值线段树)的主要内容,如果未能解决你的问题,请参考以下文章