HDU 4866 Shooting(主席樹)題解

2022-07-20 03:18:08 字數 1726 閱讀 7727

題意:在乙個射擊遊戲裡面,遊戲者可以選擇地面上【1,x】的乙個點射擊,並且可以在這個點垂直向上射擊最近的k個目標,每個目標有乙個價值,價值等於它到地面的距離。遊戲中有n個目標,每個目標從l覆蓋到r,距離地面高度d。每次射擊乙個目標可以得到目標價值大小的分數,每次射擊以後目標不會消失。如果在該點上方的目標個數小於可以射擊的次數,那麼就當多出來的次數全部射在該點上方最高的目標身上。如果上乙個詢問 > p,那麼本次總得分翻倍。

思路:簡單的主席樹模板題。區間覆蓋直接l上+1,r+1上-1就行了。然後搞一下區間和,區間數量。

**:

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;typedef unsigned

long

long

ull;

const

int maxn = 1e5 + 10

;const

int m = maxn * 30

;const ull seed = 131

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e4 + 7

;int

n, q, tot;

introot[maxn];

vector

vv;int getid(int

x)struct

nodet[maxn * 50

];void update(int l, int r, int &now, int pre, int v, int

pos)

ll query(

int l, int r, int now, int

k)

int m = (l + r) >> 1

;

int num =t[t[now].lson].num;

ll sum =t[t[now].lson].sum;

if(num >=k)

return

query(l, m, t[now].lson, k);

else

return sum + query(m + 1, r, t[now].rson, k -num);

}ll query_max(

int l, int r, int

now)

vector

g[maxn];

intm, x;

intmain()

sort(vv.begin(), vv.end());

vv.erase(unique(vv.begin(), vv.end()), vv.end());

for(int i = 1; i <= x; i++)

}ll pre = 1

, ans;

while(m--)

else

if(pre > p) ans *= 2

; printf(

"%lld\n

", ans);

pre =ans;}}

return0;

}

HDU 4866 多校1 主席樹 掃瞄線

終於是解決了這個題目了 不過不知道下一次碰到主席樹到底做不做的出來,這個東西稍微難一點就不一定能做得出 離散化 掃瞄線式的建樹,所以對於某個座標二分找到對應的那顆主席樹,即搜尋出結果即可 因為是掃瞄線式的建樹,找到對應的樹之後,就知道該點上面的線段有多少條了 其他就是普通主席樹的操作了 主席樹裡面維...

hdu2665(主席樹模板題)

求區間第 k 小。參考這類題目做法挺多的,例如 劃分樹。這裡使用主席樹再寫一發,不得不說主席樹相比而言要好寫的多,比起普通線段樹,主席樹就是復用了線段樹共有的資訊。可持久化資料結構講究的就是復用共有的資訊,可持久化 trie 的思想也是差不多的。includeusing namespace std ...

hdu2665 主席樹模板題

題目 區間k大值,區間極值很容易想到線段樹,如果k是個位數的話,可以考慮開k個域的線段樹 滾 又稱可持久化線段樹,函式式線段樹 也許是上面兩個字看的太長,同時主席兩字給人一種不明覺厲的感覺,so,嘿嘿嘿 關於主席樹的講解可以看這 先離散化,對每個點i,建乙個1 i的線段樹 大小是數字的個數 記錄該字...