bzoj4237 稻草人 CDQ分治 單調棧 二分

2021-08-28 02:39:31 字數 1126 閱讀 9903

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

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

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

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

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

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

1<=n<=2*10^5

0<=xi<=10^9(1<=i<=n)

0<=yi<=10^9(1<=i<=n)

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

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

我們考慮列舉右上角,那麼左下角能取的點一定是y座標單調下降的連續一段

注意到乙個點還會被它左下角離它最近的乙個點限制,因此我們對右上角的點維護乙個y座標單調上公升的單調棧,左下角的點維護乙個y座標單調下降的單調棧,那麼x能取的左下角就可以二分了

然後我們發現界定左下角和右上角可以按照y座標分治著做

#include 

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define fi first

#define se second

typedef

long

long ll;

typedef

std:: pair pair;

const

int n=200005;

pair p[n];//,stack1[n],stack2[n];

int stack1[n],stack2[n];

ll ans;

int read()

bool cmp1(pair a,pair b)

return r;

}void solve(int tl,int tr)

ans+=top1-find(1,top1,p[stack2[top2-1]].fi);

}solve(tl,mid); solve(mid+1,tr);

}int main(void)

BZOJ4237 稻草人 CDQ分治

joi村有一片荒地,上面豎著n個稻草人,村民們每年多次在稻草人們的周圍舉行祭典。有一次,joi村的村長聽到了稻草人們的啟示,計畫在荒地中開墾一片田地。和啟示中的一樣,田地需要滿足以下條件 田地的形狀是邊平行於座標軸的長方形 左下角和右上角各有乙個稻草人 田地的內部 不包括邊界 沒有稻草人。給出每個稻...

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 就是第...