これは教科書的な問題。
https://yukicoder.me/problems/no/3154
問題
2次元座標上でN個の点が与えられる。
2点を結ぶ線分を計N個追加し、凸N角形を作れるか。
解法
convex hullを求めればよい。
const ll EPS=0; template<class C> C veccross(pair<C,C> p1,pair<C,C> p2,pair<C,C> p3) { p3.first-=p1.first;p2.first-=p1.first; p3.second-=p1.second;p2.second-=p1.second; return p3.first*p2.second-p2.first*p3.second; } template<class C> vector<int> convex_hull(vector< pair<C, C> >& vp) { vector<pair<pair<C, C>, int> > sorted; vector<int> res; int i,k=0,rb; if(vp.size()<=2) { if(vp.size()>=1) res.push_back(0); if(vp.size()>=2 && vp[0]!=vp[1]) res.push_back(1); return res; } FOR(i,vp.size()) sorted.push_back(make_pair(vp[i],i)); sort(sorted.begin(),sorted.end()); res.resize(vp.size()*2); /* bottom */ FOR(i,vp.size()) { while(k>1 && veccross(vp[res[k-2]],vp[res[k-1]],sorted[i].first)<=-EPS) k--; res[k++]=sorted[i].second; } /* top */ for(rb=k, i=vp.size()-2;i>=0;i--) { while(k>rb && veccross(vp[res[k-2]],vp[res[k-1]],sorted[i].first)<=-EPS) k--; res[k++]=sorted[i].second; } res.resize(k-1); return res; } int N; vector<pair<ll,ll>> P; void solve() { int i,j,k,l,r,x,y; string s; cin>>N; FOR(i,N) { cin>>x>>y; P.push_back({x,y}); } auto p=convex_hull(P); if(p.size()==N) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } }
まとめ
ライブラリにしてないと、★3位かもしれない。