【BZOJ5100】[POI2018]Plan metra

Description

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

Input

第一行包含一个正整数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。

Output

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

Sample Input

7
6 6 2 2 1
5 3 5 1 4

Sample Output

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

题解:如果我们已经确定了点1到点n的距离,那么我们就可以将1到n这条路拿出来,然后其他点都想挂链一样挂到这条路径上即可。即:

如果1到n的长度是m,我们将所有d1-dn相同的点放到一起,那么对于每组d1-dn相同的点,要么|d1-dn|=m,要么d1+dn的最小值=m。所以用数组记录一下即可。

输出方案的时候将所有d1+dn=m的点排个序即可。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=500010;
const int M=1000010;
int n,m,tot,cnt;
int d1[N],d2[N],s1[M<<1],s2[M<<1],p[M],mn[M<<1],pa[N],pb[N],pc[N];
inline char nc()
{static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd()
{int ret=0,f=1;   char gc=nc();while(!isdigit(gc))   {if(gc=='-')    f=-f;  gc=nc();}while(isdigit(gc))    ret=ret*10+(gc^'0'),gc=nc();return ret*f;
}
inline int abs(int x) {return x>0?x:-x;}
inline bool check(int x)
{if(((x>=M||x<=-M)?0:(s1[M+x]+s1[M-x]))+s2[x]==n-2){m=x;return 1;}return 0;
}
inline void add(int a,int b,int c)
{pa[++cnt]=a,pb[cnt]=b,pc[cnt]=c;
}
int main()
{n=rd();if(n==2){printf("TAK\n1 2 1");return 0;}register int i,last;for(i=2;i<n;i++) d1[i]=rd();for(i=2;i<n;i++){d2[i]=rd();int &t=mn[d2[i]-d1[i]+M];if(!t||d1[t]+d2[t]>d1[i]+d2[i])  t=i;s1[d2[i]-d1[i]+M]++;}for(i=2;i<n;i++) if(i==mn[d2[i]-d1[i]+M]) s2[d1[i]+d2[i]]+=s1[d2[i]-d1[i]+M];for(i=2;i<n;i++)   if(check(abs(d2[i]-d1[i]))||check(d1[i]+d2[i]))    break;if(!m){puts("NIE");return 0;}for(i=2;i<n;i++){if(d2[i]-d1[i]==m)    add(i,1,d1[i]);else if(d1[i]-d2[i]==m)    add(i,n,d2[i]);else if(i==mn[d2[i]-d1[i]+M]) p[d1[i]]=i;else{int t=mn[d2[i]-d1[i]+M];add(i,t,(d1[i]+d2[i]-d1[t]-d2[t])>>1);}}p[m]=n,d1[n]=m;for(last=i=1;i<=m;i++)   if(p[i])    add(last,p[i],d1[p[i]]-d1[last]),last=p[i];for(i=1;i<n;i++)  if(pc[i]<=0){puts("NIE");return 0;}puts("TAK");for(i=1;i<n;i++)   printf("%d %d %d\n",pa[i],pb[i],pc[i]);return 0;
}//6 2 5 4 8 4 1 6 4

转载于:https://www.cnblogs.com/CQzhangyu/p/7954085.html

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

  1. 【bzoj5100】[POI2018]Plan metra 构造

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

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

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

  3. Graph Plan

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

  4. 【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 ...

  5. LeetCode简单题之构造矩形

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 半年时间学linux,你学Linux入门用了多长时间?
  2. 五大场景深解无服务器架构如何实践?
  3. 利用memcached做缓存服务器,为后端tomcat服务器做会话保持,利用httpd的jk模块模块做负载均衡...
  4. mysql创建一个表用来快速查询表_mysql数据库的创建表格、查询(多表查询)
  5. 任务太多?学着突破重围
  6. python获取eth0_详解 Python 获取网卡 IP 地址的黑魔法
  7. LocalDate,LocalDate,LocateDateTime的常用方法
  8. 《基于机器视觉的高压输电线路覆冰厚度检测》论文笔记
  9. Ajax中readyState和status
  10. Linux: vi 编辑器
  11. powerbuilder的dw中使用graph风格,当横轴是日期时,如何显示才能完整显示日期?
  12. python学习笔记(九)异常处理
  13. 密码应用安全性评估实施要点之二密码技术应用要求与实现要点(4)
  14. 用ARIMA模型做需求预测
  15. 511遇见易语言API模块进程创建CreateProcess
  16. Unity3D之SQLite的使用
  17. 机器学习 | 决策树原理剪枝连续值缺失值处理
  18. CAD中如何更改标注尺寸保留小数点后几位或单位
  19. 间接采购品类多,机械制造企业如何破局制胜优化间采管理?
  20. 高性能至强融核服务器,内存达1.5TB!英特尔展示至强融核主板

热门文章

  1. spark 部署方式
  2. 营山天气预报软件测试,营山天气预报15天
  3. Hyperledger Fabric教程(3)-- byfn.sh分析-生成通道所需交易和文件
  4. kubernetes视频教程笔记 (31)-安全-鉴权Authorization
  5. 无缝衔接的人会遭报应吗_王栎鑫回应新恋情,如何判断你的伴侣会不会无缝衔接...
  6. Java中递归复制多级文件夹(IO流)
  7. 基于SSM的理财系统
  8. 设计模式之GOF23备忘录模式
  9. C语言冒泡排序三种写法,冒泡排序的三种实现方法
  10. php 有request,php实现httpRequest的方法