【题目分析】
分块。
【代码】
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
struct node{
long long dis,r;
long long m,p;
}a[250001],L;
long long n,xx,yy,x,y;
long long have[250001],ans=0;
long long st[501],en[501];
long long maxm[501];
node que[250002];
int hd=1,tl=0;
queue<node>q;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline bool cmpm(node a,node b)
{return a.m<b.m;}
inline bool cmpd(node a,node b)
{return a.dis<b.dis;}
int main()
{
L.dis=0;
xx=read();yy=read();
L.p=read();L.r=read();
L.r*=L.r;
n=read();
for (register long long i=1;i<=n;++i)
{
x=read(); y=read();
x-=xx;y-=yy;
a[i].dis=((ll)x*x+y*y);
a[i].m=read();a[i].p=read();a[i].r=read();
a[i].r*=a[i].r;
}
sort(a+1,a+n+1,cmpm);
long long m=sqrt(n+1);
st[1]=1;en[1]=m;
for (register long long i=2;i<=m;++i)
{
st[i]=st[i-1]+m;
en[i]=en[i-1]+m;
maxm[i]=a[en[i]].m;
}
en[m]=n;maxm[m]=a[n].m;
for (register long long i=1;i<=m;++i)
sort(a+st[i],a+en[i]+1,cmpd);
que[++tl]=L;
while(hd<=tl)
{
node x=que[hd++];
long long l=1,r=m;
while (l<r)
{
long long mid=(l+r)/2+1;
if (maxm[mid]<=x.p) l=mid;
else r=mid-1;
}
for (register long long i=1;i<=l;++i)
{
for (register long long j=st[i];j<=en[i];++j)
if (!have[j])
{
if (x.r>=a[j].dis)
{
if (j==st[i]) st[i]++;
if (j==en[i]) en[i]--;
have[j]=1;
que[++tl]=a[j];
ans++;
}
else break;
}
}
if (l+1<=m)
{
for (register long long i=st[l+1];i<=en[l+1];++i)
if (!have[i])
{
if (x.r>=a[i].dis&&x.p>=a[i].m)
{
if (i==st[l+1]) st[l+1]++;
if (i==en[l+1]) en[l+1]--;
have[i]=1;
que[++tl]=a[i];
ans++;
}
}
}
}
printf("%lld\n",ans);
}