2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest C. Carpet (树链剖分+构造)

本文主要是介绍2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest C. Carpet (树链剖分+构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://codeforces.com/gym/101611/problem/C
题意:给定一棵 n n n个结点的树( n ≤ 100000 n\leq100000 n100000),将其放入 1000000 ∗ 20 1000000*20 100000020的方格中,使其任意两条边互不相交,求各个点的位置坐标。

看了题解才想到轻重链剖分。因为该方格的特点是x轴很长,y轴比较短,所以将其最长链往右放,剩下的往上放,也就是重儿子往右放,轻儿子往上放。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN=100010;
int k=1,x,y,head[MAXN],siz[MAXN],son[MAXN],fa[MAXN],X[MAXN],Y[MAXN];
struct Edge{int from,to,next;
}e[2*MAXN];
void addedge(int u,int v)
{e[k].from=u;e[k].to=v;e[k].next=head[u];head[u]=k++;
}void dfs1(int s)
{siz[s]=1;son[s]=0;for(int i=head[s];i;i=e[i].next){if(e[i].to!=fa[s]){fa[e[i].to]=s;dfs1(e[i].to);siz[s]+=siz[e[i].to];if(siz[e[i].to]>siz[son[s]])son[s]=e[i].to;}}
}void dfs2(int s)
{X[s]=x;Y[s]=y;//printf("!%d %d %d\n",s,x,y);if(son[s]==0)return ;y++;for(int i=head[s];i;i=e[i].next){if(e[i].to!=son[s]&&e[i].to!=fa[s]){dfs2(e[i].to);x++;}}y--;x++;dfs2(son[s]);
}int main()
{int n;scanf("%d",&n);for(int i=1;i<=n-1;i++){scanf("%d%d",&x,&y);addedge(x,y);addedge(y,x);}dfs1(1);x=1;y=1;dfs2(1);for(int i=1;i<=n;i++)printf("%d %d\n",X[i],Y[i]);return 0;
}

这篇关于2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest C. Carpet (树链剖分+构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378849

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C++方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构

Java构造和解析Json数据的两种方法(json-lib构造和解析Json数据, org.json构造和解析Json数据)

在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别。下面首先介绍用json-lib构造和解析Json数据的方法示例。 一、介绍       JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json