[POI2018]Plan metra
题目大意:
一棵$n(n\le5\times10^5)$个结点的树,每条边的边权均为正整数,告诉你$2\sim n-1$号结点到$1$号点和$n$号点的距离$d1[i]$和$d2[i]$。求是否存在这样的树,若存在,则构造出这样一棵树。
思路:
若对于所有的$1<i<n$,$|d1[i]-d2[i]|$都相等,则$1$与$n$直接相连,其余点与$1$和$n$中最近的点相连。
否则若存在这样的树,肯定能构造出一种方案,使得$d1[n]=\min\{d1[i]+d2[i]\}$。令$d=\min\{d1[i]+d2[i]\}$,若点$i$满足$d1[i]+d2[i]=d$,则$i$一定在$1$到$n$的链上。通过排序可以求出$1$到$n$的链,如果发现有两点在同一位置,则构造失败。对于剩下的点$i$,向满足$d1[j]=d-\frac{d1[i]-d2[i]+d}2$的点$j$连一条长度为$d1[i]-d1[j]$的边即可,如果不存在这样的点$j$,则构造失败,若新建边长度不为正整数则还是构造失败。
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<sys/mman.h>
#include<sys/stat.h>
class MMapInput {
private:
char *buf,*p;
int size;
public:
MMapInput() {
register int fd=fileno(stdin);
struct stat sb;
fstat(fd,&sb);
size=sb.st_size;
buf=reinterpret_cast<char*>(mmap(,size,PROT_READ,MAP_PRIVATE,fileno(stdin),));
p=buf;
}
char getchar() {
return (p==buf+size||*p==EOF)?EOF:*p++;
}
};
MMapInput mmi;
inline int getint() {
register char ch;
while(!isdigit(ch=mmi.getchar()));
register int x=ch^'';
while(isdigit(ch=mmi.getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=5e5+,C=1e6;
int d1[N],d2[N],cnt,tmp[N],mem[C<<],*vis=mem+C;
struct Edge {
int u,v,w;
};
Edge e[N];
inline bool cmp(const int &a,const int &b) {
return d1[a]<d1[b];
}
int main() {
const int n=getint();
if(n==) {
puts("TAK\n1 2 1");
return ;
}
for(register int i=;i<n;i++) d1[i]=getint();
for(register int i=;i<n;i++) d2[i]=getint();
if(d1[]!=d2[]) {
for(register int i=;i<n;i++) {
if(std::abs(d1[i]-d2[i])!=std::abs(d1[]-d2[])) goto case2;
}
e[cnt++]=(Edge){,n,std::abs(d1[]-d2[])};
for(register int i=;i<n;i++) {
e[cnt++]=(Edge){i,d1[i]>d2[i]?n:,std::min(d1[i],d2[i])};
}
} else case2: {
int d=C*;
for(register int i=;i<n;i++) {
d=std::min(d,d1[i]+d2[i]);
}
d1[n]=d2[]=d;
for(register int i=;i<=n;i++) {
if(d1[i]+d2[i]==d) {
vis[d1[i]]=tmp[++tmp[]]=i;
}
}
std::sort(&tmp[],&tmp[tmp[]]+,cmp);
for(register int i=;i<=tmp[];i++) {
if(d1[tmp[i]]==d1[tmp[i-]]) {
puts("NIE");
return ;
}
e[cnt++]=(Edge){tmp[i-],tmp[i],d1[tmp[i]]-d1[tmp[i-]]};
}
for(register int i=;i<=n;i++) {
if(d1[i]+d2[i]==d) continue;
const int j=vis[(d1[i]-d2[i]+d)/];
if((d1[i]+d2[i]-d)%||!j) {
puts("NIE");
return ;
}
e[cnt++]=(Edge){j,i,d1[i]-d1[j]};
}
}
puts("TAK");
for(register int i=;i<cnt;i++) {
printf("%d %d %d\n",e[i].u,e[i].v,e[i].w);
}
return ;
}
[POI2018]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$的距离只可能为任意一点到它们距离和的最小 ...
- 题解【洛谷P5959】[POI2018]Plan metra
题面 一道比较神仙的构造题. 首先确定 \(1\) 到 \(n\) 的路径长度,不妨设其长为 \(m\) . 通过观察发现,\(m\) 就是 \(\min_{1<i<n}\{dist_{1 ...
- [POI 2018] Plan Metra
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5100 [算法] 首先分两类考虑 : 1. 1 -> N的路径不经过其它节点 , ...
- POI2018
[BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...
- 测试计划(Test Plan)
测试计划(Test Plan) 版权声明:本文为博主原创文章,未经博主允许不得转载. 测试计划的概念: 测试计划是一个文档,描述了进行测试的测试范围,测试策略和方法,测试资源和进度.是对整个测试活动进 ...
- SQL Tuning 基础概述02 - Explain plan的使用
1.explain plan的使用 SQL> explain plan for delete from t_jingyu; Explained. SQL> select * from ta ...
随机推荐
- VC关于置顶窗口的方法小结
转摘自:http://blog.csdn.net/wirror800/article/details/4002381 将窗体置顶的方法有: //将窗体置顶的API函数 ::SetWindowPos(m ...
- pageContext对象的用法详述
pageContext对象 这个对象代表页面上下文,该对象主要用于访问JSP之间的共享数据. pageContext是PageContext类的实例,使用pageContext可以访问page.re ...
- HDU 1840 Equations (数学)
title: Equations 数学 杭电1840 tags: [数学] 题目链接 Problem Description All the problems in this contest tota ...
- 以root启动pycharm
在使用scapy模块的时候提示permitted就猜想可能是权限问题.然后换成root启动啥事情都没了. 由于本机是deepin先找到pycharm.sh脚本 然后再执行sudo ./pycharm. ...
- 会话Cookie
Cookie分为会话Cookie和本地Cookie两种 之前一直理解的是会话Cookie不在本地文件存储,只存储于内存,而本地Cookie因为设置了expire过期时间需要在本地存储 下面是白帽子讲W ...
- Linux2.6.32内核笔记(5)在应用程序中移植使用内核链表【转】
转自:http://blog.csdn.net/Deep_l_zh/article/details/48392935 版权声明:本文为博主原创文章,未经博主允许不得转载. 摘要:将内核链表移植到应用程 ...
- solaris遇到的问题整理总结
solaris遇到的问题整理总结 http://zh888.blog.51cto.com/1684752/454326
- 程序异常退出 却没有产生core文件
程序异常退出 却没有产生core文件 http://www.cnblogs.com/my_life/articles/4107333.html
- 多个springboot项目部署在同一tomcat上,出现jmx错误
多个springboot项目部署在同一tomcat上,出现jmx错误 原因:因为jmx某些东西重复,禁用jmx就可以了 endpoints.jmx.unique-names=true
- 《JavaScript模式》精要
P25. 如何避免eval()定义全局变量? 如: var jsstring = "var un = 1;"; eval(jsstring); console.log(typeof ...