10pts求调
查看原帖
10pts求调
1268398
BeTheNorthStar楼主2024/10/9 17:51

看着是一点问题都没有——(接程序下文)

#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;
}

——实际上错的一塌糊涂
但我也不知道挂哪了

2024/10/9 17:51
加载中...