[POI 2018] Plan Metra
[题目链接]
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的更多相关文章
- bzoj5100 [POI2018]Plan metra 构造
5100: [POI2018]Plan metra Time Limit: 40 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 189 Sol ...
- 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[ ...
- 【BZOJ5100】[POI2018]Plan metra 构造
[BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...
- BZOJ5100 : [POI2018]Plan metra
若$1$到$n$之间没有其它点,则$1$到$n$的距离为任意一点到它们距离的差值,按照距离关系判断每个点是挂在$1$上还是挂在$n$上即可. 否则$1$到$n$的距离只可能为任意一点到它们距离和的最小 ...
- 解题:POI 2018 Prawnicy
题面 网上好像都是堆的做法啊......我这个不算离散化是$O(n)$的说(虽然有一坨vector可能不开O2会爆炸) 题目即是让我们求是否存在一个最长的是不少于$k$个给出区间子集的区间,如果存在输 ...
- POI 2018.10.20
[POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...
- POI 2018.10.27
[POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进 ...
- POI 2018.10.22
[POI2015]ODW 喵锟讲过.分块. N>=blo,那就暴力倍增往上跳.O(N/blo*logN) N<blo,预处理,f[i][j]表示,i往上跳,每次跳j步,到根节点为止,权值和 ...
- POI 2018.10.21
[POI2008]TRO-Triangles https://www.cnblogs.com/GXZlegend/p/7509699.html 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积 ...
随机推荐
- iOS 富文本类库RTLabel
本文转载至 http://blog.csdn.net/duxinfeng2010/article/details/9004749 本节关于RTLable基本介绍,原文来自 https://git ...
- [转]React表单无法输入原因----约束性和非约束性组件
转自:http://blog.csdn.net/lihongxun945/article/details/46730835 表单是前端非常重要的一块内容,并且往往包含了错误校验等逻辑. React对表 ...
- Storm伪分布式搭建
配置zookeeper 下载zookeeper tar包 解压:tar -zxvf zookeeper-3.4.10.tar.gz -C /root/training/ 配置 cd /root/tra ...
- ionic新项目启动步骤
1.sudo npm install -g gulp 2.SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install ...
- 前端绘图方式Canvas和SVG的区别
Canvas和SVG是html5中支持2种可视化技术,都是可以在画布上绘制图形和放入图片.下面来介绍和分析一下他们. 一.Canvas 和 SVG 简介 1.什么是Canvas? Canvas 是H5 ...
- Get Docker CE for Ubuntu
Docker 分为开源免费的 CE(Community Edition)版本和收费的 EE(Enterprise Edition)版本. 配置 Docker 的 apt 源 1. 安装包,允许 apt ...
- 用Delphi模拟键盘输入
在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的操作,我们能否通过编制程序来代替手工输入, ...
- codevs1281 Xn数列
题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...
- Mysql的链接超时异常CommunicationsException
原文是在博客上的:小重合之旅 链接如下:未经过作者同意,这里注明下. http://blog.csdn.net/bluesnail216/article/details/15810119 1,问题现象 ...
- electron—Chromium有酒,Node有肉
谷歌V8引擎的出现,Node.js的诞生注定要把开发模式“搅乱”. 基于云应用,服务化,定制化的应用需求不断增加后使得传统的winform开发空间越来越小,而原来做前端的空间越来越大,Node.js ...