CF97B Superset超級集合

2022-04-07 21:24:38 字數 767 閱讀 7451

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;

}