题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6703
题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n]。
有两种操作:
1.将pos位置的元素+1e7
2.查询不属于[1,r]中的最小的>=k的值。
强制在线。
思路:当时想的是树套树,但是O(nlong^2(n))总是超时,一直想不出有什么办法优化掉一个多余的logn,到最后都没有写出来...然后听旁边的队,用主席树+set过了,学长用裸的线段树过了。orz。听完思路后感觉好简单。哎。。还是太菜了QAQ。
Solve1:静态主席树+set。
直接用静态主席树维护区间问题。set维护删除的元素。由于查询的元素只会在[1,n+1]内出现,因此我们可以把+1e7看成删除了,因为我们最多的答案只会是n+1.对于每个删除的元素,将其插入到set中,查询的时候,查询[r+1,n+1]中第一个>=k的元素,再和set中第一个>=k的元素相比较,选择最小的就好了。
明明这么简单我怎么就没想到呢QAQ。。
ACCode:
#include
#include
#include
#include
#include
// srand((unsigned)time(NULL));rand();
#include
Solve2:权值线段树
将数组元素进行排序,然后根据其下标建立权值线段树,维护下标的最大值。
修改的时候,将对应的值在线段树中的下标修改为INF32就好了。
查询的时候,查询[k,n+1]区间内找到第一个下标>r的位置。注意是下标,因为不能在[1,r]中出现,所以是第一个>r的元素。
ACCode:
#include
#include
#include
#include
#include
// srand((unsigned)time(NULL));rand();
#include