zoukankan      html  css  js  c++  java
  • BZOJ5100 POI2018Plan metra(构造)

      容易发现要么1和n直接相连,要么两点距离即为所有dx,1+dx,n的最小值。若为前者,需要满足所有|d1-dn|都相等,挂两棵菊花即可。若为后者,将所有满足dx,1+dx,n=d1,n的挂成一条链,其余点直接与链上点相连即可,相连点需要满足dx,1-dx,n=dy,1-dy,n

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define N 500010
    #define D 1000010
    char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
    int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    int n,a[N],b[N],id[D];
    struct data
    {
        int x,i;
        bool operator <(const data&a) const
        {
            return x<a.x;
        }
    }d[N];
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("bzoj5100.in","r",stdin);
        freopen("bzoj5100.out","w",stdout);
        const char LL[]="%I64d
    ";
    #else
        const char LL[]="%lld
    ";
    #endif
        n=read();
        for (int i=2;i<n;i++) a[i]=read();
        for (int i=2;i<n;i++) b[i]=read();
        if (n==2) {cout<<"TAK
    "<<endl<<1<<' '<<2<<' '<<1;return 0;}
        int len=abs(a[2]-b[2]);
        for (int i=3;i<n;i++) if (abs(a[i]-b[i])!=len) {len=0;break;}
        if (len)
        {
            cout<<"TAK
    ";
            cout<<1<<' '<<n<<' '<<len<<endl;
            for (int i=2;i<n;i++)
            if (a[i]>b[i]) printf("%d %d %d
    ",i,n,b[i]);
            else printf("%d %d %d
    ",i,1,a[i]);
            return 0;
        }
        len=2000000;
        for (int i=2;i<n;i++) len=min(len,a[i]+b[i]);
        int cnt=0;for (int i=2;i<n;i++) if (a[i]+b[i]==len) cnt++,d[cnt].x=a[i],d[cnt].i=i;
        sort(d+1,d+cnt+1);++cnt;d[0].x=0,d[0].i=1,d[cnt].x=len,d[cnt].i=n;
        for (int i=1;i<=cnt;i++) if (d[i].x==d[i-1].x) {cout<<"NIE";return 0;}
        for (int i=0;i<=cnt;i++) id[d[i].x]=d[i].i;
        for (int i=2;i<n;i++)
        if (a[i]+b[i]>len&&((a[i]+b[i]-len&1)||!id[a[i]-(a[i]+b[i]-len>>1)])) {cout<<"NIE";return 0;}
        cout<<"TAK
    ";
        for (int i=1;i<=cnt;i++) printf("%d %d %d
    ",d[i-1].i,d[i].i,d[i].x-d[i-1].x);
        for (int i=2;i<n;i++)
        if (a[i]+b[i]>len) printf("%d %d %d
    ",id[a[i]-(a[i]+b[i]-len>>1)],i,a[i]+b[i]-len>>1);
        return 0;
    }
  • 相关阅读:
    静态切割窗体+关联对话框
    POJ 2236 Wireless Network(并查集)
    怎样学习(3):迭代学习,精益求精
    【菜鸟也疯狂UML系列】——概述
    OpenGL 资源汇编
    vue之mapMutaions的使用 && vuex中 action 用法示例 && api.js的使用
    内置组件 && vue中强大的缓存机制之keep-alive
    vue生命周期及使用 && 单文件组件下的生命周期
    vue中遇到的坑 --- 变化检测问题(数组相关)
    如何去除vue项目中的 # --- History模式
  • 原文地址:https://www.cnblogs.com/Gloid/p/10078801.html
Copyright © 2011-2022 走看看