看着是一点问题都没有——(接程序下文)
#include<bits/stdc++.h>
using namespace std;
const int maxn=500005;
int n,lnk[maxn],tot,ans,Du[maxn],a[maxn],que[maxn];
bool vis[maxn];
struct edge{
int to,nxt;
}e[maxn];
int read(){
int ret=0,f=1;char ch=getchar();
while(!isdigit(ch)) f^=!(ch^'-'),ch=getchar();
while( isdigit(ch)) ret=(ret<<3)+(ret<<1)+(ch&15),ch=getchar();
return ret*(f?1:-1);
}
void add_e(int x,int y){e[++tot]=(edge){y,lnk[x]},Du[y]++,lnk[x]=tot;}
void Topo(){
int hed=0,til=0;
for(int i=1;i<=n;i++) if(!Du[i]) que[++til]=i,vis[i]=1;
while(hed!=til)
for(int j=lnk[que[++hed]];j;j=e[j].nxt)
if(!--Du[e[j].to]) que[++til]=e[j].to,vis[e[j].to]=1;
}
void DFS(int x){
for(int j=lnk[x];j;j=e[j].nxt)
if(!vis[e[j].to]) vis[e[j].to]=1,DFS(e[j].to);
}
int main(){
freopen("hoofball.in","r",stdin);
freopen("hoofball.out","w",stdout);
n=read();
for(int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+1+n);add_e(1,2);
int L=n-2;while(L>=0&&a[L]==a[L+1]) L--;add_e(n,L+1);
for(int i=2;i<n;i++){
int L=i-2,R=i+1;while(L>=0&&a[L]==a[L+1]) L--;L++;
if(abs(a[L]-a[i])<=abs(a[R]-a[i])) add_e(i,L);else add_e(i,R);
}Topo();
for(int i=1;i<=n;i++) if(!vis[i]) vis[i]=1,DFS(i),ans++;
printf("%d\n",ans);
return 0;
}
——实际上错的一塌糊涂
但我也不知道挂哪了