QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#820351 | #9881. Diverge and Converge | Fesdrer | WA | 1ms | 3792kb | C++14 | 2.8kb | 2024-12-18 21:05:39 | 2024-12-18 21:05:40 |
Judging History
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]