CH 46A 磁力塊 (分塊)

2021-09-24 23:50:08 字數 1555 閱讀 8448

描述

在一片廣袤無垠的原野上,散落著n塊磁石。每個磁石的性質可以用乙個五元組(x,y,m,p,r)描述,其中x,y表示其座標,m是磁石的質量,p是磁力,r是吸引半徑。若磁石a與磁石b的距離不大於磁石a的吸引半徑,並且磁石b的質量不大於磁石a的磁力,那麼a可以吸引b。

小取酒帶著一塊自己的磁石l來到了這篇原野的(x0,y0)處,我們可以視為磁石l的座標為(x0,y0)。小取酒手持磁石l並保持原地不動,所有可以被l吸引的磁石將會被吸引過來。在每個時刻,他可以選擇更換任意一塊自己已經獲得的磁石(當然也可以是自己最初攜帶的l磁石)在(x0,y0)處吸引更多的磁石。小取酒想知道,他最多能獲得多少塊磁石呢?

輸入格式

第一行五個整數x0,y0,pl,rl,n,表示小取酒所在的位置,磁石l磁力、吸引半徑和原野上散落磁石的個數。

接下來n行每行五個整數x,y,m,p,r,描述一塊磁石的性質。

輸出格式

輸出乙個整數,表示最多可以獲得的散落磁石個數(不包含最初攜帶的磁石l)。

樣例輸入

0 0 5 10 5

5 4 7 11 5

-7 1 4 7 8

0 2 13 5 6

2 -3 9 3 4

13 5 1 9 9

樣例輸出

3資料範圍與約定

對於30%的資料,1<=n<=1000。

對於100%的資料,1<=n<=250000,-10^9<=x,y<=10^9,1<=m,p,r<=10^9。

#include#define ll long long

using namespace std;

const int n = 250006;

struct p p[n], q[n];

bool b[n];

int n, l[n], r[n], m[n];

bool cmp(p a, p b)

bool cmp0(p a, p b)

bool pd(p a, p b)

int main()

/// 末尾

if (r[t] < n)

/// bfs框架

int l = 0, r = 1;

memset(b, 0, sizeof(b)); /// 搜尋佇列

while (l < r)

++l[i];

}/// 分別從每個塊的塊頭開始遍歷,直到某乙個磁鐵質量大於磁力 p 時就停止,同時將該磁鐵設為新的塊頭

if (t != k++)

for (int i = l[k]; i <= r[k]; i++)

if (!b[i] && p[i].m <= q[l].p && pd(q[l], p[i]))

/// 尾巴(殘餘塊處理)

++l;

} cout << r - 1 << endl;

return 0;

}

分塊 CH Round 46 磁力塊

給定一些有座標的磁力塊,當距離滿足吸引距離且重量滿足吸引重量時可吸走該磁力塊,然後可以在新的磁力塊上擴充套件,也可以用原來的磁力塊,問最多能獲取幾個磁力塊 我會平衡樹!滾!用平衡樹等樹形資料結構維護這些資料是很麻煩的,所以我們可以用分塊 因為該解滿足最優性,所以我們可以直接用寬搜擴充套件,中間利用分...