題目鏈結
一些平行於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...