Drawing Borders

很多构造方法,下图可能是最简单的了

2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
struct Point{ int x,y; };
Point a[maxn];  int numa=0;
Point b[maxn];  int numb=0;
vector<pair<double,double> > va;
vector<pair<double,double> > vb;
void checka()
{
    va.push_back({3000,3000});
    va.push_back({3000,2999});
    for(int i=numa;i>=1;i--)
    {
        va.push_back( { a[i].x*1.000-0.3,2999} );
        va.push_back( { a[i].x*1.000-0.3,a[i].y*1.000+0.1} );
        va.push_back( { a[i].x*1.000+0.1,a[i].y*1.000+0.1} );
        va.push_back( { a[i].x*1.000+0.1,a[i].y*1.000-0.1} );
        va.push_back( { a[i].x*1.000-0.3,a[i].y*1.000-0.1} );
        while(i-1>=1 && a[i-1].x==a[i].x)
        {
            i--;
            va.push_back( { a[i].x*1.000-0.3,a[i].y*1.000+0.1} );
            va.push_back( { a[i].x*1.000+0.1,a[i].y*1.000+0.1} );
            va.push_back( { a[i].x*1.000+0.1,a[i].y*1.000-0.1} );
            va.push_back( { a[i].x*1.000-0.3,a[i].y*1.000-0.1} );
        }
        va.push_back( {a[i].x*1.0000-0.3,-1200} );
        va.push_back( {a[i].x*1.0000-0.39,-1200} );
        va.push_back( {a[i].x*1.0000-0.39,2999});
    }
    va.push_back({-3000,2999});
    va.push_back({-3000,3000});
}
void checkb()
{
    vb.push_back({-3000,-3000});
    vb.push_back({-3000,-2999});
    for(int i=1;i<=numb;i++)
    {
        vb.push_back( { b[i].x*1.000+0.3,-2999} );


        vb.push_back( { b[i].x*1.000+0.3,b[i].y*1.000-0.1} );
        vb.push_back( { b[i].x*1.000-0.1,b[i].y*1.000-0.1} );
        vb.push_back( { b[i].x*1.000-0.1,b[i].y*1.000+0.1} );
        vb.push_back( { b[i].x*1.000+0.3,b[i].y*1.000+0.1} );
        while(i+1<=numb && b[i+1].x==b[i].x)
        {
            i++;
            vb.push_back( { b[i].x*1.000+0.3,b[i].y*1.000-0.1} );
            vb.push_back( { b[i].x*1.000-0.1,b[i].y*1.000-0.1} );
            vb.push_back( { b[i].x*1.000-0.1,b[i].y*1.000+0.1} );
            vb.push_back( { b[i].x*1.000+0.3,b[i].y*1.000+0.1} );
        }
        vb.push_back( { b[i].x*1.000+0.3,1200} );
        vb.push_back( { b[i].x*1.000+0.39,1200} );
        vb.push_back( { b[i].x*1.000+0.39,-2999} );
    }
    vb.push_back({3000,-2999});
    vb.push_back({3000,-3000});
}
bool upa(Point a,Point b){if(a.x==b.x) return a.y<b.y;return   a.x<b.x;}
bool upb(Point a,Point b){if(a.x==b.x) return a.y<b.y;return   a.x<b.x;}
int main()
{
    int n ; scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,z; scanf("%d %d %d",&x,&y,&z);
        if(z==1) a[++numa].x=x,a[numa].y=y;
        if(z==2) b[++numb].x=x,b[numb].y=y;
    }
    sort(a+1,a+1+numa,upa);   checka();
    sort(b+1,b+1+numb,upb);   checkb();
    printf("%d\n",va.size()); for(int i=0;i<va.size();i++) printf("%.4f %.4f\n",va[i].first,va[i].second);
    printf("%d\n",vb.size()); for(int i=0;i<vb.size();i++) printf("%.4f %.4f\n",vb[i].first,vb[i].second);
}
View Code

相关文章: