可持久化線段樹 HDU4866 Shooting

2021-06-25 12:26:35 字數 1743 閱讀 5617

題目鏈結

一些平行於x軸的線段作為射擊目標,每次在x軸上選乙個點向y軸方向射擊,可以射中最近的k個目標,得分是射中目標的高度和,求這個得分。

對高度建立函式式線段樹,按順序對x軸座標建樹,維護區間和和區間個數,每次射擊詢問該線段樹即可。

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define n 5522222

#define ll long long

#define mod 1000000007ll

#define inf 0xfffffff

#define pii pair#define mp make_pair

#define eps 1e-3

#define euc 0.57721566490153286060651209

struct seg pool[n];

seg *tot;

seg* newnode()

seg *root[n];

seg* buildtree(int l, int r)

ll h[n];

seg* update(int w, int x, seg *now)

int mid = (ret->l + ret->r) / 2;

if (w <= mid)

ret->ch[0] = update(w, x, ret->ch[0]);

else

ret->ch[1] = update(w, x, ret->ch[1]);

ret->cnt = ret->ch[0]->cnt + ret->ch[1]->cnt;

ret->sum = ret->ch[0]->sum + ret->ch[1]->sum;

return ret;

}pairget(int l, int r, seg *now)

if (r > mid)

return ret;

}int n, m, x;

ll p;

int x[n];

inline int read()

int main()

int num = 0;

h[++num] = 0;

for (set::iterator po = st.begin(); po != st.end(); po++)

sort(h + 1, h + num + 1);

int all = 0;

root[all++] = buildtree(1, num);

while (pos.size() || neg.size()) else

}ll pre = 1;

for (int _m = 0; _m < m; _m++)

pre = (pre > p) ? 2 : 1;

pairtmp = get(1, l, root[xx]);

ll bei = 0;

if (tmp.first > kk)

bei = tmp.first - kk;

pre *= tmp.second - h[l] * bei;

printf("%i64d\n", pre);}}

return 0;

}int main()

可持久化線段樹總結(可持久化線段樹,線段樹)

最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...

可持久化線段樹

可持久化線段樹,意思是可以查詢歷史記錄的線段樹。又叫主席樹。我們可以通過記錄不同的根節點,並在每乙個更新到的節點處新建必要的節點。詢問不同版本的主席樹,只需要進入不同的根節點即可。例題 給定n,m,輸入n個數組成的數列,有m個詢問,每次詢問l,r這個區間中,第k小的數的值。分析 這個題可以巧妙運用主...

可持久化線段樹

以p3919 模板 可持久化陣列 可持久化線段樹 平衡樹 為例。知識點 1.練習可持久化線段樹 2.線段樹維護數列。線段樹維護數列單點查詢僅需o logn 3.記得return root 4.記得設定左右兒子 5.有時需注意cnt的初始大小 include using namespace std i...