hdu 6703 array 权值线段树
题目读了半天没读懂...... 给你一个长度为n的排列a。两种操作,每次把里面的某个数增加 10 , 000 , 000,或者询问不等于a1-ar,且不小于k的最小的数是多少。k不超过n。 所以答案必定不超过n+1。 我们考虑对原序列做权值线段树,下标为原序列的值,值为原序列的下标。 先考虑没有修改,那么不小于k就是只从线段树下标为[k + 1,n + 1]的范围找答案。不等于a1-ar就是线段树的值(原序列下标)要大于r。要最小的数,就是能往左子树找就往左子树找。 考虑修改,某个数ai增加了 10 , 000 , 000,则意味着,原先ai这个数,再也不会被a1-ar这个条件限制了,因为a是一个排列,ai独此一份,现在被改成了个很大的数。所以干脆把线段树下标ai对应的值改成n+1,这样子,就再也不会受a1-ar这个条件限制了。 复杂度是mlogn,直观感受下就是,不再范围内的部分,发现出界会立马停止。在范围内的部分,只有一条会递归到底,一共两条,所是logn。 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 const int MAXN = 101000; 7 int n,m,T,vec[MAXN],a[MAXN]