Codeforces Round #394 (Div. 2) E. Dasha and Puzzle 构造 坐标离散化
来源:互联网 发布:dc数据恢复指南针 编辑:程序博客网 时间:2024/05/01 00:42
题意:给一颗树,问是否能够放到网格图里,保证只有横边和竖边,且边与边不相交。
解法:
开脑洞,先想能不能找到这样的树,树应该至少满足一个要求:
1.根节点能有4个儿子,非根节点最多只有3个儿子。
满足要求1,理论上就一定能找到这样的树,即可以另深度为d的边比深度为d+1的边长很多很多,这样使得各个方向的子图离的尽量远,不管子树的图形再怎么乱,子树和子树之间也不会碰在一起。
满足这个要求的极限条件就是下面这个不等式:
2^0+2^1+...+2^(k-1)=2^k-1<2^k,可以刚好不碰到,故深度1-k的边长依次为2^k,2^(k-1),...,2^1,2^0。
构造完树之后,坐标离散化一下可以让节点坐标缩在0~n-1之间。
代码依次为去重离散化,未去重离散化,未离散化版本,题目给的范围不需要离散化也能过:
#include <cstdio>#include <vector>#include <cstdlib>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned int uii;const ll dx[4]={0,-1,0,1};const ll dy[4]={-1,0,1,0};int n,u,v,n1,n2;ll rx[31],ry[31];vector<ll> x,y;vector<int> vec[31];void dfs(int u,int fa,ll x,ll y,ll d,int dir) { int id=0; rx[u]=x; ry[u]=y; for (uii i=0;i<vec[u].size();++i) { int v=vec[u][i]; if (v==fa) continue; if (dir!=-1&&((id&1)==(dir&1)&&id!=dir)) ++id; if (id>=4) { puts("NO"); exit(0); } dfs(v,u,x+dx[id]*d,y+dy[id]*d,d>>1,id); ++id; }}int main(){ scanf("%d",&n); for (int i=0;i<n-1;++i) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } dfs(1,-1,0,0,1LL<<n,-1); for (int i=1;i<=n;++i) { x.push_back(rx[i]); y.push_back(ry[i]); } sort(x.begin(),x.end()); x.erase(unique(x.begin(),x.end()),x.end()); sort(y.begin(),y.end()); y.erase(unique(y.begin(),y.end()),y.end()); puts("YES"); for (int i=1;i<=n;++i) printf("%ld %ld\n",lower_bound(x.begin(),x.end(),rx[i])-x.begin(),lower_bound(y.begin(),y.end(),ry[i])-y.begin()); return 0;}
#include <cstdio>#include <vector>#include <cstdlib>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned int uii;const ll dx[4]={0,-1,0,1};const ll dy[4]={-1,0,1,0};int n,u,v,id1[31],id2[31];ll rx[31],ry[31];vector<int> vec[31];bool cmp1(int a,int b) { return rx[a]<rx[b];}bool cmp2(int a,int b) { return ry[a]<ry[b];}void dfs(int u,int fa,ll x,ll y,ll d,int dir) { int id=0; rx[u]=x; ry[u]=y; for (uii i=0;i<vec[u].size();++i) { int v=vec[u][i]; if (v==fa) continue; if (dir!=-1&&((id&1)==(dir&1)&&id!=dir)) ++id; if (id>=4) { puts("NO"); exit(0); } dfs(v,u,x+dx[id]*d,y+dy[id]*d,d>>1,id); ++id; }}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) id1[i]=id2[i]=i; for (int i=0;i<n-1;++i) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } dfs(1,-1,0,0,1LL<<n,-1); sort(id1+1,id1+n+1,cmp1); sort(id2+1,id2+n+1,cmp2); puts("YES"); for (int i=1;i<=n;++i) printf("%ld %ld\n",lower_bound(id1+1,id1+n+1,i,cmp1)-id1,lower_bound(id2+1,id2+n+1,i,cmp2)-id2); return 0;}
#include <cstdio>#include <vector>#include <cstdlib>using namespace std;typedef long long ll;typedef unsigned int uii;const ll dx[4]={0,-1,0,1};const ll dy[4]={-1,0,1,0};int n,u,v;ll rx[31],ry[31];vector<int> vec[31];void dfs(int u,int fa,ll x,ll y,ll d,int dir) { int id=0; rx[u]=x; ry[u]=y; for (uii i=0;i<vec[u].size();++i) { int v=vec[u][i]; if (v==fa) continue; if (dir!=-1&&((id&1)==(dir&1)&&id!=dir)) ++id; if (id>=4) { puts("NO"); exit(0); } dfs(v,u,x+dx[id]*d,y+dy[id]*d,d>>1,id); ++id; }}int main(){ scanf("%d",&n); for (int i=0;i<n-1;++i) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } dfs(1,-1,0,0,1LL<<n,-1); puts("YES"); for (int i=1;i<=n;++i) printf("%lld %lld\n",rx[i],ry[i]); return 0;}
1 0
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle 构造 坐标离散化
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(构造)
- Codeforces Round #394 (Div. 2)-E. Dasha and Puzzle(dfs)
- Codeforces Round #394 (Div. 2)E. Dasha and Puzzle【思维+Dfs构造】
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(想法题,构造题)
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle —— 构造 + 贪心
- Codeforces Round #390 (Div. 2)E Dasha and cyclic table
- Codeforces 761E Dasha and Puzzle【构造,树dfs】
- Codeforces Round #394 (Div. 2) C. Dasha and Password
- Codeforces Round #394 (Div. 2) Dasha and Password
- Codeforces Round #394 (Div. 2)Dasha and friends
- Codeforces Round #394 (Div. 2)Dasha and Stairs
- Codeforces Round #394 (Div. 2)Dasha and Very Difficult Problem
- Codeforces Round #394(Div. 2)A.Dasha and Stairs【水题】
- Codeforces Round #394 (Div. 2)C. Dasha and Password【暴力】
- Codeforces Round #394 (Div. 2) C. Dasha and Password
- Codeforces Round #394 (Div. 2) Dasha and Very Difficult Problem
- Codeforces Round #394 (Div. 2) A. Dasha and Stairs 易错
- FTP基础知识 FTP port(主动模式) pasv(被动模式) 及如何映射FTP
- shrink_active_list
- Linux关于磁盘管理的二三事(二)
- dubbo源码分析
- 【bzoj1697】牛排序 置换群
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle 构造 坐标离散化
- 周笔记(6/52) - DX11 - Geometry Shader/Compute Shader
- 动脑学院Android高级开发视频教程
- nmap识别端口的6中状态
- IO流_字符缓冲输出流BufferedWriter的使用
- 决策与判断读书笔记
- 计算天数
- 字符串通配(正则表达式)
- matlab绘制柱状图