分块水题0pts求助
查看原帖
分块水题0pts求助
1073342
Genshin_ZFYX楼主2024/12/5 13:19

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2.5e5+5;
struct node{
    int x,y,m,p,r;
    double dis;
}a[N];
int x,y,p,r,n,sq,ans,pos[N],maxn[N],h[N],vis[N];
double dist(double x,double y,double x2,double y2)
{return sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));}
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin>>x>>y>>p>>r>>n;
    sq=sqrt(n);
    for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y>>a[i].m>>a[i].p>>a[i].r,pos[i]=(i-1)/sq+1,a[i].dis=dist(a[i].x,a[i].y,x,y);
    sort(a+1,a+1+n,[](node x,node y){return x.m<y.m;});
    for(int i=1;i<=pos[n];i++)sort(a+(i-1)*sq+1,a+i*sq+1,[](node x,node y){return x.dis<y.dis;});
    for(int i=1;i<=n;i++)h[i]=1,maxn[pos[i]]=max(maxn[pos[i]],a[i].m);
	queue<node>q;
	q.push((node){x,y,0,p,r});
	while(!q.empty())
	{
		node t=q.front();q.pop();
		ans++;
		for(int i=1;i<=pos[n];i++)
		{
			if(maxn[i]<=t.p)
			{
				for(;pos[h[i]]==i;h[i]++)
				{
					if(vis[h[i]])continue;
					if(a[h[i]].dis<=t.r)
					{
						q.push(a[h[i]]);
						vis[h[i]]=true;
					}
					else break;
				}
			}
			else {
				for(int j=(i-1)*sq+1;j<=i*sq;j++)
				{
					if(vis[j])continue;
					if(a[j].dis<=t.r&&a[j].m<=t.p)
					{
						q.push(a[j]);
						vis[j]=1;
					}
				}
				break;
			}
		}
	}
	cout<<ans;
    return 0;
}
2024/12/5 13:19
加载中...