題目:
分治;先把所有點按 y 排序,然後二分遞迴;
對於每個 mid ,計算經過它的矩形的個數,把上面的每個點當做右上角,考慮下面多少點可以作為左下角;
上面的限制只有前面的 y 大於等於自己的 y,所以維護遞增的單調棧;
下面的限制是後面的 y 小於等於自己的 y,所以維護遞減的單調棧;
還要注意 x 的限制,二分找到棧內滿足條件的最前面的點,到棧頂的元素個數就是對答案的貢獻。
**如下:
#include#include#include
#include
using
namespace
std;
intconst maxn=2e5+5
;int
n,tpa,tpb,sta[maxn],stb[maxn];
long
long
ans;
struct ns[maxn];
bool cmp(n a,n b)
bool cmpx(n a,n b)
void cdq(int l,int
r)
int l=1,r=tpb,res=-1
;
while(l<=r)
if(res!=-1)ans+=tpb-res+1
; }
}int
main()
BZOJ 4237 稻草人 分治
分治。1.按y軸排序 2.分治處理 l,mid 和 mid 1,r 計算 l,mid 能對 mid 1,r 部分作出的貢獻 隨便花乙個圖發現上半部分維護y值遞增的單調棧下半部分維護y單調減得單調棧,這樣下半部分棧中元素都是可以和上半部分配對不會出現包括的情況,但是x座標必須大於s1 t1 1 就是第...
BZOJ4237 稻草人 CDQ分治
joi村有一片荒地,上面豎著n個稻草人,村民們每年多次在稻草人們的周圍舉行祭典。有一次,joi村的村長聽到了稻草人們的啟示,計畫在荒地中開墾一片田地。和啟示中的一樣,田地需要滿足以下條件 田地的形狀是邊平行於座標軸的長方形 左下角和右上角各有乙個稻草人 田地的內部 不包括邊界 沒有稻草人。給出每個稻...
bzoj 4237 稻草人 CDQ分治
time limit 40 sec memory limit 256 mb joi村有一片荒地,上面豎著n個稻草人,村民們每年多次在稻草人們的周圍舉行祭典。有一次,joi村的村長聽到了稻草人們的啟示,計畫在荒地中開墾一片田地。和啟示中的一樣,田地需要滿足以下條件 田地的形狀是邊平行於座標軸的長方形 ...