BZOJ4237 稻草人 CDQ分治

2021-08-21 09:41:02 字數 1070 閱讀 7982

joi村有一片荒地,上面豎著n個稻草人,村民們每年多次在稻草人們的周圍舉行祭典。

有一次,joi村的村長聽到了稻草人們的啟示,計畫在荒地中開墾一片田地。和啟示中的一樣,田地需要滿足以下條件:

田地的形狀是邊平行於座標軸的長方形;

左下角和右上角各有乙個稻草人;

田地的內部(不包括邊界)沒有稻草人。

給出每個稻草人的座標,請你求出有多少遵從啟示的田地的個數

第一行乙個正整數n,代表稻草人的個數

接下來n行,第i行(1<=i<=n)包含2個由空格分隔的整數xi和yi,表示第i個稻草人的座標

輸出一行乙個正整數,代表遵從啟示的田地的個數

4 0 0

2 2

3 4

4 3所有滿足要求的田地由下圖所示:

xi(1<=i<=n)互不相同。

yi(1<=i<=n)互不相同。

分治一下,先按照y排序然後進行分治,這樣可以保證右邊的所有y值大於等於左邊,然後在分治時按照x排序,用單調棧維護一下y值就好了

#include

using namespace std;

#define n 200010

#define ll long long

int n,p[n],q[n];

struct nodea[n];ll ans=0;

bool cmp1(node a,node b)

bool cmp2(node a,node b)

int find(int val,int l,int r)

return l;

}void solve(int l,int r)

ans+=tq-find(a[p[tp-1]].x,0,tq+1);

}}int main()

bzoj 4237 稻草人 CDQ分治

time limit 40 sec memory limit 256 mb joi村有一片荒地,上面豎著n個稻草人,村民們每年多次在稻草人們的周圍舉行祭典。有一次,joi村的村長聽到了稻草人們的啟示,計畫在荒地中開墾一片田地。和啟示中的一樣,田地需要滿足以下條件 田地的形狀是邊平行於座標軸的長方形 ...

BZOJ 4237 稻草人 分治

分治。1.按y軸排序 2.分治處理 l,mid 和 mid 1,r 計算 l,mid 能對 mid 1,r 部分作出的貢獻 隨便花乙個圖發現上半部分維護y值遞增的單調棧下半部分維護y單調減得單調棧,這樣下半部分棧中元素都是可以和上半部分配對不會出現包括的情況,但是x座標必須大於s1 t1 1 就是第...

BZOJ4237 稻草人 題解

我們考慮分治一下 按 x 座標排序 然後對於每一段的兩部分都按 y 排序 左右兩邊都維護乙個單調棧 然後考慮右邊對左邊的貢獻就行了 include define int long long using namespace std const int maxn 2e5 5 int n struct n...