波雷卡普有乙個n×m,大小的棋盤,上面有k個車。他又放了q個矩形在上面。每乙個矩形要受到保護。矩形受到保護的意思是對於該矩形內部所有的格仔能夠被這個矩形內的某個車攻擊到或者被佔據,和矩形外面的車無關,即矩形外面的車不能攻擊到矩形裡面。車的位置是固定的。1≤n,m≤100000, 1≤k,q≤200000.
又是一道掃瞄線,還是很妙。
首先滿足題意的情況只存在於矩形內每一行都有車或者每一列都有車,所以可以分行列來做,只要有其一滿足就能滿足。
就按列來講,我們把車的縱座標按照公升序排序,豎著的掃瞄線每次移動到下乙個區間的端點。
如何處理上下界呢?將區間也按上界公升序排序,每次只把然後把這一段下面的點加入線段樹維護,維護的是當前區間的縱座標最小值。
如果區間高度最小小於了下界線,就是不合法的了。
如圖所示,遇到紫色矩形前,只維護了綠色空心車,然後遇到了紫色矩形的上界,上屆向上移,加入了綠色實心的車。
因此,這一列上的綠色空心車的位置被更新到綠色實心車的位置。
同理,再處理行。
#includeusingnamespace
std;
#define n 200200
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (t[p].l+t[p].r>>1)
#define inf 1234567890
intn,m,k,q;
intok[n];
struct
et[n*4
];struct
maa[n];
struct
ilb[n];
bool cmp1(ma a,ma b);
bool cmp2(il a,il b);
inline
void pushup(int
p)inline
void build(int p,int l,int
r)
int bm=l+r>>1
; build(lc,l,bm);build(rc,bm+1
,r);
pushup(p);
}inline
void update(int p,int x,int
v)
if(x<=mid)update(lc,x,v);
if(x>mid)update(rc,x,v);
pushup(p);
}inline
int query(int p,int ql,int
qr)void solve(int
mx)}
intmain()
51nod 1559 車和矩形
倘若矩形是受保護的,那麼矩形內每一行至少有乙個車或者每一列至少有乙個車 判斷矩形內每一列都有乙個車 線段樹中維護x座標這一列車的最大y座標 那麼掃瞄線掃過矩形的上邊界時 如果矩形左右邊界內,車的最大y座標中最小的那個大於等於矩形的下邊界 那麼這個矩形的每一列都有乙個車 將車按y座標從小到大排序,每次...
51NOD 1102 面積最大的矩形
有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。input 第1行 1個數n,表示陣列的長度 0 n 50000 第2 n 1行 陣列元素a i 1 a i 10 9 output ...
51nod 1102 面積最大的矩形
1102 面積最大的矩形 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。input 第1行 1個...