array

题目传送门

解题思路

操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数。注意到k的范围是小于等于n的,且n的范围是\(10^5\),远小于\(10^7\),所以对于操作1,可以视为把第pos个位置上的数删去。

因为所有节点上的数都是唯一的,所以建立一颗权值线段树,存入每个权值对应的位置,维护其最大值和最小值。为了保证一定有答案,建立的权值范围是[1,n+1]。对于操作1,直接把pos对应的权值的叶子节点修改为0,代表这个数不存在即可。

对于操作2,我们在线段树上查询。对于一颗子树,有答案的前提是其最大值大于r,或者最小值等于0,即存在r后面的数,或者有不存在的数。对于左子树,还应有mid>=k。因为答案要尽量小,所以先看左子树是否可以找到答案,如果左子树没有答案,再看右子树,如果右子树也没有,则返回0,表示没有找到答案。但因为建立的权值范围是[1,n+1],所以最后一定会有答案,当进入叶子节点,则返回答案。

代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll; const int N = 100005; struct T{
int l, r;
int minn, maxx;
}tree[N<<2]; void build(int k, int l, int r)
{
tree[k].l = l;
tree[k].r = r;
tree[k].maxx = tree[k].minn = 0;
if(l == r)
return;
int mid = (l + r) / 2;
build(2*k, l, mid);
build(2*k+1, mid + 1, r);
} void update(int k, int x, int v)
{
if(tree[k].l == tree[k].r){
tree[k].maxx = tree[k].minn = v;
return;
}
int mid = (tree[k].l + tree[k].r) / 2;
if(x <= mid)
update(2*k, x, v);
else
update(2*k+1, x, v);
tree[k].minn = min(tree[2*k].minn, tree[2*k+1].minn);
tree[k].maxx = max(tree[2*k].maxx, tree[2*k+1].maxx);
} int query(int k, int r, int x)
{
if(tree[k].l == tree[k].r)
return tree[k].l;
int mid = (tree[k].l + tree[k].r) / 2;
if(x <= mid && (tree[2*k].minn == 0 || tree[2*k].maxx > r)){
int ans = query(2*k, r, x);
if(ans)
return ans;
}
if(tree[2*k+1].minn == 0 || tree[2*k+1].maxx > r)
return query(2*k+1, r, x);
else
return 0;
} int a[N]; int main()
{
int t;
scanf("%d", &t);
while(t --){
int n, m;
scanf("%d%d", &n, &m);
build(1, 1, n + 1);
for(int i = 1; i <= n; i ++){
int x;
scanf("%d", &x);
a[i] = x;
update(1, x, i);
}
int last = 0;
for(int i = 1; i <= m; i ++){
int opt;
scanf("%d", &opt);
if(opt == 1){
int t1;
scanf("%d", &t1);
t1 ^= last;
update(1, a[t1], 0);
}
else {
int t1, t2;
scanf("%d%d", &t1, &t2);
t1 ^= last;
t2 ^= last;
last = query(1, t1, t2);
printf("%d\n", last);
}
}
}
return 0;
}

2019ccpc网络赛hdu6703 array(线段树)的更多相关文章

  1. 徐州网络赛G-Trace【线段树】

    There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy  ...

  2. Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵

    Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries ...

  3. HDU 4417 Super Mario(2012杭州网络赛 H 离线线段树)

    突然想到的节约时间的方法,感觉6翻了  给你n个数字,接着m个询问.每次问你一段区间内不大于某个数字(不一定是给你的数字)的个数 直接线段树没法做,因为每次给你的数字不一样,父节点无法统计.但是离线一 ...

  4. HDU6703 array (线段树)

    题意:长为1e5的全排列 有两个操作 把一个数删掉 询问1,r这个区间内 找到一个数大于等于x 且这个数不等于区间内的所有数 题解:建一颗权值线段树 线段树里存值为i的数在原数组中的坐标 维护坐标的最 ...

  5. 2019CCPC网络选拔赛 hdu6703 array(主席树+set)

    题意 给你一个1~n的排列,由两种操作: 1 pos:将a[pos]+10 000 000 2 r k:求大于等于k且不等于a[1~r]的数的最小值. 强制在线. 思路 如果没有1操作,那么我们直接主 ...

  6. hdu 4031 2011成都赛区网络赛A题 线段树 ***

    就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! #include<cstdio> #include<iostream&g ...

  7. [Codeforces 266E]More Queries to Array...(线段树+二项式定理)

    [Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...

  8. 2019CCPC网络赛——array(权值线段树)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6703 题目大意: 给出一个n(n<1e5)个元素的数组A,A中所有元素都是不重复的[1,n]. 有 ...

  9. CCPC 2019 网络赛 1002 array (权值线段树)

    HDU 6703 array   题意:   给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同.   有两种 ...

随机推荐

  1. TList TObjectList的区别和使用

    所在的单元 TList(Classes.pas) TObjectList(Contnrs.pas) TObjectList对象的创建方法有一个参数: constructor TObjectList.C ...

  2. Php单元测试 phpunit & codecept

    phpunit: Windows版本 整体上说,在 Windows 下安装 PHAR 和手工在 Windows 下安装 Composer 是一样的过程: 下载链接:http://pan.baidu.c ...

  3. 支付宝PC端接入PHP

    引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...

  4. USACO 6.1 章节

    Postal Vans 题目大意 4*n的网格,要经过所有点的有向有环,不重复经过点的路径总数 n<=1000 题解 显然 插头dp 以4为切面 问题是,会发现 超精度 解决呢要么实现高精度,要 ...

  5. Get The Treasury【HDU-3642】【扫描线】

    题目链接 题目给出的是N个体积块,问的是有多少体积重叠了3次及以上? 那么就是怎么处理体积这样子的问题了,看到Z的种类不多的时候,就想着从Z离散化的角度去考虑这个问题了,然后就是怎样子去处理面积了,这 ...

  6. 斯坦福【概率与统计】课程笔记(六):EDA | 标准差和方差

    这一篇比较简单,就不展开记录了,方差和标准差的计算方法记住了就可以. 计算mean 计算每个样本与mean的差值的平方,将其累加后除以(样本数-1)[注:这里的除数可以是n-1也可以是n],即得到方差 ...

  7. smartforms 字段文本碰见 "-" 自动换行

    长文本会在 '-' 这个符号处自动换行 原理:SAP 标准SMARTFORMS 的功能,遇到 '-' 自动判断后面字段是否能在本行完全显示,不够则换行 注意:如果一行文本有多个 ‘-’ ,则 判断 ' ...

  8. python第一个问题

    temp=input("请输入1到100之间内的数字:")if num > 50:    print("你妹好漂亮")else:    print(&qu ...

  9. 不要62(数位dp)

    题目传送门 不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. 从OLLVM4.0.0升级到LLVM8.0.1,并且给LLVM增加Pass 插件系统

    版本太低了,用得我这个揪心. 上周日决定把手头的ollvm从4.0.0升级到LLVM8.0.1. 里面的Pass的话,决定移植到8.0.1里面. 我习惯从代码上来动手 1:下载LLVM  https: ...