70分求助
  • 板块P10590 磁力块
  • 楼主Wang1006
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/9 06:40
  • 上次更新2024/12/9 18:46:29
查看原帖
70分求助
525687
Wang1006楼主2024/12/9 06:40

P10590

分块、bfs

#include<iostream>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;

#define div(...)
#define int long long

int x,y,n,sb,nb,ans;

struct Magnet{
	int x,y,m,p,r;
	__int128 dis;
};
Magnet a[250010];
queue<Magnet>q;
vector<Magnet>b[510];
int minmag[510];
bool vis[510][510];

bool cmpm(Magnet a,Magnet b){
	return a.m<b.m;
}
bool cmpdis(Magnet a,Magnet b){
	return a.dis>b.dis;
}

void bfs(){
	while(q.size()){
		Magnet f=q.front();
		q.pop();
		for(int i=1;i<=nb&&minmag[i]<=f.p;++i){
			while(b[i].size()){
				if(b[i].back().m>f.p){
					for(int j=b[i].size()-1;j>=0;--j){
						if(b[i][j].dis<=f.r&&b[i][j].m<=f.p&&vis[i][j]==0){
							ans++;
							q.push(b[i][j]);
							vis[i][j]=1;
						}
						else if(b[i][j].dis>f.r){
							break;
						}
					}
					break;
				}
				while(b[i].size()&&vis[i][b[i].size()-1]){
					b[i].pop_back();
				}
				if(b[i].size()&&b[i].back().dis<=f.r){
					ans++;
					q.push(b[i].back());
					b[i].pop_back();
				}
				else{
					break;
				}
			}
		}
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	div(input){
		Magnet l;
		cin>>x>>y>>l.p>>l.r>>n;
		l.r=l.r*l.r;
		q.push(l);
		for(int i=1;i<=n;++i){
			cin>>a[i].x>>a[i].y>>a[i].m>>a[i].p>>a[i].r;
			a[i].r=a[i].r*a[i].r;
			a[i].dis=(__int128)(a[i].x-x)*(a[i].x-x)+(__int128)(a[i].y-y)*(a[i].y-y);
		}
	}
	div(prework){
		sb=ceil(sqrt(n)),nb=ceil(1.0*n/sb);
		sort(a+1,a+n+1,cmpm);
		for(int i=1,nid=1,nsz=0;i<=n;++i){
			b[nid].push_back(a[i]);
			nsz++;
			if(nsz>=sb){
				nsz=0;
				nid++;
			}
		}
		for(int i=1;i<=nb;++i){
			minmag[i]=b[i].front().m;
			sort(b[i].begin(),b[i].end(),cmpdis);
		}
	}
	div(solve){
		bfs();
		cout<<ans;
	}
}
2024/12/9 06:40
加载中...