很多构造方法,下图可能是最简单的了
代码:
#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); }