[题目链接]

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

[算法]

首先分两类考虑 :

1. 1 -> N的路径不经过其它节点 , 我们只需判断(d1i - d2i)的绝对值是否全部相等

2. 1 -> N的路径经过了其它节点 , 那么显然 , 1 -> N这条链的长度为min{ d1i + d2i } , 所有d1i + d2i等于链长的节点都在链上 , 将其余节点的d1i和d2i作差 , 即可O(1)判断出这个节点是挂在链上的哪个节点的

时间复杂度 : O(N)

[代码]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int N = 1e6 + ;
const int inf = 2e9;
const int V = 1e7 + ; struct edge {
int to , w , nxt;
} e[N << ]; int n , m , tot;
int head[N] , d1[N] , d2[N] , mp[V]; template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void read(T &x) {
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int u , int v , int w)
{
++tot;
e[tot] = (edge){v , w , head[u]};
head[u] = tot;
}
inline void add(int x , int y , int w) {
addedge(x , y , w);
addedge(y , x , w);
}
inline void dfs(int u , int par) {
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to , w = e[i].w;
if (v != par) {
printf("%d %d %d\n" , u , v , w);
dfs(v , u);
}
}
}
inline bool check()
{
int val = abs(d1[] - d2[]);
if (val == ) return false;
for (int i = ; i < n; ++i)
if (abs(d1[i] - d2[i]) != val) return false;
printf("TAK\n");
printf("%d %d %d\n" , , n , val);
for (int i = ; i < n; ++i)
if (d1[i] >= d2[i]) printf("%d %d %d\n" , n , i , d2[i]);
else printf("%d %d %d\n" , , i , d1[i]);
return true;
}
int main() { read(n);
if (n == )
{
printf("TAK\n");
printf("%d %d %d\n" , , , );
return ;
}
for (int i = ; i < n; ++i) read(d1[i]);
for (int i = ; i < n; ++i) read(d2[i]);
if (check())
return ;
int line = inf;
for (int i = ; i < n; ++i) chkmin(line , d1[i] + d2[i]);
mp[] = ;
mp[line] = n;
for (int i = ; i < n; ++i) {
if (d1[i] + d2[i] == line) {
if (mp[d1[i]] != ) {
printf("NIE\n");
return ;
}
mp[d1[i]] = i;
}
}
int pre = ;
for (int i = ; i <= line; ++i) {
if (mp[i]) {
add(mp[pre] , mp[i] , i - pre);
pre = i;
}
}
for (int i = ; i < n; ++i) {
if (d1[i] + d2[i] - line != ) {
int tmp = d1[i] + d2[i] - line;
if (tmp & ) {
printf("NIE\n");
return ;
}
int len = d1[i] - tmp / ;
if (len < || mp[len] == ) {
printf("NIE\n");
return ;
}
add(i , mp[len] , tmp / );
}
}
puts("TAK");
dfs( , ); return ;
}

[POI 2018] 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千题计划249:bzoj5100: [POI2018]Plan metra

    http://www.lydsy.com/JudgeOnline/problem.php?id=5100 1.找到d1[i]+dn[i] 最小的点,作为1到n链上的点 2.令链长为D,若abs(d1[ ...

  3. 【BZOJ5100】[POI2018]Plan metra 构造

    [BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...

  4. BZOJ5100 : [POI2018]Plan metra

    若$1$到$n$之间没有其它点,则$1$到$n$的距离为任意一点到它们距离的差值,按照距离关系判断每个点是挂在$1$上还是挂在$n$上即可. 否则$1$到$n$的距离只可能为任意一点到它们距离和的最小 ...

  5. 解题:POI 2018 Prawnicy

    题面 网上好像都是堆的做法啊......我这个不算离散化是$O(n)$的说(虽然有一坨vector可能不开O2会爆炸) 题目即是让我们求是否存在一个最长的是不少于$k$个给出区间子集的区间,如果存在输 ...

  6. POI 2018.10.20

    [POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...

  7. POI 2018.10.27

    [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进 ...

  8. POI 2018.10.22

    [POI2015]ODW 喵锟讲过.分块. N>=blo,那就暴力倍增往上跳.O(N/blo*logN) N<blo,预处理,f[i][j]表示,i往上跳,每次跳j步,到根节点为止,权值和 ...

  9. POI 2018.10.21

    [POI2008]TRO-Triangles https://www.cnblogs.com/GXZlegend/p/7509699.html 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积 ...

随机推荐

  1. 九度OJ刷题报告

    从8月初到现在,已经刷了400道题,越到后面题目越难,但仍会继续努力. 现将自己所AC的代码贴到博客上整理,同时供大家交流参考. 所有代码均为本人独立完成,全部采用C语言进行编写.

  2. Python学习笔记_Python基础

    Python 基础 语句和语法 凝视 继续 代码组 代码的缩进 在一行书写多个语句 模块 变量赋值 赋值操作符 增量赋值 多重赋值 多元赋值 python编写的基本风格 模块的结构和布局 内存管理 变 ...

  3. IM系统中如何保证消息的可靠投递(即QoS机制)(转)

    消息的可靠性,即消息的不丢失和不重复,是im系统中的一个难点.当初qq在技术上(当时叫oicq)因为以下两点原因才打败了icq:1)qq的消息投递可靠(消息不丢失,不重复)2)qq的垃圾消息少(它an ...

  4. js之Date(日期对象)

    通过日期对象我们可以进行一些对日期时间的操作处理 一.日期对象的创建: var myDate=new Date() 二.Date对象方法: Link:http://www.w3school.com.c ...

  5. WPF之基础概念

    一:App环境承载 我们都知道Console和WinForm程序的入口都是Main函数,WPF同样也不例外,好了,我们就新建一个WPF应用程序,VS会给我们自动生成一个MainWindow.xaml和 ...

  6. PE.微PE

    1.老毛桃,大白菜(20180227) ZC:我记得以前 "老毛桃"."大白菜" 之前的版本,在安装好系统之后,是没有捆绑软件的,.现在,老毛桃 安装完系统之后 ...

  7. linux shell编程(二) 条件测试

    bash中常用的条件测试有三种 条件测试的表达式:[ expression ]  [[ expression]] 第一种:整数测试: -eq 测试两个整数是否相等,比如[ $A -eq $B ] -n ...

  8. Codeforces 876C Classroom Watch:枚举

    题目链接:http://codeforces.com/contest/876/problem/C 题意: 定义函数:f(x) = x + 十进制下x各位上的数字之和 给你f(x)的值(f(x) < ...

  9. mvc购物车项目

    第一个mvc项目--购物车. 1.购物车需求 a.用户可以登录 b.用户可以购买商品 c.用户可以对购物车的商品进行修改和删除 d.用户可以下订单 e.系统可以发送电子邮件给用户 uml图 2.界面设 ...

  10. JQUERY获取html标签自定义属性值或data值

    //获取属性值 1 <div id="text" value="黑哒哒的盟友"><div> jQuery取值: $("#tex ...