cf97b superset
這題主要是構造難想。看看資料範圍發現連\(o(n^2)\)都被卡了,然後 考試的名稱提醒我 想到了分治。
座標按橫座標為關鍵字排序後找中間的點進行分治不是點分治qwq。
考慮讓中間點作一條平行於y軸的直線,讓每個點i(mid除外)向這條直線引垂線交於乙個點 \(s_i\),那麼這個點一定可以加入。
原因:可行性證明:
考慮不包含 \(s_i\) 的點,由於左半邊和右半邊都已滿足條件,當左邊的點i和右邊的點j組成矩形時,矩形邊緣上一定有2個點\(s_i,s_j\),於是這些s就能使左右合併。
考慮包含 \(s_i\) 的點。如果它和點j組成矩形,那麼邊緣上一定有點 \(s_j\) ,滿足題意。
分治完了記得去重哦~
由於點數是 \(n\log n\) 的級別,所以陣列也要開到 \(n\log n\)
#includeusing namespace std;
const int n=150005;
int n,len,tot;
struct pointa[n],ans[n],p[n];
bool cmp(const point &a,const point &b)
}int main()
printf("%d\n",len);
for(int i=1;i<=len;++i)
printf("%d %d\n",p[i].x,p[i].y);
return 0;
}