题目描述

有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度。
已知2到n-1每个点在树上与1和n的距离,请根据这些信息还原出这棵树。

输入

第一行包含一个正整数n(2<=n<=500000),表示点数。
第二行包含n-2个正整数d(1,2),d(1,3),...,d(1,n-1),分别表示每个点到1的距离。
第三行包含n-2个正整数d(n,2),d(n,3),...,d(n,n-1),分别表示每个点到n的距离。
输入数据保证1<=d<=1000000。

输出

若无解,输出NIE。
否则第一行输出TAK,接下来n-1行每行三个正整数u,v,c(1<=u,v<=n,1<=c<=1000000)
表示存在一条长度为c的连接u和v两点的树边。
若有多组解,输出任意一组。

样例输入

7
6 6 2 2 1
5 3 5 1 4

样例输出

TAK
1 5 2
5 7 1
5 2 4
7 3 3
1 4 2
1 6 1


题解

构造

考虑两种情况:

(1) $1$ 号点与 $n$ 号点直接相连

此时需要满足:对于所有的 $i$ ,$|d(1,i)-d(n,i)|$ 均相等。

满足此条件时容易构造出解: $1$ 号点与 $n$ 号点的边长度为 $|d(1,i)-d(n,i)|$ ;对于第 $i$ 个点,如果 $d(1,i)<d(n,i)$ 则与 $1$ 相连,长度为 $d(1,i)$ ;否则与 $n$ 相连,长度为 $d(n,i)$ 。

(2) $1$ 号点与 $n$ 号点不直接相连

此时 $1$ 号点与 $n$ 号点的距离为 $min\{dis(1,i)+dis(n,i)\}$ 。

设这个距离为 $d$ ,那么对于所有的 $dis(1,i)+dis(n,i)=d$ 的点 $i$(包括 $1$ 号点和 $n$ 号点),将其按照 $dis(1,i)$ 从小到大排序,则它们形成了一条从 $1$ 到 $n$ 的链。此时需要满足:这条链上的任意两个点的位置(即 $dis(1,i)$ )均不同。

然后考虑其它点:对于点 $x$ ,它到 $1$ 号点的方式一定是:先到达链上的某个点,然后再沿着链到 $1$ 。到 $n$ 同理。于是可以算出其到链上某个点的距离 $\frac {dis(1,x)+dis(n,x)-d}2$ ,进而得到 $1$ 到这个链上点的距离。此时需要满足: $dis(1,x)+dis(n,x)-d$ 为偶数,且 $|dis(1,x)-dis(n,x)|\le d$ ,且存在某个链上的点与 $1$ 的距离为 $dis(1,x)-\frac {dis(1,x)+dis(n,x)-d}2$ 。

满足这些条件时容易构造出解: $1$ 号点与 $n$ 号点的链之间的相邻两点 $a$ 和 $b$($a$ 比 $b$ 更靠近 $1$)连边,长度为 $dis(1,b)-dis(1,a)$ ,其余点向着链上对应的点连边,长度为 $\frac{dis(1,x)+dis(n,x)-d}2$ 。

查找对应点时可以使用二分查找解决。

这两种情况均不满足时无解。

时间复杂度 $O(n\log n)$

