題意:在乙個射擊遊戲裡面,遊戲者可以選擇地面上【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的線段樹 大小是數字的個數 記錄該字...