考慮建權值線段樹,那麼線段樹存的值就是它的座標,考慮到答案一定存在且最大值為n+1
n+1n+
1,可以多加乙個點n+1
n+1n+
1對於操作1 (1,
x)
(1,x)
(1,x
),直接單點修改位置s[x
]s[x]
s[x]
為n +1
n+1n+
1(s[x]為初始位置x的值)
對於操作2 (2,
r,x)
(2,r,x)
(2,r,x
),要查詢區間[x,
n+1]
[x,n+1]
[x,n+1
]內第乙個大於r
rr的位置,考慮建一棵維護最大值的線段樹,比賽時候第一次寫這種問題,當時的思路是,查詢時先訪問左子樹,假如左子樹不行才訪問右子樹,但是這個時候的複雜度是log
(n)∗
log(
n)
log(n)*log(n)
log(n)
∗log
(n),然後開始yy各種剪枝,最後有用的剪枝是當查詢的區間包含現在的區間時,可以直接判斷符不符合情況,這樣可以把多的log
(n
)log(n)
log(n)
變成常數
int
query
(int p,
int l,
int r,
int x,
int y,
int tmp)
//query(1,1,n+1,x,n+1,r)
else}if
(x <= l && r <= y)
//區間包含於查詢區間
}int mid =
(l+r)/2
;if(y <= mid)
if(x >= mid +1)
int judge =
query
(p*2
,l,mid,x,y,tmp)
;//先判斷左子樹
if(judge !=-1
)return
query
(p*2+1
,mid+
1,r,x,y,tmp)
;}
HDU 6703 array 權值線段樹
先不考慮修改的情況,對所有的權值建一顆線段樹,然後線段樹上儲存下標的資訊,然後每個結點維護子樹下標的最大值。然後對於每次查詢,我直接查詢區間 k,n 1 k,n 1 k,n 1 這段區間值大於r的最小的那個點。對於修改的情形,實際上每個節點被修改之後相當於刪除,也就是說該節點是可選的,把該節點的下標...
權值線緞樹
權值線緞樹就是特殊的線緞樹,他的結構和普通線緞樹一樣,每個結點都是表示一段區間的範圍 因此也需要開四倍空間 但是其每個結點儲存的是該區間的數出現的次數。權值線段樹維護的是桶 形象理解 1 快速計算一段區間的數的出現次數。2 快速找到第k大或第k小值。1 注意題目中資料範圍一般較大,數的值一般高達1e...
2019CCPC網路賽 array(權值線段樹)
題目位址 兩種操作 1.給 a i 10000000 2.查詢不存在 在a 1 r 中 且不低於k的數 在第乙個操作時 由於k的範圍不夠 就相當於把 a i 刪除掉即a i 的下標變為無窮大而對於第二種操作 也就是 等價為在 k之後 的下標的大於r 的可以使用權值線段樹用來維護當前區間最大的 下標如...