有 3 个点 Segmentation Fault 了,不知道为什么。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#define int long long
using namespace std;
const int N = 250009,SqrtN = 1000;
int n;
struct magnet{
int x,y,m,p,r,dis;
void print(){
cout << '(' << x << ',' << y << ')' << ' ' << m << ' ' << p << ' ' << r << ' ' << dis << '\n';
}
} a[N];
struct block{
int l,r;
} b[SqrtN];
int belong[N];
int block_cnt,block_len;
int Max[SqrtN];//一个块中最重的磁石的质量
bool vis[N];
int sq(int k){
return k * k;
}
int dist(magnet m1,magnet m2){
int x1 = m1.x,y1 = m1.y,x2 = m2.x,y2 = m2.y;
return sq(x1 - x2) + sq(y1 - y2);
}
bool cmp1(magnet m1,magnet m2){
return m1.m < m2.m;
}
bool cmp2(magnet m1,magnet m2){
return m1.dis < m2.dis;
}
void block_sort(int block_id){
int l = b[block_id].l,r = b[block_id].r;
sort(a + l,a + r + 1,cmp2);
}
void build_block(){
block_cnt = block_len = (int)sqrt(n);
//cout << block_len << '\n' << '\n';
for(int i = 1;i <= block_cnt;i++){
b[i].l = b[i - 1].r + 1;
b[i].r = block_len * i;
}
b[block_cnt].r = n;
for(int i = 1;i <= block_cnt;i++){
block_sort(i);
for(int j = b[i].l;j <= b[i].r;j++){
Max[i] = max(Max[i],a[j].m);
belong[j] = i;
}
}
}
queue<magnet>q;
int ans;
void attract(magnet u){
int pos = n + 1;
for(int i = 1;i <= block_cnt;i++)
if(Max[i] > u.p){
pos = i;
break;
}
for(int i = 1;i <= pos - 1;i++){
while(b[i].l <= b[i].r && dist(a[0],a[b[i].l]) <= u.r){
int j = b[i].l;
if(!vis[j]){
ans++;
q.push(a[j]);
vis[j] = true;
//cout << j << ':';
//a[j].print();
}
b[i].l++;
}
}
if(pos == n + 1)
return;
for(int i = b[pos].l;i <= b[pos].r;i++)
if(a[i].m <= u.p && dist(a[0],a[i]) <= u.r && !vis[i]){
ans++;
vis[i] = true;
q.push(a[i]);
//cout << i << ':';
//a[i].print();
}
}
signed main(){
// freopen("AcWing 250.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> a[0].x >> a[0].y >> a[0].p >> a[0].r >> n;
for(int i = 1;i <= n;i++)
cin >> a[i].x >> a[i].y >> a[i].m >> a[i].p >> a[i].r;
for(int i = 0;i <= n;i++){
a[i].r = sq(a[i].r);
a[i].dis = dist(a[0],a[i]);
}
sort(a + 1,a + n + 1,cmp1);
build_block();
// for(int i = 0;i <= 0;i++){
// cout << i << ':';
// a[i].print();
// cout << '\n';
// }
// for(int i = 1;i <= block_cnt;i++){
// for(int j = b[i].l;j <= b[i].r;j++){
// cout << j << ':';
// a[j].print();
// }
// cout << '\n';
// }
// cout << '\n';
vis[0] = true;
q.push(a[0]);
while(!q.empty()){
magnet u = q.front();
q.pop();
attract(u);
}
cout << ans;
return 0;
}