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 ...
随机推荐
- 关于android的nfc问题
最近在研究android的nfc问题 首先再网上有很多关于android nfc 读写的问题,但是大多数都是关于Mifare Classic类型卡的读写,我百试不得骑解,于是自己写了一些程序供大家参考 ...
- 实现浏览器遗漏的原件 jQuery.selectCheckbox
工作中遇到了一个下拉需要实现checkbox的效果,如下图 或许网上已经有实现了,但简单的功能自己实现就好了, 结构 <div class="form-control-wrap&quo ...
- 不包含SDK头文件, 补全API定义
/// @file main.cpp /// @brief 不包含SDK头文件, 补全API定义 #ifdef __cplusplus extern "C" { #endif /* ...
- 让office2003和office2010共存的方法【转】
前段时间由于工作需要安装office2010,每次打开word都会弹出安装配置界面,反之亦然.于是我在网上找了不少资料.也试了不少方法,终于试用了以下方法得以解决,以下来源于网络. 电脑上同时安装了O ...
- win2k/xp查看当前进程
win2k/xp查看当前进程 tasklist tasklist | find "关键字" 可以对结果进行过滤 关闭当前某个进程 taskkill /pid 程序的PID号码 wi ...
- 基于visual Studio2013解决面试题之0510连续数之和
题目
- Dropbox + Farbox高速创建免费博客小站
创建自己的Dropbox账号(已有账号的略过) 注冊地址:Dropbox 点击链接注冊就好了,so easy: 账号注冊成功后,能够选择下载同步client(windows.Mac.ios.andro ...
- Android控件拖动的实现
这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图 这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载吧,一份是 ...
- 在WEB工程的web层中的编程技巧
本篇以看传智播客方立勋老师的<JDBC入门>之<实现客户关系管理案例>视频有感,从中提取方老师在设计管理系统的简单案例中对自己比较有用的部分,以便日后在开发过程中希望能有所帮助 ...
- jd.py
#!/usr/bin/env python #coding:utf-8 import urllib2,re,sys,os,types #from bs4 import BeautifulSoup re ...