CF761E Dasha and Puzzle 题解

这道题非常有意思。

首先存在点的度数 >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;
}

CF761E Dasha and Puzzle 题解

上一篇:MapReduce框架-Join的使用


下一篇:递归的理解