QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#885952 | #10000. Add, Remove, Transform | Naganohara_Yoimiya | RE | 6ms | 4992kb | C++20 | 6.4kb | 2025-02-06 19:46:36 | 2025-02-06 19:46:36 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define mk make_pair
#define fi first
#define se second
using namespace std;
#define gc getchar
inline int read(){
int x=0,f=1;char c=getchar();
for(;(c<'0'||c>'9');c=getchar()){if(c=='-')f=-1;}
for(;(c>='0'&&c<='9');c=getchar())x=x*10+(c&15);
return x*f;
}
template<typename T>void cmax(T &x,T v){x=max(x,v);}
template<typename T>void cmin(T &x,T v){x=min(x,v);}
vector<pair<int,int> >getTree(vector<int>P){ // prufer sequence -> tree
int n=P.size()+2;
vector<int>deg(n,1);for(int x:P)deg[x]++;
set<int>Leaf;vector<pair<int,int> >edges;
for(int i=0;i<n;i++)if(deg[i]==1)Leaf.insert(i);
for(int i=0;i<n-2;i++){
int x=*Leaf.begin();Leaf.erase(Leaf.begin());
int y=P[i];edges.emplace_back(mk(y,x));
if(--deg[y]==1)Leaf.insert(y);
}
edges.emplace_back(mk(*Leaf.begin(),*--Leaf.end()));
return edges;
}
void A(int x,int y,vector<vector<int> >&G){G[x][y]^=1,G[y][x]^=1;}
void oper(int a,int b,int c,int d,vector<vector<int> >&G){
assert(G[a][b]&&G[b][c]&&G[c][d]&&a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d);
A(a,b,G),A(b,c,G),A(c,d,G),A(c,a,G),A(a,d,G),A(d,b,G);
}
const int N=1305; // 6^4 = 1296
map<vector<vector<int> >,int>ID;
vector<vector<int> >Gs[N];
int pre[N];
struct OP{int a,b,c,d;OP(int A=0,int B=0,int C=0,int D=0):a(A),b(B),c(C),d(D){}};
OP rec[N];
vector<pair<int,OP> >to[N];
OP rev(OP x){return OP(x.c,x.a,x.d,x.b);}
void prework(){
int n=6,ncnt=0;
vector<int>P(n-2);
for(P[0]=0;P[0]<n;P[0]++)for(P[1]=0;P[1]<n;P[1]++)for(P[2]=0;P[2]<n;P[2]++)for(P[3]=0;P[3]<n;P[3]++){
auto E=getTree(P);++ncnt;
vector<vector<int> >G(n,vector<int>(n));
for(auto [u,v]:E)G[u][v]=G[v][u]=1;
ID[G]=ncnt,Gs[ncnt]=G;
}
// assert(ncnt==1296);
for(int i=1;i<=ncnt;i++){
auto G=Gs[i];
for(int a=0;a<n;a++)for(int b=0;b<n;b++)for(int c=0;c<n;c++)for(int d=0;d<n;d++){
if(a==b||a==c||a==d||b==c||b==d||c==d)continue;
if(!G[a][b]||!G[b][c]||!G[c][d])continue;
oper(a,b,c,d,G);
to[i].emplace_back(mk(ID[G],OP(a,b,c,d)));
oper(c,a,d,b,G);
}
}
queue<int>Q;Q.push(2);
while(Q.size()){
int x=Q.front();Q.pop();
for(auto [y,op]:to[x])if(!pre[y])pre[y]=x,rec[y]=op,Q.push(y);
}
}
vector<OP>find_path(vector<vector<int> >G1,vector<vector<int> >G2){
int n=G1.size();
// cout<<" G1 = ";for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(G1[i][j])cout<<"("<<i<<","<<j<<") ";puts("");
// cout<<" G2 = ";for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(G2[i][j])cout<<"("<<i<<","<<j<<") ";puts("");
int x=ID[G1],y=ID[G2];
// cout<<"x,y = "<<x<<" "<<y<<" pre = "<<pre[x]<<" "<<pre[y]<<endl;
assert(pre[x]&&pre[y]);
vector<OP>path,path2;
while(y!=2)path2.emplace_back(rec[y]),y=pre[y];
reverse(path2.begin(),path2.end());
while(x!=2)path.emplace_back(rev(rec[x])),x=pre[x];
for(auto op:path2)path.emplace_back(op);
return path;
}
vector<OP>ans;
void add_op(int a,int b,int c,int d){ans.emplace_back(OP(a,b,c,d));}
void solve(){
int n=read(),k=3;
vector<vector<int> >G(n,vector<int>(n)),adj(n);
for(int i=1;i<=n-1;i++){
int u=read()-1,v=read()-1;
G[u][v]=G[v][u]=1,adj[u].emplace_back(v),adj[v].emplace_back(u);
}
auto bfs=[&](int u){
queue<int>q;vector<int>dis(n,-1);
dis[u]=0;q.push(u);
while(q.size()){
int x=q.front();q.pop();
for(int y=0;y<n;y++)if(G[x][y]&&dis[y]==-1)dis[y]=dis[x]+1,q.push(y);
}
return dis;
};
auto diam=[&](){
auto dis=bfs(0);int x=0;
for(int i=0;i<n;i++)if(dis[i]>dis[x])x=i;
dis=bfs(x);
for(int i=0;i<n;i++)if(dis[i]>dis[x])x=i;
return dis[x];
};
if(diam()<=2)return puts("0"),void();
if(k==2)return puts("-1"),void();
if(n==5){
if(diam()==4){
auto dis=bfs(0);int x=0;
for(int i=0;i<n;i++)if(dis[i]>dis[x])x=i;
dis=bfs(x);vector<int>id(10);
for(int i=0;i<n;i++)id[dis[i]]=i;
puts("1");
cout<<id[0]<<" "<<id[1]<<" "<<id[2]<<" "<<id[3]<<endl;
}
else puts("0");
return ;
}
auto compact=[&](vector<int>nodes){
assert(nodes.size()==6&&nodes[0]==0);
// cerr<<"compact : nodes = ";for(int x:nodes)cout<<x<<" ";puts("");
vector<int>id(n);
for(int i=0;i<6;i++)id[nodes[i]]=i;
vector<vector<int> >G1(6,vector<int>(6)),G2(6,vector<int>(6));
for(int i=0;i<6;i++)for(int j=0;j<6;j++)G1[i][j]=G[nodes[i]][nodes[j]];
G2[0][1]=G2[0][2]=G2[0][3]=G2[0][4]=G2[4][5]=1;
G2[1][0]=G2[2][0]=G2[3][0]=G2[4][0]=G2[5][4]=1;
auto ops=find_path(G1,G2);
for(auto op:ops){
auto [a,b,c,d]=op;
a=nodes[a],b=nodes[b],c=nodes[c],d=nodes[d];
oper(a,b,c,d,G),add_op(a,b,c,d);
}
};
// cerr<<"now G = ";for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(G[i][j])cout<<"("<<i<<","<<j<<") ";puts("");
// cerr<<"diam = "<<diam()<<endl;
while(true){
vector<int>fa(n),dep(n),d(n),hson(n,-1);
function<void(int)>dfs=[&](int u){
hson[u]=-1;
for(int v=0;v<n;v++)if(G[u][v]&&fa[u]!=v){
fa[v]=u,dep[v]=dep[u]+1,dfs(v);
cmax(d[u],d[v]+1);if(hson[u]==-1||d[v]>d[hson[u]])hson[u]=v;
}
};
dfs(0);bool hav=false;
for(int i=0;i<n;i++)if(dep[i]>=3)hav=true;
// cerr<<"dep = ";for(int i=0;i<n;i++)cerr<<dep[i]<<" \n"[i==n-1];
if(!hav)break;
vector<int>nodes;
function<void(int)>dfs2=[&](int u){
if(nodes.size()==6)return ;
nodes.emplace_back(u);
if(hson[u]!=-1)dfs2(hson[u]);
for(int v=0;v<n;v++)if(G[u][v]&&v!=fa[u]&&v!=hson[u])dfs2(v);
};
dfs2(0);
compact(nodes);
// cerr<<" -> G = ";for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(G[i][j])cout<<"("<<i<<","<<j<<") ";puts("");
}
auto output=[&](){
cout<<ans.size()<<'\n';
for(auto [a,b,c,d]:ans)cout<<a+1<<" "<<b+1<<" "<<c+1<<" "<<d+1<<'\n';
vector<OP>().swap(ans);
return ;
};
if(diam()<=3)return output();
assert(diam()==4);
while(diam()==4){
vector<int>fa(n),dep(n);
function<void(int)>dfs=[&](int u){
for(int v=0;v<n;v++)if(v!=fa[u]&&G[u][v])fa[v]=u,dep[v]=dep[u]+1,dfs(v);
};
dfs(0);
int x=-1,y=-1;
for(int i=0;i<n;i++)if(dep[i]==2){
x=i;auto dis=bfs(x);
for(int j=0;j<n;j++)if(dis[j]==4){y=j;break;}
break;
}
assert(x!=-1&&y!=-1);
int p=-1;
for(int i=0;i<n;i++)if(i!=0&&i!=x&&i!=y&&i!=fa[x]&&i!=fa[y])p=i;
assert(p!=-1);
vector<int>nodes(6);
nodes[0]=0,nodes[1]=x,nodes[2]=y,nodes[3]=fa[x],nodes[4]=fa[y],nodes[5]=p;
compact(nodes);
}
assert(diam()<=3);
output();
}
signed main(void){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
prework();
int tt=1;
// int tt=read();
while(tt--)solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 6ms
memory: 4992kb
input:
6 1 2 2 3 3 4 4 5 5 6
output:
11 1 2 3 4 1 4 5 6 2 4 6 1 3 1 2 6 3 6 1 4 2 3 4 6 5 1 3 6 1 6 2 4 3 5 6 4 1 4 3 6 1 6 4 5
result:
ok ok nice tree :D
Test #2:
score: -100
Runtime Error
input:
100 4 44 45 44 33 44 60 44 71 44 25 44 69 44 57 44 16 44 78 44 17 44 10 44 21 44 80 44 2 44 98 44 20 44 83 44 3 44 79 44 22 44 65 44 5 44 39 44 23 44 100 44 66 44 7 44 14 44 81 44 6 44 41 44 59 44 87 44 32 44 63 44 74 44 84 44 86 44 18 44 24 44 96 4 35 44 8 44 62 44 58 44 85 44 53 44 82 44 42 44 12 ...