QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#820256 | #9881. Diverge and Converge | Fesdrer | RE | 1ms | 3904kb | C++17 | 2.5kb | 2024-12-18 20:26:03 | 2024-12-18 20:26:04 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,vis[N];
unordered_multiset<int> e[5][N];
vector<pair<int,int>> ans[2];
pair<int,int> edge[2][N];
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){
e[op][x].insert(y),e[op][y].insert(x);
e[2][x].insert(y),e[2][y].insert(x);
}
inline void erase(int op,int x,int y){
e[op][x].erase(e[op][x].find(y)),e[op][y].erase(e[op][y].find(x));
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,fas,z)) return true;
return false;
}
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;
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;
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,q;
for(int i=1;i<=n;i++) e[3][i]=e[0][i],e[4][i]=e[0][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);
add(4,ans[0][i].first,ans[0][i].second);
erase(4,ans[1][i].first,ans[1][i].second);
add(3,ans[1][i].first,ans[1][i].second);
}
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;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3904kb
input:
4 1 2 2 3 3 4 1 2 2 4 2 3
output:
1 2 3 1 3 2
result:
ok Correct, N = 4
Test #2:
score: 0
Accepted
time: 0ms
memory: 3828kb
input:
2 1 2 2 1
output:
1 1
result:
ok Correct, N = 2
Test #3:
score: -100
Runtime Error
input:
7 1 2 1 3 2 4 2 5 3 6 3 7 1 5 1 6 1 7 5 2 6 3 7 4