[CodeForces - 197E] E - Paint Tree
E - Paint Tree
You are given a tree with n vertexes and n points on a plane, no three points lie on one straight line.
Your task is to paint the given tree on a plane, using the given points as vertexes.
That is, you should correspond each vertex of the tree to exactly one point and each point should correspond to a vertex. If two vertexes of the tree are connected by an edge, then the corresponding points should have a segment painted between them. The segments that correspond to non-adjacent edges, should not have common points. The segments that correspond to adjacent edges should have exactly one common point.
Input
The first line contains an integer n (1 ≤ n ≤ 1500) — the number of vertexes on a tree (as well as the number of chosen points on the plane).
Each of the next n - 1 lines contains two space-separated integers ui and vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — the numbers of tree vertexes connected by the i-th edge.
Each of the next n lines contain two space-separated integers xi and yi ( - 109 ≤ xi, yi ≤ 109) — the coordinates of the i-th point on the plane. No three points lie on one straight line.
It is guaranteed that under given constraints problem has a solution.
Output
Print n distinct space-separated integers from 1 to n: the i-th number must equal the number of the vertex to place at the i-th point (the points are numbered in the order, in which they are listed in the input).
If there are several solutions, print any of them.
Example
31 32 30 01 12 0
1 3 2
41 22 31 4-1 -23 5-3 32 0
4 2 1 3
Note
The possible solutions for the sample are given below.
题目意思就是,给你一棵已经定型的无根树,然后在二维屏幕上给出几个坐标,要求将树的每一个节点对应到二维平面上的每一个点上,要求形成的是一棵正常的树.
这题完全没思路,只知道肯定是排序+DFS,然而,就是没有想的更深一点——极角排序+分治.
我们每次递归分治的的时候,标记的总是一段区间,这个区间是有一定顺序的,他按照基准点极角排序.为什么极角排序就一定对呢?
因为每一次,你找的相当于在凸多边形上这个点的下几个点,不会穿越其他线段,这段区间也会被覆盖满(极角排序的性质很适用).最后输出就好了,效率应该是n^nlogn的。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
,maxe=;
int size[maxn],fa[maxn];
int n,tot,nxt[maxe],son[maxe],lnk[maxn],ans[maxn];
bool vis[maxn];
struct point{int x,y,id;}a[maxn],mainp;
point operator - (point p,point q){point ret; ret.x=p.x-q.x,ret.y=p.y-q.y; return ret;}
LL cross(point p,point q){return (LL)p.x*q.y-(LL)q.x*p.y;}
bool cmp1(point u,point v){return u.x!=v.x?u.x<v.x:u.y<v.y;}
;}
int read(){
,f=; char ch=getchar();
'){if (ch=='-') f=-f; ch=getchar();}
+ch-',ch=getchar();
return x*f;
}
void add(int x,int y){nxt[++tot]=lnk[x],son[tot]=y,lnk[x]=tot;}
void DFS(int x){
vis[x]=,size[x]=;
for (int j=lnk[x]; j; j=nxt[j]) if (!vis[son[j]]){
DFS(son[j]); size[x]+=size[son[j]];
}
}
void DFS(int x,int fa,int L,int R){
sort(a+L,a++R,cmp1);
ans[a[L].id]=x,mainp.x=a[L].x,mainp.y=a[L].y;
sort(a++L,a++R,cmp2);
int now=L;
for (int j=lnk[x]; j; j=nxt[j]) if (son[j]!=fa){
DFS(son[j],x,now+,now+size[son[j]]),now+=size[son[j]];
}
}
int main(){
n=read(),tot=;
; i<n; i++){int x=read(),y=read(); add(x,y),add(y,x);}
memset(vis,,,);
; i<=n; i++) a[i].x=read(),a[i].y=read(),a[i].id=i;
DFS(,,,n);
; i<=n; i++) printf("%d ",ans[i]);
;
}
[CodeForces - 197E] E - Paint Tree的更多相关文章
- Codeforces 196 C. Paint Tree
分治.选最左上的点分给根.剩下的极角排序后递归 C. Paint Tree time limit per test 2 seconds memory limit per test 256 megaby ...
- Codeforces Round #124 (Div. 1) C. Paint Tree(极角排序)
C. Paint Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- Codeforces 196C Paint Tree(贪心+极角排序)
题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...
- Codeforces 461B Appleman and Tree(木dp)
题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...
- Codeforces 1129 E.Legendary Tree
Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1\) 次 \((S=\{1\},T=\{ ...
- Codeforces 280C Game on tree【概率DP】
Codeforces 280C Game on tree LINK 题目大意:给你一棵树,1号节点是根,每次等概率选择没有被染黑的一个节点染黑其所有子树中的节点,问染黑所有节点的期望次数 #inclu ...
- Codeforces A. Game on Tree(期望dfs)
题目描述: Game on Tree time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #781(C. Tree Infection)
Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...
- Codeforces 734E. Anton and Tree 搜索
E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...
随机推荐
- Lintcode35-Reverse Linked List-Easy
35. Reverse Linked List Reverse a linked list. Example Example1:For linked list 1->2->3, the r ...
- python实现八皇后问题
import random def judge(state, nextX): #判断是否和之前的皇后状态有冲突 nextY = len(state) for i in range(nextY): if ...
- python学习打卡 day12 生成器
本节主要内容 : 生成器 生成器函数 各种推导式 生成器表达式 一.生成器 什么是生成器.生成器的本质就是迭代器. 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实 ...
- Python 爬虫常用的库
一.常用库 1.requests 做请求的时候用到. requests.get("url") 2.selenium 自动化会用到. 3.lxml 4.beautifulsoup 5 ...
- 【Python】【函数式编程】
#[练习] 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0 的两个解. 提示:计算平方根可以调用math.sqrt()函数: & ...
- CSS垂直居中查询宝典
一.垂直居中的用处 设计稿需求 当我们抱怨设计反复不定的时候,试着理解一下.每一位开发者也会是一位用户,请多多用'用户'的角色去开发.就比如下面这图,你会更稀饭哪种格式呢? 如果我们使用一个webap ...
- vs 2015 编译cocos2d-x-3.9
下载地址:链接: https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ 提取码: p1pb 或者去官网下载. 解压后,进入build文件夹,点击如下工程链接 ...
- vs2015 VS-Visual Studio-IIS Express 支持局域网访问
使用Visual Studio开发Web网页的时候有这样的情况:想要在调试模式下让局域网的其他设备进行访问,以便进行测试.虽然可以部署到服务器中,但是却无法进行调试,就算是注入进程进行调试也是无法达到 ...
- L2-021 点赞狂魔
会set的基础用法就可以A了,虽然是L2题,但是不难,代码如下,很好理解,set在这里不解释了自己去网上查一下就明白了: #include<stdio.h> #include<str ...
- Qt5_选择文件对话框
1. 类似如下代码: QString fileName = QFileDialog::getOpenFileName( this, tr("Open File"), NULL,// ...