description
2023年,紀念中學決定修建校慶100周年紀念碑,作為傑出校友的你被找了過來,幫校方確定紀念碑的選址.
紀念中學的土地可以看作是乙個長為n,寬為m的矩形.它由n* m個1*1的正方形組成,其中左下角的正方形的座標為(1,1),右上角的正方形的座標為(n, m).其中有一些土地已經被用來修建建築物,每一幢建築物都可以看做是乙個左下角為(x1,y1),右上角為(x2,y2)的矩形.
紀念碑可以看作是乙個正方形.校方希望你找出一塊最大的正方形區域供他們參考.
input
每一組資料的第一行包含三個整數n,m和p,分別表示學校的長,寬以及建築物的數量.
接下來的p行,每行包含四個整數x1,y1,x2,y2,分別表示每一幢建築物左下角以及右上角的座標.
output
輸出乙個數,表示可能的最大邊長.
sample input
13 5 8sample output8 4 10 4
4 3 4 4
10 2 12 2
8 2 8 4
2 4 6 4
10 3 10 4
12 3 12 4
2 2 4 2
3data constraint
對於30%的資料,p<=1000.
對於70%的資料,p<=30000.
對於100%的資料,p<=400000,m,n<=1000000.
一看什麼矩陣重疊啊什麼的先考慮一下掃瞄線
然後我們用掃瞄線+線段樹維護
掃瞄線確定橫向距離,線段樹確定縱向最大空區間
挺好搞的,線段樹三個值,乙個是從左往右的最大空區間,另乙個從右往左,還有乙個最大的
更新一下就行,不需要下傳標記,因為掃瞄線遲早會把它去掉
#include #includeview code#include
using
namespace
std;
#define lson (x<<1)
#define rson ((x<<1)+1)
const
int n=1e6+10
;struct
seg t[4*n];
struct
interval ;
vector
add[n],del[n];
intn,m,p;
void update(int
x)
if (t[x].len==1
) t[x].v[
0]=t[lson].v[0]+(t[lson].v[0]==t[lson].len)*t[rson].v[0
]; t[x].v[
1]=t[rson].v[1]+(t[rson].v[1]==t[rson].len)*t[lson].v[1
]; t[x].v[
2]=max(t[lson].v[1]+t[rson].v[0],max(t[lson].v[2],t[rson].v[2
]));
}void build(int x,int l,int
r) void change(int x,int l,int r,int xl,int xr,int
k)
int mid=l+r>>1
;
if (xl<=mid) change(lson,l,mid,xl,xr,k);
if (mid1
,r,xl,xr,k);
update(x);
}int
main() ),del[x2].push_back((interval));
build(
1,1,m);
int l=1,r=1,ans=0
;
while (r<=n)
r++;
}printf(
"%d\n
",ans);
}
JZOJ 6276 樹 掃瞄線 線段樹
傳送門 有一棵無根樹,現在有m mm個點對x,y x,yx,y,要求在任意u,v u,vu,v的簡單路徑上不能既經過x xx又經過y yy問一共有多少路徑滿足要求 正著推看起來思維難度很高,所以我們喜聞樂見的反著推,找出不合法的方案數就好了 我們先求出無根樹的dfs dfsdf s序,在輸入每個點對...
線段樹 掃瞄線
pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...
掃瞄線 線段樹
問題描述 小明的家旁邊有條河流,但最近,周圍的三個工廠開始向這條河排放汙水,這條河的一部分被汙染了,被乙個工廠汙染的部分可以看做乙個矩形,現在小明想知道這條河被汙染的面積是多少。輸入 第一行乙個整數t,表示有多少組資料,之後每一組資料報括三行,每一行有lx,ly,rx,ry四個整數,表示被乙個工廠汙...