分治。选最左上的点分给根。剩下的极角排序后递归

C. Paint Tree
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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 ≤ nui ≠ 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 thei-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.

Sample test(s)
input
3
1 3
2 3
0 0
1 1
2 0
output
1 3 2
input
4
1 2
2 3
1 4
-1 -2
3 5
-3 3
2 0
output
4 2 1 3
Note

The possible solutions for the sample are given below.


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std; const int maxn=1520; int n,X,Y; struct PO
{
int x,y,d;
bool operator<(const PO &o) const
{
if(x-X>=0&&o.x-X<=0) return 1;
if(x-X<=0&&o.x-X>=0) return 0;
return (y-Y)*(long long)(o.x-X)<(o.y-Y)*(long long)(x-X);
}
}p[maxn]; vector<int> g[maxn]; bool vis[maxn];
int sz[maxn],o[maxn]; int dfs(int u)
{
vis[u]=true;
sz[u]=1;
int ret=0;
for(int i=0,j=g[u].size();i<j;i++)
{
int v=g[u][i];
if(vis[v]) continue;
ret+=dfs(v);
}
sz[u]+=ret;
return sz[u];
} void calc(int u,int l,int r)
{
vis[u]=true;
int t=l;
for(int i=l+1;i<=r;i++)
{
if((p[i].y<p[t].y)||(p[t].y==p[i].y&&p[i].x<p[t].x))
t=i;
}
if(t!=l) swap(p[l],p[t]);
o[p[l].d]=u;
X=p[l].x; Y=p[l].y;
sort(p+l+1,p+r+1);
int pos=l+1;
for(int i=0,j=g[u].size();i<j;i++)
{
int v=g[u][i];
if(vis[v]) continue;
calc(v,pos,pos+sz[v]-1);
pos+=sz[v];
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x].push_back(y); g[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
p[i]=(PO){x,y,i};
}
dfs(1);
memset(vis,0,sizeof(vis));
calc(1,1,n);
for(int i=1;i<=n;i++)
printf("%d ",o[i]);
putchar(10);
return 0;
}

Codeforces 196 C. Paint Tree的更多相关文章

  1. [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 ...

  2. 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 ...

  3. Codeforces 196C Paint Tree(贪心+极角排序)

    题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...

  4. Codeforces 461B Appleman and Tree(木dp)

    题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k ...

  5. Codeforces 1129 E.Legendary Tree

    Codeforces 1129 E.Legendary Tree 解题思路: 这题好厉害,我来复读一下官方题解,顺便补充几句. 首先,可以通过询问 \(n-1​\) 次 \((S=\{1\},T=\{ ...

  6. Codeforces 280C Game on tree【概率DP】

    Codeforces 280C Game on tree LINK 题目大意:给你一棵树,1号节点是根,每次等概率选择没有被染黑的一个节点染黑其所有子树中的节点,问染黑所有节点的期望次数 #inclu ...

  7. [Codeforces #196] Tutorial

    Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...

  8. Codeforces A. Game on Tree(期望dfs)

    题目描述: Game on Tree time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. Codeforces Round #781(C. Tree Infection)

    Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...

随机推荐

  1. hdu 3874 Necklace(线段树)

    这道题目和我之前做过的一道3xian大牛出的题目很像,不过总的来说还是要简单一点儿. 计算区间内的值的时候如果两个值相等,只能计算其中一个. 这道题需要将所有的问题输入之后再计算,首先,对所有问题的右 ...

  2. 09-使用for循环输出空心菱形(循环)

    /** * 使用for循环输出空心菱形 * */ public class Test7 { public static void main(String[] args) { for (int i = ...

  3. js点击button按钮跳转到另一个新页面

    点击按钮怎么跳转到另外一个页面呢?我们在网站制作中可能是需要的,因为有时我们需要做这样的效果,尤其是将按钮做成一个图片,而点击图片要跳转到新的页面时,怎么做到呢? 这样的效果可以:onclick=&q ...

  4. Winfrom设置DataGridView单元格获得焦点(DataGridView - CurrentCell)

    设置DataGridView单元格获得焦点 this.dgv_prescription.BeginEdit(true);

  5. Boost::thread库的使用

    阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...

  6. nginx的反向代理和负载均衡的区别是什么 - 开源中国社区

    nginx的反向代理和负载均衡的区别是什么 - 开源中国社区   nginx的反向代理和负载均衡的区别是什么 #user  nobody;worker_processes  1;#error_log  ...

  7. org.apache.jasper.JasperException: java.lang.ClassCastException

    异常信息: org.apache.jasper.JasperException: java.lang.ClassCastException:org.apache.catalina.util.Defau ...

  8. ABP启动配置

    ABP启动配置   返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...

  9. CRectTracker类的使用--橡皮筋窗口

    CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类.你在Windows中经常看到这样的情况:它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用.如何通过编程来实现这种功能 ...

  10. io端口

    io端口 ***********************************************************   io端口设备访问流程为 --------------------- ...