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. 开发工具之Spark程序开发详解

    一  使用IDEA开发Spark程序 1.打开IDEA的官网地址,地址如下:http://www.jetbrains.com/idea/ 2.点击DOWNLOAD,按照自己的需求下载安装,我们用免费版 ...

  2. AssetBundleMaster

    AssetBundleMaster is an integrated solution for build AssetBundle and load assets from AssetBundles ...

  3. RPG游戏开发基础教程

    RPG游戏开发基础教程 第一步 下载RPG Maker 开发工具包 1.RPG Maker 是什么? RPG Maker 是由Enterbrain公司推出的RPG制作工具. 中文译名为RPG制作大师. ...

  4. python+Selenium 环境搭建

    一.下载相关软件 1.python http://python.org/getit/ 2.setuptools http://pypi.python.org/pypi/setuptools 3.pip ...

  5. LazyBug环境部署

    前言: LazyBug(授权协议:GPL)是一款PHP编写的开源HTTP接口测试管理系统,它集成了接口的测试.管理.维护.自动化回归等一系列工作,以实现对测试效率和管理效率的提高. 本次教程仅支持Wi ...

  6. android开发之使用SQLite数据库存储

    http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...

  7. Linux内核设计与实现 第一章 第二章

    第一章 Linux内核简介 Unix特点: (1)     Unix很简洁,仅仅提供几个几百个系统调用并且有一个非常明确的设计目的 (2)     在Unix中,所有的东西都被当作文件对待,通过一套相 ...

  8. spring-boot随笔

    配置了spring-boot-starter-web的依赖后,会自动添加tomcat和spring mvc的依赖,那么spring boot 会对tomcat和spring mvc进行自动配置 < ...

  9. Eat Style --proposed by Chongyang Bai

    NEED 1. 有人希望妈妈是这样的: 但实际上对妈妈做的菜反应确是这样的: 处在不同的时节,根据不同的个人偏好,到底该做些什么饭菜?工作繁忙,家里的厨师可能也没时间琢磨.最后做出的只是应付差事的饭菜 ...

  10. ns3的输入输出奥秘(一) LOGGING系统

    1.LOGGING系统 (1)在我们之前对C++的理解,输出好像就是cout,然而 以myfirst.cc为例子 在我们前面的编写的代码中并没有出现cout,那他是如何输出. 可以回忆一下 LogCo ...