Codeforces 196 C. Paint Tree
分治。选最左上的点分给根。剩下的极角排序后递归
2 seconds
256 megabytes
standard input
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.
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 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.
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.
3
1 3
2 3
0 0
1 1
2 0
1 3 2
4
1 2
2 3
1 4
-1 -2
3 5
-3 3
2 0
4 2 1 3
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的更多相关文章
- [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 ...
- 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 #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- 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 ...
随机推荐
- Silverlight技术调查(3)——国际化
原文 Silverlight技术调查(3)——国际化 网上有很多关于Silverlight国际化的说明,包括MSDN的示例,都没有强调一点,下面以红色标示,基础国际化知识请先参考MSDN相关章节,关键 ...
- 嵌入式ntp服务器的移植
一.交叉编译 1.官网下载http://www.ntp.org/点击download选项页 我的版本是ntp-4.2.6p5.tar.gz 2.解压 tar -zxvf ntp-4.2.6p5.tar ...
- CppCMS URL使用
Artyom觉得URL分为三个组成部分: Script_Name / Path_Info ? Query_String 比方以下的: /foo/bar.php/test?x=10 Script_Nam ...
- HDU 4669 Mutiples on a circle (DP , 统计)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个环,每个点是一个数字,取一个子串,使 ...
- windows的定时任务设置
windows 的Schedule Task .创建配置 1.点击"開始" 2.点击"控制面板" 3.双击"任务计划" 4.双击" ...
- 用js制作的几个效果
一,表格光柱效果(奇偶行不同颜色,鼠标移上变色) <html xmlns="http://www.w3.org/1999/xhtml"><head>< ...
- asp.net中通过注册表来检测是否安装Office(迅雷/QQ是否已安装)
原文 asp.net中通过注册表来检测是否安装Office(迅雷/QQ是否已安装) 检测Office是否安装以及获取安装 路径 及安装版本 代码如下 复制代码 #region 检测Office是否 ...
- 14.6.7?Limits on InnoDB Tables InnoDB 表的限制
14.6.7?Limits on InnoDB Tables InnoDB 表的限制 警告: 不要把MySQL system tables 从MyISAM 到InnoDB 表. 这是不支持的操作,如果 ...
- Struts2图片文件上传,判断图片格式和图片大小
1. 配置Struts2能够上传的最大文件大小 使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够 ...
- 最全的Swift社交应用文本输入优化汇总
在大部分应用中,都有输入的需求,面对众多用户,他们的想法各异,输入的文本内容也是千奇百怪,面对不同的输入,我们该如何优化输入体验?本文将汇总一下Swift社交应用文本输入优化技巧. AD: 一.输入相 ...