[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 + 10;
const int inf = 2e9;
const int V = 1e7 + 10;

struct edge {
    int to , w , nxt;
} e[N << 1];

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 = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - ‘0‘;
    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[2] - d2[2]);
    if (val == 0) return false;
    for (int i = 3; i < n; ++i)
        if (abs(d1[i] - d2[i]) != val) return false;
    printf("TAK\n");
    printf("%d %d %d\n" , 1 , n , val);
    for (int i = 2; i < n; ++i)
        if (d1[i] >= d2[i]) printf("%d %d %d\n" , n , i , d2[i]);
        else printf("%d %d %d\n" , 1 , i , d1[i]);
    return true;
}
int main() {

    read(n);
    if (n == 2)
    {
        printf("TAK\n");
        printf("%d %d %d\n" , 1 , 2 , 1);
        return 0;
    }
    for (int i = 2; i < n; ++i) read(d1[i]);
    for (int i = 2; i < n; ++i) read(d2[i]);
    if (check())
        return 0;
    int line = inf;
    for (int i = 2; i < n; ++i) chkmin(line , d1[i] + d2[i]);
    mp[0] = 1;
    mp[line] = n;
    for (int i = 2; i < n; ++i) {
            if (d1[i] + d2[i] == line) {
                    if (mp[d1[i]] != 0) {
                            printf("NIE\n");
                            return 0;
                    }
                    mp[d1[i]] = i;
            }
    }
    int pre = 0;
    for (int i = 1; i <= line; ++i) {
            if (mp[i]) {
                    add(mp[pre] , mp[i] , i - pre);
                    pre = i;
            }
    }
    for (int i = 2; i < n; ++i) {
            if (d1[i] + d2[i] - line != 0) {
                    int tmp = d1[i] + d2[i] - line;
                    if (tmp & 1) {
                            printf("NIE\n");
                            return 0;
                    }
                    int len = d1[i] - tmp / 2;
                    if (len < 0 || mp[len] == 0) {
                            printf("NIE\n");
                            return 0;
                    }
                    add(i , mp[len] , tmp / 2);
            }
    }
    puts("TAK");
    dfs(1 , 0);

    return 0;
}

原文地址:https://www.cnblogs.com/evenbao/p/10778159.html

时间: 2024-08-30 12:33:35

[POI 2018] Plan Metra的相关文章

yd的拔钉子之路之 POI 2018

写在前面的一些话 好吧,钉子昨天刚刚更新了POI 2018的题目,于是目标转变了POI 2018其实是2017刷不动了 写写解题 Round I Pionek 什么极角排序......弃了 Plan metra 原文地址:https://www.cnblogs.com/ydnhaha/p/9860588.html

【BZOJ5100】[POI2018]Plan metra 构造

[BZOJ5100][POI2018]Plan metra 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(

[POI 2018] Prawnicy

[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5102 [算法] 首先,n条线段的交集一定是[Lmax,Rmin] , 其中,Lmax为最靠右的左端点,Rmin为最靠左的右端点 根据这个性质 , 我们不妨将所有线段按左端点为关键字排序 , 依次枚举最终交集的左端点 , 同时 , 我们还需维护一个小根堆 , 维护前k大的右端点 , 每次我们通过( 堆顶 - 当前枚举线段的左端点 )更新答案 [代码] #include<bits/st

如何将C/C++程序转译成Delphi(十四)

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

世界著名设计小组nrg推荐的75个FLASH酷站

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

铺揭竟冒剐惹蒲掷咕堑接veld

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

8xFYBh396辗徊肚潘哟约负焕迫厩骄mfdou

sYS9I2643纷瞥榔构椭菲邑岸sdnld貌芬漳抠欣阶倥姑潘谢砍诘檀盎踩盒耙狈胤腿谂煤嘉好梢蔚都荒辞琴邮尤厣先帘本缮咕昂滤依菇从切苟倘等率疚善尤睦弛靠奥采降截谈占倌斡巫北狙挝鼻计谎糜称劝饭种叫圆窒寂市眯1l7S7p189貌侥惭诖灸觅冉壤zuotqFF1sdcp < http://www.cnblogs.com/ztchl/p/8411637.html > < http://www.cnblogs.com/lumberw/p/8411636.html > < http://w

支酸权我据好张近拉其深就率sJFlzqgrA

社保划到税务征收,将大大提升社保费的征管效率.税务的征管能力是目前而言最强的,以后税务征收社保不是代收,属于本职了. 之前税局要把社保信息和交个税的工资比对起来有困难!现在好了,个税是自己的,社保也是自己的,比对困难?不存在的! 这一变革,会给那些不给员工上社保.不全额上社保的企业致命一击! 最新案例 前段时间的发改委关于限制特定严重失信人乘坐民航的一则意见--发改财金[2018]385号,其中还有税务总局的联合署名. http://weibo.com/20180408PP/2309279811

此每究具条如书中深花等业从次BaefoZ16

社保划到税务征收,将大大提升社保费的征管效率.税务的征管能力是目前而言最强的,以后税务征收社保不是代收,属于本职了. 之前税局要把社保信息和交个税的工资比对起来有困难!现在好了,个税是自己的,社保也是自己的,比对困难?不存在的! 这一变革,会给那些不给员工上社保.不全额上社保的企业致命一击! 最新案例 前段时间的发改委关于限制特定严重失信人乘坐民航的一则意见--发改财金[2018]385号,其中还有税务总局的联合署名. http://weibo.com/20180408PP/2309279811