【悬赏关注】站外题求调
  • 板块学术版
  • 楼主CNS_5t0_0r2
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/3 12:42
  • 上次更新2024/1/3 16:55:09
查看原帖
【悬赏关注】站外题求调
999274
CNS_5t0_0r2楼主2024/1/3 12:42

原题

有 33 个点 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;
}
2024/1/3 12:42
加载中...