HDU6703 array(權值線段樹)

2021-09-26 11:00:46 字數 1163 閱讀 7666

考慮建權值線段樹,那麼線段樹存的值就是它的座標,考慮到答案一定存在且最大值為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 的可以使用權值線段樹用來維護當前區間最大的 下標如...