BZOJ4237 稻草人 題解

2022-02-13 20:38:52 字數 881 閱讀 9667

我們考慮分治一下

按\(x\)座標排序 然後對於每一段的兩部分都按\(y\)排序

左右兩邊都維護乙個單調棧

然後考慮右邊對左邊的貢獻就行了

#include #define int long long

using namespace std ;

const int maxn = 2e5 + 5 ;

int n ;

struct node d[ maxn ] ;

int ans ;

inline bool cmp ( node a , node b )

inline bool cmp1 ( node a , node b )

int st1[ maxn ] , st2[ maxn ] , top1 , top2 ;

inline int read ()

while ( c >= '0' && c <= '9' )

return tot * f ;

}inline void cdq ( int l , int r )

if ( top1 == 1 )

int t = d[ st1[ top1 - 1 ] ].y ;

int lx = 1 , rx = top2 , ans1 = 0 ;

while ( lx <= rx )

if ( ans1 && ans1 <= top2 ) ans += ( top2 - ans1 + 1 ) ;

}sort ( d + l , d + r + 1 , cmp ) ;

cdq ( l , mid ) ;

cdq ( mid + 1 , r ) ;

}signed main ()

BZOJ 4237 稻草人 分治

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

bzoj4237 稻草人 分治

題目 分治 先把所有點按 y 排序,然後二分遞迴 對於每個 mid 計算經過它的矩形的個數,把上面的每個點當做右上角,考慮下面多少點可以作為左下角 上面的限制只有前面的 y 大於等於自己的 y,所以維護遞增的單調棧 下面的限制是後面的 y 小於等於自己的 y,所以維護遞減的單調棧 還要注意 x 的限...

BZOJ4237 稻草人 CDQ分治

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