比赛 |
EYOI与SBOI开学欢乐赛7th |
评测结果 |
AAAAAAAAAA |
题目名称 |
聪明的猴子 |
最终得分 |
100 |
用户昵称 |
遥时_彼方 |
运行时间 |
0.239 s |
代码语言 |
C++ |
内存使用 |
17.22 MiB |
提交时间 |
2022-09-23 20:56:40 |
显示代码纯文本
#include<bits/stdc++.h>
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define drep(x,y,z) for(int x=y;x>=z;x--)
#define ull unsigned long long
#define ll long long
using namespace std;
inline int read()
{
int x=0;bool flag=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')flag=0;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
if(flag) return x;
return ~(x-1);
}
inline void write(int x)
{
if(x<0) {x=~(x-1);putchar('-');}
if(x>9) write(x/10);
putchar(x%10+'0');
}
//
const int N=1e3+50;
const int M=1e6+50;
int mc,nc;
int k[N];
int n[N][2];
int hd[N];
int mx;
struct qxx
{
int ar;
int nx;
int p;
}a[M<<1];
int aj;
inline void ADD(int x,int y)
{
a[++aj].ar=y;
a[aj].p=(n[x][0]-n[y][0])*(n[x][0]-n[y][0])+(n[x][1]-n[y][1])*(n[x][1]-n[y][1]);
a[aj].nx=hd[x];
hd[x]=aj;
}
int e[N];//是否在树中
int m[N];//树到x(未在树中)的最小路长
struct DL
{
int p;
int ar;
};
struct cmp
{
bool operator()(DL x,DL y)
{
return x.p>y.p;
}
};
priority_queue<DL,vector<DL>,cmp> q;
int sz;
void prim(int cl)
{
e[cl]=1;
sz++;
if(sz==nc) return;
DL z;
for(int i=hd[cl];i;i=a[i].nx)
{
if(e[a[i].ar]||a[i].p>=m[a[i].ar]) continue;
m[a[i].ar]=a[i].p;
z.ar=a[i].ar;
z.p=a[i].p;
// cout<<"IN:"<<z.ar<<"."<<z.p<<endl;
q.push(z);
}
z=q.top(),q.pop();
while(e[z.ar])
{
// if(cl==5) cout<<"Z:"<<z.ar<<"."<<z.p<<endl;
z=q.top(),q.pop();
}
mx=max(z.p,mx);
// cout<<"TREE:"<<z.ar<<"."<<z.p<<endl;
prim(z.ar);
}
int ans=1;
bool cmpk(int x,int y)
{
return x>y;
}
int main()
{
freopen("monkey.in","r",stdin);
freopen("monkey.out","w",stdout);
mc=read();
rep(i,1,mc) k[i]=read(),k[i]*=k[i];
sort(k+1,k+mc+1,cmpk);
nc=read();
rep(i,1,nc)
{
n[i][0]=read(),n[i][1]=read();
rep(o,1,i-1) ADD(i,o),ADD(o,i);
}
memset(m,0x3f,sizeof(m));
prim(1);
while(k[ans]>=mx) ans++;
// cout<<"MX:"<<mx<<endl;
// rep(i,1,mc) cout<<i<<":"<<k[i]<<endl;
write(ans-1),putchar(10);
return 0;
}