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. 《无所不能的JavaScript编程系列:setTimeout 简笔》

    前言:问题引出 JavaScript中会经常用到setTimeout来推迟一个函数的执行,如: setTimeout(function(){alert("Hello World") ...

  2. Linux下安装maven(mvn命令)

    Maven(mvn)是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具(百度百科) 简单理解为一个打包 ...

  3. unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)

    一.使用向量原理转换到目标方向 为了让角色的自身y转向目标方向,并且以最小角度旋转,要点是获得当前方向与目标方向的叉值,从而判断应该旋转的方向 float rotateSpeed; //相对目标位置运 ...

  4. 关于UGUI不拦截射线的方法

    起因:开发游戏,要在设置界面里给一个设置项添加一个东西解释这个项是干啥的,要求鼠标移到文字上的时候显示一个弹窗差不多的东西,见动图,鼠标移开会消失.但是当我移动鼠标到弹窗上的时候,UGUI会发射一根射 ...

  5. UI Recorder 功能详解

    前言: UI Recorder安装教程见:UI Recorder 安装教程(一).UI Recorder 安装教程(二) 本次着重介绍UI Recorder录制过程中的功能按钮:添加悬停,添加断言,使 ...

  6. mysql左外连接

    左外连接的概念性不说了,这次就说一说两个表之间的查询步骤是怎么样的? 例如 SELECT ut.id,ut.name,ut.age, ut.sex,ut.status,st.score,st.subj ...

  7. VS2013的安装与测试

    第一步:下载完成之后点击安装,在安装过程中会出现很多选择,选择社区版(c++),安装完成: 第二步:安装完成之后打开VS2013,如图所示:   第三步:按以下步骤进行 第四步:点击[OK]之后 第五 ...

  8. RAC系统化学习

    1.RACSignal:   // 只要订阅者调用sendNext,就会执行nextBlock // 只要订阅RACDynamicSignal,就会执行didSubscribe // 前提条件是RAC ...

  9. Photoshop的混合模式

    1.亮度是一种颜色的相对亮度,饱和度是指一种颜色的纯度(颜色中包含多少灰) 2.混合模式 下层图片的颜色像素称为"基本颜色":选定的称为"混合"颜色,对于大部分 ...

  10. PHP 爬虫——QueryList

    前言: 来了个任务说要做个电影网站,要写个壳,数据直接从别人那扒.行吧!那就要学习下PHP爬虫了.占个博客,以后补充.http://study.querylist.cc/archives/6/ 之前开 ...