求助大佬。这个贪心为神魔不对啊QwQ?
查看原帖
求助大佬。这个贪心为神魔不对啊QwQ?
749325
Sincerin楼主2023/8/21 15:15

WA on #2 #4 #7 #10

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<bitset>
#include<queue>
#include<vector>
using namespace std;
#define rd(n) n=read()
#define ri register int
const int N=100002;
const int INF=1000000007;
inline int read()
{
	register int ans=0,f=0;
	register char c=getchar();
	while(c<'0'||c>'9'){f^=(c=='-');c=getchar();}
	while(c>='0'&&c<='9'){ans=(ans<<3)+(ans<<1)+(c^48);c=getchar();}
	return f?-ans:ans;
}
inline void print(int n)
{
	if(n<0){putchar('-');n=-n;}
	if(n>9) print(n/10);
	putchar(n%10+'0');
}
struct Graph{
	int ver,head,Next,edge;
	#define ver(i) g[i].ver
	#define head(i) g[i].head
	#define edge(i) g[i].edge
	#define Next(i) g[i].Next
}g[N<<1];
int n,m,x,y,z,ans,tot,cnt,root,mi;
struct CutTree{
	int siz,dep,fa;
	#define siz(i) Tree[i].siz
	#define dep(i) Tree[i].dep
	#define fa(i) Tree[i].fa
}Tree[N];
inline void dfs1(int x,int father)
{
    dep(x)=dep(father)+1;
	fa(x)=father;
	siz(x)=1;
	for(ri i=head(x);i;i=Next(i)) 
	{
        ri y=ver(i);
        if(y!=father) 
		{
            fa(y)=x;
            dfs1(y,x);
            siz(x)+=siz(y);
        }
    }
} 
inline int maxx(int a,int b){return a>b?a:b;}
inline int minn(int a,int b){return a<b?a:b;}
bitset<100005>v;
int dis[N];
inline void add(int x,int y,int z)
{
	ver(++tot)=y; 
	edge(tot)=z; 
	Next(tot)=head(x); 
	head(x)=tot;
}
struct node{
	int x,y; 
	bool operator<(const node &a)const{
		return x<a.x;
	}
};
int a[N];
priority_queue<node>q;
struct Node{
	int sz,id,v; 
	bool operator<(const Node &a)const{
		return sz>a.sz;
	}
};
vector<Node>vt;
inline void dijkstra(int s)
{
	v.reset();
	for(ri i=1;i<=n;++i) dis[i]=INF;
	dis[s]=0;
	q.push((node){0,s});
	while(!q.empty())
	{
		ri x=q.top().y;
		q.pop();
		if(v[x]) continue;
		v[x]=1;
		vt.clear();
		for(ri i=head(x);i;i=Next(i)) 
		{
			ri y=ver(i),z=edge(i);
			if(y==fa(x)) continue;
			vt.push_back((Node){siz(y),y,z});  
		}
		sort(vt.begin(),vt.end());
		for(ri i=0;i<vt.size();++i)
		{
			ri y=vt[i].id,z=vt[i].v+i;
			//if(y==fa(x)) cout<<i<<' '<<x<<' '<<y<<"sss\n";
			if(dis[y]>dis[x]+z)
			{
				dis[y]=dis[x]+z;
				q.push((node){-dis[y],y});
			}
		}
	} 
}
int b[N],c,rt;
inline void sub2()
{
	print(n);
	putchar('\n');
	for(ri i=1;i<=n;++i) 
	{
		print(i);
		putchar(' ');
	}
	putchar('\n');
}
inline void sub3()
{
	if(n&1)
	{
		print((n-1)/2+2);
		putchar('\n');
		print((n+1)/2-1);
		putchar(' ');
		print((n+1)/2);
		putchar(' ');
		print((n+1)/2+1);
		putchar(' ');
	}
	else
	{
		print((n/2)+1);
		putchar('\n');
		print((n/2));
		putchar(' ');
		print((n/2)+1);
		putchar(' ');
	}
	putchar('\n');
}
signed main(void)
{ 
	rd(n); 
	for(ri i=2;i<=n;++i) 
	{
		rd(x);
		add(i,x,1);
		add(x,i,1);
	}
	/*dfs1(1,0);
	for(ri i=1;i<=n;++i) 
	{
		b[++rt]=dep(i); 
		if(dep(i)==2) ++c;
	}
	sort(b+1,b+1+n);
	bool fl=0;
	for(ri i=1;i<=n;++i) 
	{
		if(b[i]!=b[i-1]+1) 
		{
			fl=1;
			break;
		}
	}
	if(!fl) 
	{
		sub3();
		return 0;
	}
	if(c==n-1)
	{
		sub2();
		return 0;
	}*/
	//for(ri i=1;i<=n;++i) if(c[i]>=n-2&&n>2)
	////////////
	cnt=0; mi=INF;
	for(ri i=1;i<=n;++i) 
	{
		dfs1(i,0);
		dijkstra(i);
		ri res=-1;
		for(ri j=1;j<=n;++j) res=maxx(res,dis[j]);
		a[i]=res;
		mi=minn(mi,res);
	}
	++mi;
	print(mi);
	putchar('\n');
	for(ri i=1;i<=n;++i) 
	{
		if(a[i]==mi)
		{
			print(i);
			putchar(' ');
		}
	}
	return 0;
}
                        
2023/8/21 15:15
加载中...