WA 90pts 求 hack
查看原帖
WA 90pts 求 hack
723238
wukaichen888楼主2023/8/13 20:04

测试点 #2 过不去

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
typedef long long ll;
const ll N=2e6+5;
int t,n,m,fr[N],to[N],pa[N],dep[N],zhx[N],d[N],que[N],qr;
vector<int>v[N],g[N];
map<pair<int,int>,bool>mp;
void build(int x,int y){
	if(x>y) swap(x,y);
	mp[make_pair(x,y)]=1;
	printf("%d %d\n",x,y);
}
bool cmp(int x,int y){return zhx[x]<zhx[y];} 
void dfs1(int x){
	for(int i=0;i<v[x].size();i++){
		dep[v[x][i]]=dep[x]+1;
		dfs1(v[x][i]);
	}
}
void dfs(int x){
	sort(v[x].begin(),v[x].end(),cmp);
	for(int i=0;i<v[x].size();i++){
		build(x,v[x][i]);
		dfs(v[x][i]);
	}
}
int main(){
	srand(time(0));
	scanf("%d%d",&n,&m);
	for(int i=1,x,y;i<=m;i++){
		scanf("%d%d",&fr[i],&to[i]);
		if(fr[i]>to[i]) swap(fr[i],to[i]);
	}
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x),pa[i]=x;
		v[x].push_back(i);
		if(i>1){
			g[i].push_back(x);
			d[x]++;
		}
	}
	dep[1]=1;dfs1(1);
	for(int i=1;i<=m;i++)
		if(abs(dep[fr[i]]-dep[to[i]])>1) puts("WTF!!!");
		else
			if(abs(dep[fr[i]]-dep[to[i]])==1)
				if(!(pa[fr[i]]==to[i]||pa[to[i]]==fr[i])){
					if(dep[fr[i]]>dep[to[i]]){
						g[fr[i]].push_back(to[i]);
						d[to[i]]++;
					}
					else{
						g[to[i]].push_back(fr[i]);
						d[fr[i]]++;
					}
				}
	for(int i=1;i<=n;i++)
		if(!d[i])
			que[zhx[i]=++qr]=i;
	for(int i=1,u;i<=qr;i++){
		u=que[i];
		for(int j=0;j<g[u].size();j++)
			if(!--d[g[u][j]])
				que[zhx[g[u][j]]=++qr]=g[u][j];
	}
	dfs(1);
	for(int i=1,x,y;i<=m;i++)
		if(mp[make_pair(fr[i],to[i])]) mp[make_pair(fr[i],to[i])]=0;
		else printf("%d %d\n",fr[i],to[i]);
	return 0;
}
2023/8/13 20:04
加载中...