BZOJ4237 稻草人(分治 樹狀陣列 單調棧)

2022-05-20 16:13:00 字數 1084 閱讀 7654

如果要詢問的某個縱座標為inf的點左邊是否有點能與其構成所要求的矩形,只要用個單調棧就可以了。可以想到用分治來製造單調性。

按橫座標排序,每次考慮跨過分治中心的矩形。考慮右邊的每個點能與左邊的哪些點構成矩形。首先這受到右邊點的限制,對於每個點用set求出這個範圍。然後對所有點按縱座標從大到小排序,維護乙個樹狀陣列,如果是右邊的點直接在樹狀陣列上的該範圍查詢,左邊的點則將其加入單調棧並在樹狀陣列上修改。

常數過大,在darkbzoj上跑了30s,bzoj上t掉了。

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define n 200010

#define inf 1000000000

intn,stk[n],b[n],tree[n];

long

long ans=0

;struct dataa[n];

setf;

bool cmp(const data&a,const data&b)

bool cmp1(const data&a,const data&b)

void add(int k,int x)

int query(int k)

void solve(int l,int

r) ans+=query(a[i].d)-query(a[i].y);

}x=l-1,top=0

;

for (int i=mid+1;i<=r;i++)

}sort(a+l,a+mid+1

,cmp);

sort(a+mid+1,a+r+1

,cmp);

}int

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村的村長聽到了稻草人們的啟示,計畫在荒地中開墾一片田地。和啟示中的一樣,田地需要滿足以下條件 田地的形狀是邊平行於座標軸的長方形 左下角和右上角各有乙個稻草人 田地的內部 不包括邊界 沒有稻草人。給出每個稻...