【墨西哥区域赛】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天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的. ...
随机推荐
- 教你如何在Ubuntu上安装最新的Python版本
参考链接:https://cloud.tencent.com/developer/news/343104
- Linux命令---ln、readlink
ln 无参数--------创建硬链接 -s -------------创建软链接 用法:ln [option] 源文件 目标文件 ln test.txt test_hard.txt 只有在同 ...
- kafka原理和操作
参考: 原理: https://www.cnblogs.com/yinzhengjie/p/9780976.html 常用配置参数: https://www.cnblogs.com/yinzhengj ...
- [转帖]关于Java中SQL语句的拼接规则
关于Java中SQL语句的拼接规则 自学demo 的时候遇到的问题 结果应该是 '"+e.getName()+"' 注意 一共有三组标点符号 (除去 方法函数后面的括号) 实现目标 ...
- 洛谷P1603 斯诺登的密码(水题
不知道什么时候打开的,随手做掉了,没什么用...大概又熟悉了一下map吧...大概........一开始还因为没读清题没把非正规的英文表示数字存进去wa了...orz最近状态不行 题目描述 题目描述 ...
- STL priority_queue 常见用法详解
<算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...
- 关于centOS安装配置mysql5.6那点事
第一步 下载安装 一.主要因为现在mysql官网yum直接推送mysql8,mysql5.1,然而mysql8不稳定,mysql5.1版本又太低,要想用旧版本5.6就先下载相应的依赖包,安装好依赖包, ...
- vimdiff、rev命令
一.vimdiff:可视化比较工具 语法: vimdiff [选项] file1 file2 [file3 [file4]] gvimdiff 描述 Vimdiff在两个(或三 ...
- 流程控制之 for 循环
目录 流程控制之for循环 for 循环条件语句 for 循环的嵌套 流程控制之for循环 for 循环条件语句 for i in range(3): print(i) # 0 # 1 # 2 for ...
- MyBatis 体系结构、根配置文件、Mapper映射文件
一.MyBatis的体系结构 1.SqlSessionFactory对象 SqlSessionFactory对象是MyBatis的管理核心,它是单个数据库映射关系经过编译后的内存镜像,是创建SqlSe ...