hihoCoder #1582 Territorial Dispute 幾何凸包
阿新 • • 發佈:2017-10-04
tag def return stack %d font set wap sort
hihoCoder #1582 Territorial Dispute
題意:給出 n 個點,染兩種顏色,問是否有一種染色方案,使得沒有任何一條直線可以劃分開這兩種顏色的點。
tags:求個凸包,如果內部有點就內部點染一種顏色,如果內部沒點就凸包上的點交替染。 還有 n==3 且在一條直線上的情況,特判一下。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #defineper(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const double eps=1e-8; const int N = 200005; struct Point { double x, y; int id; } p[N], sta[N];int isZero(double x) { //x是否為0 return (x>0 ? x : -x) < eps; } double crossProd(Point A,Point B,Point C) { //叉積,這樣寫即A->B到A->C逆時針為正 return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x); } double Dis(Point A,Point B) { return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y)); }//以最左下的點為基準點,其他各點(逆時針方向)以極角從小到大的排序規則 bool cmp(Point a, Point b) { double tmp = crossProd(p[1], a, b); //極角大小轉化為求叉乘 if(tmp>0 || (isZero(tmp)&&Dis(p[1],a)<Dis(p[1],b))) return 1; else return 0; } int top; void Graham(int _n) { int mi=1; double mx=p[1].x, my=p[1].y; for(int i=2; i<=_n; ++i) //找到最左下點 if(my>p[i].y || my==p[i].y&&mx>p[i].x) mi=i, my=p[i].y, mx=p[i].x; swap(p[1], p[mi]); //最左下點要換到p開頭,不能讓它和它自己比 sort(p+2, p+1+_n, cmp); sta[1]=p[1], sta[2]=p[2], sta[3]=p[3]; p[_n+1]=p[1]; //在結尾加最左下點為結束點 top=2; for(int i=3; i<=_n+1; i++) { //加入一個點後,向右偏拐或共線,則上一個點不在凸包內,則--top,該過程直到不向右偏拐或沒有三點共線的點 while(crossProd(sta[top-1],sta[top],p[i])<0 && top) top--; sta[++top]=p[i]; } } int n; bool ans[N]; int main() { int T; scanf("%d", &T); while(T--) { mes(ans, false); scanf("%d", &n); rep(i,1,n) scanf("%lf%lf", &p[i].x, &p[i].y), p[i].id=i; if(n<3) { puts("NO"); continue; } if(n==3 && (p[1].y-p[2].y)*(p[2].x-p[3].x) != (p[2].y-p[3].y)*(p[1].x-p[2].x) ) { puts("NO"); continue; } puts("YES"); Graham(n); --top; if(top<n) { rep(i,1,top) ans[sta[i].id]=true; } else { rep(i,1,top) if(i&1) ans[sta[i].id]=true; } rep(i,1,n) printf("%c", ans[i] ? ‘A‘ : ‘B‘); puts(""); } return 0; }
hihoCoder #1582 Territorial Dispute 幾何凸包