• 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(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两点的树边。
    若有多组解,输出任意一组。
    如果有解一定可以调整成所有点都在1~n路径上或和1~n路径直接相连
    分类考虑1和n之间是否有边,其余点可以在1到n的路径上,也可以和1到n的路径上某个点相邻
    #include<bits/stdc++.h>
    const int N=5e5+7;
    int _(){int x;scanf("%d",&x);return x;}
    int n;
    int d1[N],dn[N],d1n=1e9,ws[N*4],fa[N],fe[N];
    int pp=0;
    void mins(int&a,int b){if(a>b)a=b;}
    int abs(int x){return x>0?x:-x;}
    int main(){
        n=_();
        if(n==2)return puts("TAK
    1 2 1"),0;
        for(int i=2;i<n;++i)d1[i]=_();
        for(int i=2;i<n;++i){
            dn[i]=_();
            mins(d1n,d1[i]+dn[i]);
        }
        int D=abs(d1[2]-dn[2]);
        if(!D)goto o;
        for(int i=3;i<n;++i)if(abs(d1[i]-dn[i])!=D)goto o;
        puts("TAK");
        printf("1 %d %d
    ",n,D);
        for(int i=2;i<n;++i){
            if(d1[i]<dn[i])printf("1 %d %d
    ",i,d1[i]);
            else printf("%d %d %d
    ",n,i,dn[i]);
        }
        return 0;
        o:;
        ws[0]=1;
        ws[d1n]=n;
        for(int i=2;i<n;++i)if(d1[i]+dn[i]==d1n){
            if(ws[d1[i]])return puts("NIE"),0;
            ws[d1[i]]=i;
        }
        for(int i=2;i<n;++i){
            int a=d1[i],c=a+dn[i]-d1n;
            if(!c)continue;
            if(c&1)return puts("NIE"),0;
            a-=c/2;
            if(!ws[a])return puts("NIE"),0;
            fa[i]=ws[a];
            fe[i]=c/2;
        }
        puts("TAK");
        for(int i=1,pv=0;i<=d1n;++i)if(ws[i])printf("%d %d %d
    ",ws[i],ws[pv],i-pv),pv=i;
        for(int i=2;i<n;++i)if(fa[i])printf("%d %d %d
    ",i,fa[i],fe[i]);
        return 0;
    }
  • 相关阅读:
    手机网页唤醒app,
    h5 audio进度条
    js判断字符串与字符串相互包含,以及数组是否包含某个元素;
    vue cli 打包项目造成css背景图路径错误
    vue-cli webpack打包不.map文件,iview 项目打包完,图标路径有问题
    常用的活动榜单
    vue-cli的webpack模板项目配置文件分析,配置信息详解
    eclipse怎么debug项目
    什么是前置机,前置机的作用是什么
    jsp中连接数据库及实现增删改查
  • 原文地址:https://www.cnblogs.com/ccz181078/p/7906994.html
Copyright © 2020-2023  润新知