#include <cstdio>
#include <cctype>
#include <algorithm>
#define N 500010
using namespace std;
struct data
{int d , p;data() {}data(int D , int P) {d = D , p = P;}bool operator<(const data &a)const {return d < a.d;}
}v[N];
int a[N] , b[N] , l[N] , tot , x[N] , y[N] , z[N] , cnt;
int main()
{int n , i , t , len = 1 << 30 , val;scanf("%d" , &n);if(n == 2){puts("TAK\n1 2 1");return 0;}for(i = 2 ; i < n ; i ++ ) scanf("%d" , &a[i]);for(i = 2 ; i < n ; i ++ ) scanf("%d" , &b[i]) , l[i] = a[i] + b[i] , len = min(len , l[i]);if(a[2] != b[2]){val = max(a[2] - b[2] , b[2] - a[2]);for(i = 3 ; i < n ; i ++ )if(a[i] - b[i] != val && b[i] - a[i] != val)break;if(i == n){printf("TAK\n1 %d %d\n" , n , val);for(i = 2 ; i < n ; i ++ ){if(a[i] < b[i]) printf("1 %d %d\n" , i , a[i]);else printf("%d %d %d\n" , n , i , b[i]);}return 0;}}v[++tot] = data(0 , 1);for(i = 2 ; i < n ; i ++ )if(l[i] == len)v[++tot] = data(a[i] , i);v[++tot] = data(len , n);sort(v + 1 , v + tot + 1);for(i = 1 ; i < tot ; i ++ ){if(v[i].d == v[i + 1].d){puts("NIE");return 0;}x[++cnt] = v[i].p , y[cnt] = v[i + 1].p , z[cnt] = v[i + 1].d - v[i].d;}for(i = 2 ; i < n ; i ++ ){if(l[i] != len){if((l[i] - len) & 1 || (t = lower_bound(v + 1 , v + tot + 1 , data(a[i] - ((l[i] - len) >> 1) , 0)) - v) > tot || v[t].d != a[i] - ((l[i] - len) >> 1)){puts("NIE");return 0;}x[++cnt] = v[t].p , y[cnt] = i , z[cnt] = (l[i] - len) >> 1;}}puts("TAK");for(i = 1 ; i <= cnt ; i ++ ) printf("%d %d %d\n" , x[i] , y[i] , z[i]);return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/8011391.html

【bzoj5100】[POI2018]Plan metra 构造相关推荐

  1. Plan Stitch:一种使用缝合物理计划解决查询计划性能退化问题的方法

    Part 1 论文背景 查询优化器选择了一个糟糕的执行计划而导致查询性能下降,是工作负载中的一个常见痛点.查询计划可能会因为各种原因而改变,比如创建删除索引.统计信息时,使用与上次不同的参数绑定重新编 ...

  2. Graph Plan

    Graph Plan 一.结构 二.Mutex Condition 三.示例 一.结构 action-level i:在某个时间i可能执行的操作 state-level i:字面量在某个时间i为真 e ...

  3. 【Dex-Net 2.0】论文精度:Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp

    Dex-Net 2.0: Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp Metr ...

  4. LeetCode简单题之构造矩形

    题目 作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的. 所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面.要求: 你设计的矩形 ...

  5. 兑换量子计算机,阅读 | 【量子计算机】构造置换量子门

    原标题:阅读 | [量子计算机]构造置换量子门 量子计算机的一个基本组成单位叫量子门(quantum gate),下面简单介绍些基本概念. 量子比特和量子态 量子计算机的信息存储单元是一种叫做量子比特 ...

  6. [ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据...

    主类 HTTPSendPHP.as 1 package 2 { 3 import com.JPEGEncoder.JPGEncoder; 4 import com.fylib.httpRequest. ...

  7. js把base64串解析成中文_回文问题终极篇:最小代价构造回文串

    学算法认准 labuladong 东哥带你手把手撕力扣? 点击下方卡片即可搜索? 读完本文,你可以去力扣完成第 1312 题「让字符串成为回文串的最少插入次数」,难度 Hard. 回文串就是正着读反着 ...

  8. php构造和析构方法,php5构造函数与析构函数实例

    自php5起,有了构造函数与析构函数. 这使得php更富有面向对象的魅力了. 在php4时,构造函数用的是与类同名的函数来进行构造这个动作. 例如: 复制代码 代码示例: /* * myclass.p ...

  9. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

最新文章

  1. 如何看待机器视觉的“对抗样本”问题,其原理是什么?
  2. [一个小问题]Mainfest配置文件的version问题小结
  3. setup.py安装
  4. 2019年,智慧零售是如何影响零售行业?
  5. 52 介绍几个重要的类
  6. JavaScript单行代码
  7. ios开发之 icon规范+启动图规范+启动页规范
  8. matlab基本运算与函数
  9. Java 开发环境部署
  10. SQLServer 数据库主体在该数据库中拥有 架构,无法删除解决方法
  11. 【华为云技术分享】【DevCloud•敏捷智库】读懂敏捷需求管理的4个关键词
  12. elasticearch 安装
  13. java ftp取远程服务器时间_在 Java 中如何获取 FTP 服务器上的文件修改时间
  14. javascript:js+css实现加载特效
  15. 12.2.PHP7.1 狐教程-偶遇 -【PHP 入口】
  16. 多进程——守护进程例子
  17. 使用 matlab 深度学习工具训练模型
  18. 【181008】VC++九宫格拼图游戏源代码
  19. Ultimaker Cura集成了HP 3D扫描软件
  20. iscsi_server_client_chap_username_password_targetcli

热门文章

  1. 可通过http获取远端服务信息_微服务基础——厉害了!API网关
  2. 把一个dataset的表放在另一个dataset里面_视频自监督一. STCR: 一个基于数据增强的简单有效正则项 (降低静态信息的影响)...
  3. 如何拯救收录直线下滑的网站?
  4. 统计分析与spss的应用第五版数据_#统计分析与SPSS应用# 4.1.3 SPSS频数分析的扩展功能...
  5. 打开浏览器不是主页_网络没问题但是浏览器打开主页却显示网络连接错误
  6. html调用js进行MD5加密,js实现md5加密
  7. c 嵌入html5 win7,Html5新标签解释及用法
  8. 开发日记-20190915 关键词 汇编语言王爽版 第十章
  9. 开发日记-20190610 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  10. 查看spark是否有僵尸进程,有的话,先杀掉。可以使用下面命令