【墨西哥区域赛】Carpet
原题:

题意:
给你一个树,有1e5个节点,让你把这个树放在一个长1e6宽20的网格图里,要求一个格子放一个节点,树边之间不能相交
这是一道构造题
因为树的形状可能性很多,很复杂,所以不能简单猜测,而必须要依据某种性质,来保证生成的解一定合法
先尝试小规模,或特殊的问题也是一个重要的思想方法
首先考虑一个节点A和它的所有儿子
不难发现,这时可以把这个节点放在某层,然后把它的儿子放在下一层的一个区间内
只要爸爸出现的顺序和儿子所在区间出现的顺序相同,就不会发生冲突
因为在两层之间连边,斜率只会无限趋于0,所以不会出现于(xA, yA+1)和(xA, yA-1)冲突的情况,只需保证这两层之间的边不相交
继而可以发现,只要满足这个条件,不管A和它的儿子们在什么位置,都不会和别人冲突
为了压缩空间,所有的儿子可以连续放在一起,即使和爸爸相距太远也没有问题
其次,题目数据中宽度为20
根据经验,与众不同的数字往往有重要含义
可以敏感地发现20刚好是log1e6
联系到树链剖分
因为重链剖分保证任意一个节点到根节点的路径最多只会经过logn条重链
所以可以让一条重链躺在一层,而轻儿子都放到下一层,根节点放左上角
这样对于任意一点,想要通过构造的网格图去往根节点,至多会往上爬logn层
所以深度不会超过限制,而宽度显然充足
所以问题就解决了
轻儿子放在连续的区间,区间出现的顺序和爸爸出现的顺序相同,这能保证不发生冲突
进行树链剖分,重链剖分的性质保证深度不会超过限制
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int rd(){int z=; char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z;
}
struct edg{int y,nxt;}e[]; int lk[],ltp=;
void ist(int x,int y){
e[++ltp]=(edg){y,lk[x]}; lk[x]=ltp;
e[++ltp]=(edg){x,lk[y]}; lk[y]=ltp;
}
int n;
int fth[],hvc[],sz[];
int ax[],ay[];
int hd[];
void dfs1(int x,int y){
fth[x]=y; sz[x]=;
int mx=,mxid=;
for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y){
dfs1(e[i].y,x);
sz[x]+=sz[e[i].y];
if(sz[e[i].y]>mx) mx=sz[e[i].y],mxid=e[i].y;
}
hvc[x]=mxid;
}
void dfs(int x,int y){
ay[x]=y,ax[x]=++hd[y];
for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=fth[x] && e[i].y!=hvc[x])
dfs(e[i].y,y+);
if(hvc[x]) dfs(hvc[x],y);
}
int main(){
//freopen("ddd.in","r",stdin);
memset(lk,,sizeof(lk));
memset(hd,,sizeof(hd));
cin>>n;
int l,r;
for(int i=;i<n;++i){
l=rd(),r=rd();
ist(l,r);
}
dfs1(,);
dfs(,);
for(int i=;i<=n;++i) printf("%d %d\n",ax[i],ay[i]);
return ;
}
【墨西哥区域赛】Carpet的更多相关文章
- HDU5558 Alice's Classified Message(合肥区域赛 后缀数组)
当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下. i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i] ...
- 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)
这题是某年成都区域赛网络赛的一题. 这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星. 採用线上查询.利用map对字符串编号,由于非常方便.要推荐的朋友,事实上就是朋友的朋 ...
- 【2013南京区域赛】部分题解 hdu4802—4812
上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...
- hdu5080:几何+polya计数(鞍山区域赛K题)
/* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...
- 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...
- 【转】2014区域赛小结(牡丹江&&鞍山)by kuangbin
Posted on 2014年10月20日 by kuangbin 最后的两场区域赛结束了! ICPC生涯的最后两场区域赛,选择了前两个赛区——牡丹江和鞍山,主要是时间比较靠前,而且我向来对东北赛区有 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站汇总
球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
- 2015年ACM长春区域赛比赛感悟
距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的. ...
随机推荐
- javaweb期末项目-项目结构
相关链接: 项目结构:https://www.cnblogs.com/formyfish/p/10828672.html 需求分析:https://www.cnblogs.com/formyfish/ ...
- 安装keystone
在控制节点上执行 controllerHost='controller' MYSQL_PASSWD='m4r!adbOP' RABBIT_PASSWD='0penstackRMQ' ADMIN_PAS ...
- 安装多个版本的TensorFlow
TensorFlow 2.0测试版在今年春季发布,新版本比1.x版本在易用性上有了很大的提升.但是由于2.0发布还没有多久,现在大部分论文的实现代码都是1.x版本的,所以在学习TensorFlow的过 ...
- vue中使用raphael.js实现地图绘制
一.效果图 二.在vue中引入raphael.js npm i raphael -S 三.封装一个名为StreetMap的组件,代码如下 <template> <div> &l ...
- 什么是JWT(Json Web Token)
什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...
- SpringBoot配置文件可存放位置和加载顺序
使用IDEA创建一个spring初始化项目后.默认的配置文件在resources文件夹下. SpringBoot启动时,会扫描application.properties或application.ym ...
- Wordpress 所有 hook 钩子
muplugins_loaded 在必须使用的插件加载之后. registered_taxonomy 对于类别,post_tag 等 Registered_post_type 用于帖子,页面等 plu ...
- Oracle - WITH AS -用于查询当月与上月数据
注:在之前工作的时候,数据需要根据时间查询出当月值和上月的值. 语法: WITH A AS( SELECT * FROM TABLE ), B AS (SELECT * FROM TABLE)SELE ...
- 第十三章 字符串(一)之 String
这一节来学习String的特性和方法. 一.String对象的不变性 不变性:String对象是由一个final char[] value 数组实现的,因此String对象是不可变的.任何看起来改变S ...
- SpringBoot起飞系列-自定义starter(十)
一.前言 到现在,我们可以看出来,如果我们想用一些功能,基本上都是通过添加spring-boot-starter的方式来使用的,因为各种各样的功能都被封装成了starter,然后把相关服务注入到容器中 ...