CF761E Dasha and Puzzle 題解
阿新 • • 發佈:2021-08-13
這道題非常有意思。
首先存在點的度數 >4 即無解。
如何保證不相交?把根放在原點,邊的長度為 \(2^{31−dep}\)。
DFS 一遍即可。
這道題就做完了!
程式碼非常簡短:
#include<bits/stdc++.h> #define log(a) cerr<<"\033[32m[DEBUG] "<<#a<<'='<<(a)<<" @ line "<<__LINE__<<"\033[0m"<<endl #define LL long long #define SZ(x) ((int)x.size()-1) #define ms(a,b) memset(a,b,sizeof a) #define F(i,a,b) for(int i=(a);i<=(b);++i) #define DF(i,a,b) for(int i=(a);i>=(b);--i) using namespace std; inline int read(){char ch=getchar(); int w=1,c=0; for(;!isdigit(ch);ch=getchar()) if (ch=='-') w=-1; for(;isdigit(ch);ch=getchar()) c=(c<<1)+(c<<3)+(ch^48); return w*c; } const int N=35; vector<int>v[N]; int dep[N],h[N];LL kx[N],ky[N]; void dfs(int x,int fa){ dep[x]=dep[fa]+1; LL k=(1ll<<(30-dep[x])); int z=-1; F(i,0,SZ(v[x])) if(v[x][i]!=fa){ kx[v[x][i]]=kx[x]; ky[v[x][i]]=ky[x]; z++; if(z==(h[x]^1))z++; h[v[x][i]]=z; if(z==0)kx[v[x][i]]+=k; if(z==1)kx[v[x][i]]-=k; if(z==2)ky[v[x][i]]+=k; if(z==3)ky[v[x][i]]-=k; dfs(v[x][i],x); } } signed main(){ int n=read(); F(i,2,n){ int x=read(),y=read(); v[x].push_back(y); v[y].push_back(x); } F(i,1,n) if(v[i].size()>4){ puts("NO"); return 0; } h[1]=-1; dfs(1,0); puts("YES"); F(i,1,n)cout<<kx[i]<<" "<<ky[i]<<endl; return 0; }