http://www.lydsy.com/JudgeOnline/problem.php?id=5100

1、找到d1[i]+dn[i] 最小的点,作为1到n链上的点

2、令链长为D,若abs(d1[i]-dn[i])==D,则 i 与1或n 连边

3、对于链上除去1和n的点k,若 dn[i]-d1[i]==dn[k]-d1[k],则i与k连边

若1到n的链上没有点,即1与n直接相连,那么所有的d1[i]-dn[i] 相等 且 不为 0

特判n=2,输出1 2 任意长度[1,1e6]

无解的情况:

1、找出的链上的点,存在两个点i,j,d1[i]==d1[j]

2、对于某个点i,找不到对应的点k

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 500001
#define M 1000001 int dis1[N],disn[N];
int cnt[M<<]; int chain[N]; bool vis[N]; struct node1
{
int id,d,bl;
}e[N];
struct node2
{
int id,d;
}g[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool cmp(int p,int q)
{
return dis1[p]<dis1[q];
} bool cmp2(node1 p,node1 q)
{
return p.d<q.d;
} bool cmp3(node2 p,node2 q)
{
return p.d<q.d;
} int main()
{
//freopen("test.in","r",stdin);
//freopen("my.out","w",stdout);
int n;
read(n);
if(n==)
{
printf("TAK\n1 2 1");
return ;
}
for(int i=;i<n;++i) read(dis1[i]);
for(int i=;i<n;++i) read(disn[i]);
int sta=abs(dis1[]-disn[]);
bool tag=true;
for(int i=;i<n && tag;++i)
if(abs(dis1[i]-disn[i])!=sta) tag=false;
if(tag && sta)
{
puts("TAK");
printf("1 %d %d\n",n,sta);
for(int i=;i<n;++i)
if(dis1[i]>disn[i]) printf("%d %d %d\n",n,i,dis1[i]-sta);
else printf("1 %d %d\n",i,disn[i]-sta);
return ;
}
int mid=;
dis1[]=1e7;
for(int i=;i<n;++i)
if(dis1[i]+disn[i]<dis1[mid]+disn[mid]) mid=i;
int D=dis1[mid]+disn[mid];
int m=;
for(int i=;i<n;++i)
if(dis1[i]+disn[i]==D) chain[++m]=i,vis[i]=true;
sort(chain+,chain+m+,cmp);
for(int i=;i<m;++i)
if(dis1[chain[i]]==dis1[chain[i+]])
{
printf("NIE");
return ;
}
for(int i=;i<=m;++i)
{
g[i].id=chain[i];
g[i].d=disn[chain[i]]-dis1[chain[i]];
}
sort(g+,g+m+,cmp3);
int tot=;
for(int i=;i<n;++i)
if(!vis[i])
{
e[++tot].id=i;
e[tot].d=disn[i]-dis1[i];
}
sort(e+,e+tot+,cmp2);
int now=;
for(int i=;i<=tot;++i)
{
if(abs(dis1[e[i].id]-disn[e[i].id])==D) continue;
if(now>m)
{
puts("NIE");
return ;
}
if(e[i].d<g[now].d)
{
puts("NIE");
return ;
}
else if(e[i].d==g[now].d) e[i].bl=g[now].id;
else
{
while(now<=m && e[i].d>g[now].d) now++;
i--;
}
}
// return 0;
puts("TAK");
printf("1 %d %d\n",chain[],dis1[chain[]]);
for(int i=;i<=m;++i) printf("%d %d %d\n",chain[i-],chain[i],dis1[chain[i]]-dis1[chain[i-]]);
printf("%d %d %d\n",chain[m],n,disn[chain[m]]);
for(int i=;i<n;++i)
if(dis1[i]-disn[i]==D)
{
vis[i]=true;
printf("%d %d %d\n",n,i,disn[i]);
}
else if(disn[i]-dis1[i]==D)
{
vis[i]=true;
printf("1 %d %d\n",i,dis1[i]);
}
for(int i=;i<=tot;++i)
if(!vis[e[i].id]) printf("%d %d %d\n",e[i].bl,e[i].id,dis1[e[i].id]-dis1[e[i].bl]);
return ;
}

5100: [POI2018]Plan metra

Time Limit: 40 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 277  Solved: 69
[Submit][Status][Discuss]

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

bzoj千题计划249:bzoj5100: [POI2018]Plan metra的更多相关文章

  1. bzoj5100 [POI2018]Plan metra 构造

    5100: [POI2018]Plan metra Time Limit: 40 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 189  Sol ...

  2. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  5. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  6. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  7. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  8. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  9. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

随机推荐

  1. 使用VSCode调试单个PHP文件

    突然发现是可以使用 VSCode 调试单个 PHP 文件的,今天之前一直没有弄成功,还以为 VSCode 是不能调试单文件呢.这里记录一下今天这个"突然发现"的过程. 开始,是在看 ...

  2. C#易忘点

    下面是自己总结的一些C#语言方面用的少容易忘的地方,总结一下,在用的时候看一下.(仅针对本人) 参数数组 定义一个函数,用来取得数字的和,但是数字的个数不确定. 解决方案: 1,定义一个函数,参数传递 ...

  3. Unity插件-NGUI学习笔记

    Anchors 的作用 类似Android里面的.9格式图片的功能, 边框可以随着文字变大而变大. 实现方法: 用NGUI 创建一个Sprite, 命名为TextBg, 一个Label, Label的 ...

  4. 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg

    一.Iconfont 1. 概述 在前端作业中,二十年前只有页面中铺满文字就算上线产品,现如今,不加点俏皮的“图标”会让页面显得很 Low 很 Low.   图标 在写这篇文章之前,我一直以为上图中的 ...

  5. PAT-1045. Favorite Color Stripe (30)-LIS

    将Eva喜欢的颜色按顺序编个优先级, 2 3 1 5 6-> 1 2 3 4 5 然后读取stripe,将Eva不喜欢的先剔除掉,剩下的颜色替换为相应的优先级 2 2 4(去掉) 1 5 5 6 ...

  6. js闭包的作用

    js闭包的用途详解 js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文   我们来看 ...

  7. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

  8. 更新pip10后 ImportError: cannot import name ‘main'

    百度了几个回答都没有解决问题,有些回答明显是直接复制过来的一点价值都没有,然后google一下立马解决.很多时候不能怪搜索引擎,问题出在一些国内网友对知识的不负责任 解决:找到报错文件,也就是那个pi ...

  9. PHP + webuploader 视频上传

    上传方式,PHP默认方式 和 FTP 上传 1.修改PHP  配置: php.ini 修改以下配置项为适合的数据 php中 php.ini 文件修改 file_uploads = On //允许文件上 ...

  10. Docker(十七)-修改Docker容器启动配置参数

    有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...