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