BZOJ4237稻草人 單調棧 CDQ分治

2022-05-08 03:06:14 字數 1331 閱讀 3355

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

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

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

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

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

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

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

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

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

40 0

2 23 4

4 33

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

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)互不相同。

二維平面問題,將一維排序用$cdq$分治解決,然後變為序列問題。將縱座標$cdq$分治,每次將區間內的點分為兩部分,考慮右上角在上半部分,左下角在下半部分的貢獻。對於上半部分維護單調遞增的單調棧,對於下半部分維護單調遞減的單調棧,這樣對於上面每個點在下面的單調棧中二分即可得到貢獻。

#include#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

const int mod=998244353;

struct lty

q[200010];

int up[200010];

int t1,t2,n;

int down[200010];

ll ans;

bool cmp1(lty a,lty b)

else

}if(res==-1)return 0;

return t2-res+1;

}void cdq(int l,int r)

up[++t1]=i;

while(q[num].x=q[down[t2]].y)

down[++t2]=num;

num++;

} ans+=find(q[up[t1-1]].x);

} cdq(l,mid),cdq(mid+1,r);

}int main()

cdq(1,n);

printf("%lld",ans);

}

bzoj4237 稻草人 cdq分治 單調棧

bzoj4237 稻草人 暴力統計是n 2的 考慮統計一段區間對另一端的貢獻 對於y值cdq分治,降調一維 對於當前兩個分治區間統計上面那部分對下面那部分的貢獻 對當前兩區間x排序後,對上部分維護單增單調棧,得到距離當前點最近的比她低的點p 對於下面的區間維護乙個上凸殼 直接在凸殼上二分p統計答案 ...

BZOJ4237 稻草人 cdq分治 單調棧

time limit 40 sec memory limit 256 mb submit 1340 solved 589 submit status discuss joi村有一片荒地,上面豎著n個稻草人,村民們每年多次在稻草人們的周圍舉行祭典。有一次,joi村的村長聽到了稻草人們的啟示,計畫在荒地...

BZOJ 4237 稻草人 分治

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