access_globe 有乙個巨大的停車場,這個停車場有 nn 行,每行有 mm 個車位。為了美觀,access_globe 在建立這個停車場時,規定這個停車場必須是長條形的,即 n\ge mn≥m。每個車位都是乙個正方形的區域。具體題面最近,access_globe 正在為抽不到 missing poster 而苦惱,因此他請你幫他維護這個停車場。你需要支援兩個個事件:
一輛車停到某乙個車位中,或一輛車從某個車位開走
查詢乙個矩形區域內最大的只包含空車位的正方形區域
如果你能幫 access_globe 高效地解決這個問題,access_globe 一定會好好獎勵你的。
推薦題解
其實就是(對每一列開一顆)開m顆線段樹,第y顆線段樹x處的值為以x行y列為右下端點的最大正方形大小,線段樹就是維護一下最大值。(推薦結合樣例理解)
然後發現第y顆線段樹[l,
r]
[l,r]
[l,r
]的值就是l到r行y列為右下端點的最大正方形大小(不考慮外面的行),然後我們來合併[l,
mid]
[l,mid]
[l,mid
]與[mid
+1,r
][mid+1,r]
[mid+1
,r]的最大正方形大小,我們只需要考慮過mid這條線的正方形,那麼算這條線左邊的拓展,右邊的拓展,再單調佇列掃一遍可以求出o(m)1到m
1到m1到
m顆線段樹的[l,
r]
[l,r]
[l,r
]的答案,然後就合併,嗯合併。
o (m
qlogn
)o(mq \log n)
o(mq
logn
)ac code:
#include
#define n 4000006
#define lc now<<1
#define rc now<<1|1
using
namespace std;
int n,m,q;
struct arr
}mp,rl,ll,val;
int ql[
2005
],qr[
2005
],hl,tl,hr,tr,len[
4*n]
;inline
void
merge
(int r,
int r1,
int r2)
for(
int i=
1;i<=m;i++
) ll[r]
[i]=ll[r2]
[i]+
(ll[r2]
[i]==len[r2]
)*ll[r1]
[i],rl[r]
[i]=rl[r1]
[i]+
(rl[r1]
[i]==len[r1]
)*rl[r2]
[i];
len[r]
=len[r1]
+len[r2];}
void
modify
(int now,
int l,
int r,
int x,
int y)
int mid=
(l+r)
>>
1;x<=mid?
(modify
(lc,l,mid,x,y),0
):(modify
(rc,mid+
1,r,x,y),0
);merge
(now,lc,rc);}
void
build
(int now,
int l,
int r)
int mid=
(l+r)
>>1;
build
(lc,l,mid)
;build
(rc,mid+
1,r)
;merge
(now,lc,rc);}
intquery
(int now,
int l,
int r,
int a,
int b,
int c,
int d)
int mid =
(l+r)
>>1;
return
max(
query
(rc,mid+
1,r,a,b,c,d)
,query
(lc,l,mid,a,b,c,d));
}int
main()
else
}}
Codeplus 4月賽 最短路
題意 理論上是給定一張完全圖,有邊權,在給一些單向邊求最短路。思路 我充分體會到了我圖論的菜。理論上建圖肯定是不能 n 2 的,考慮如何優化呢?將邊權異或值二進位制替換,最後一遍最短路就行,記得把 n 開到 2 k luogu judger enable o2 include define mp m...
CodePlus 第五次網路賽 掐指會算
失蹤人口暫時回歸。臨近 noip 了,退役選手準備打一打 div.2 來練練手 應該不是天氣冷了,沒衣服穿了 遊戲體驗差,oj 又和第一次一樣卡了半天。根據異或的性質,不難發現 a aa 矩陣的每行每列最多只能異或一次。所以我們可以假設 a aa 矩陣的第一行是否被異或了,然後把所有狀態遞推出來,最...
2018 1月 月賽總結
a題 n,m 1e18,p 1e5,lucas定理求組合數 include include include using namespace std typedef long long ll ll n,m,p 100003 ll f 100005 ll qpow ll a,ll b return an...