QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#820351#9881. Diverge and ConvergeFesdrerWA 1ms3792kbC++142.8kb2024-12-18 21:05:392024-12-18 21:05:40

Judging History

你现在查看的是最新测评结果

  • [2024-12-18 21:05:40]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3792kb
  • [2024-12-18 21:05:39]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
bool st;
int n,vis[N];
multiset<int> e[5][N];
vector<pair<int,int>> ans[2];
pair<int,int> edge[2][N];
bool ed;
inline bool equ(pair<int,int> x,pair<int,int> y){
	if(x.first==y.first&&x.second==y.second)	return true;
	if(x.first==y.second&&x.second==y.first)	return true;
	return false;
}
inline void add(int op,int x,int y,bool flag=true){
	e[op][x].insert(y),e[op][y].insert(x);
	if(flag)	e[2][x].insert(y),e[2][y].insert(x);
}
inline void erase(int op,int x,int y,bool flag=true){
	e[op][x].erase(e[op][x].find(y)),e[op][y].erase(e[op][y].find(x));
	if(flag)	e[2][x].erase(e[2][x].find(y)),e[2][y].erase(e[2][y].find(x));
}
bool find(int op,int x,int fas,int z){
	if(x==z)	return true;
	for(int y:e[op][x]) if(y!=fas&&find(op,y,x,z))	return true;
	return false;
}
inline void check(){
	int sum=0;
	for(int i=1;i<=n;i++)	for(int op=0;op<=4;op++)	sum+=e[op][i].size();
	cout<<"	"<<sum<<" "<<ans[0].size()<<" "<<ans[1].size()<<endl;
}
void dfs(int _){
	if(_<=1)	return;
	int mn=n,x=0;
	for(int i=1;i<=n;i++)	if(!vis[i]&&int(e[2][i].size())<=mn)
		mn=int(e[2][i].size()),x=i;
// check();
	if(mn==2){
		int y=*e[0][x].begin(),z=*e[1][x].begin();
		vis[x]=1,erase(0,x,y),erase(1,x,z),dfs(_-1),add(0,x,y),add(1,x,z),vis[x]=0;
check();
		ans[0].push_back({x,y}),ans[1].push_back({x,z});
	}
	else{
		assert(mn==3);
		int op,nop;
		if(e[0][x].size()==1)	op=0,nop=1;
		else	op=1,nop=0;
		int w=*e[op][x].begin(),y=*e[nop][x].begin(),z=*(++e[nop][x].begin());
		vis[x]=1,erase(op,x,w),erase(nop,x,y),erase(nop,x,z),add(nop,y,z);
		dfs(_-1);
		int p=0,q=0;
		for(int i=1;i<=n;i++)	e[3][i]=e[0][i],e[4][i]=e[1][i];
		int pal=0;
		for(int i=0;i<int(ans[0].size());i++){
			if(equ(ans[nop][i],{y,z})){
				p=ans[op][i].first,q=ans[op][i].second;
				pal=i;
				break;
			}
			erase(3,ans[0][i].first,ans[0][i].second,0);
			erase(4,ans[1][i].first,ans[1][i].second,0);
			add(4,ans[0][i].first,ans[0][i].second,0);
			add(3,ans[1][i].first,ans[1][i].second,0);
		}

// check();

		if(!find(op+3,p,q,y))	swap(p,q);
		if(find(op+3,p,q,w)){
			ans[op].insert(ans[op].begin()+pal+1,{w,x});
			ans[nop][pal]={x,z},ans[nop].insert(ans[nop].begin()+pal+1,{x,y});
		}
		else{
			ans[op].insert(ans[op].begin()+pal+1,{w,x});
			ans[nop][pal]={x,y},ans[nop].insert(ans[nop].begin()+pal+1,{x,z});
		}
		add(op,x,w),add(nop,x,y),add(nop,x,z),erase(nop,y,z),vis[x]=0;
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int op=0;op<2;op++)	for(int i=1,x,y;i<n;i++)
		cin>>x>>y,edge[op][i]={x,y},add(op,x,y);
	dfs(n);
	for(int op=0;op<2;op++){
		for(pair<int,int> i:ans[op]){
			for(int j=1;j<n;j++) if(equ(i,edge[op][j])){
				cout<<j<<" ";
				break;
			}
		}
		cout<<endl;
	}
	return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3792kb

input:

4
1 2
2 3
3 4
1 2
2 4
2 3

output:

	8 0 0
	16 1 1
	24 2 2
1 2 3 
1 3 2 

result:

wrong answer Integer 8 violates the range [1, 3]