考慮乙個分治的做法:按行分治,將所有區間分為兩類——經過分割線的、在左/右區間內部,後者顯然可以遞迴下取,考慮前者
先求出出該行上每一列向上和向下的最大長度,記作$up_$和$down_$,然後列舉左端點$l$,找到最小的右端點$r$滿足$r-l+1\le min_^up_+\min_^down_$(否則減小$r$一定不劣)
此時$r$具有單調性,再用乙個單調佇列維護即可,但時間複雜度為$o(qnm\log_n)$,甚至劣於$o(qnm)$的暴力,因此需要優化
事實上,分治的很多過程都是重複的,即用線段樹來維護區間,對於乙個完全包含的區間,我們不需要搜下去,可以直接從該點得到答案
具體的,對於每乙個區間:1.預處理出$up_$和$down_$;2.預處理出每乙個$l$對應的$r$;3.維護第2項的子樹最大值,合併的維護$o(m)$暴力即可,總複雜度為$o(nm+qm\log_n)$
細節:關於$up_$和$down_$的處理另一種方法是求出每乙個區間前字尾最長的1,根據子區間答案即可得到(而不儲存$up_$和$down_$)
1 #include2view codeusing
namespace
std;
3#define n 4000005
4#define l (k<<1)
5#define r (l+1)
6#define mid (l+r>>1)
7#define y1 y11
8struct
ji;11 dequeq1,q2;
12 vectorzero,v[n<<2
];13 vectorvv,f[n<<2],mx[n<<2
];14
intn,m,q,p,x,y,x1,y1,x2,y2,ans;
15 vectormerge(vectorx,vectory,int l1,int
l2));
19if (x[i].lx[i].l;
20else v[i].l=l1+y[i].l;
21if (y[i].ry[i].r;
22else v[i].r=l2+x[i].r;23}
24q1.clear(),q2.clear(),vv.clear();
25for(int i=0,j=-1;i)
33 vv.push_back(j-1
);34
while ((!q1.empty())&&(q1.front()<=i))q1.pop_front();
35while ((!q2.empty())&&(q2.front()<=i))q2.pop_front();36}
37return
v;38}39
void up(int k,int l,int
r)44
void build(int k,int l,int
r)49
if (l==r));
53 f[k][i]=mx[k][i]=i-1-(p^1
);54}55
return;56
}57build(l,l,mid);
58 build(r,mid+1
,r);
59up(k,l,r);60}
61void update(int k,int l,int r,int x,int
y)68
if (x<=mid)update(l,l,mid,x,y);
69else update(r,mid+1
,r,x,y);
70up(k,l,r);71}
72 vectorquery(int k,int l,int r,int x,int y,int xx,int
yy)78
int ll=min(mid,y)-max(l,x),lr=min(r,y)-max(mid+1
,x);
79 vectorvl,vr;
80 vl=query(l,l,mid,x,y,xx,yy);
81 vr=query(r,mid+1
,r,x,y,xx,yy);
82 vl=merge(vl,vr,max(ll+1,0),max(lr+1,0
));83
for(int i=xx;i<=yy;i++)ans=max(ans,min(vv[i],yy)-i+1
);84
return
vl;85}86
intmain());
90for(int i=1;i<=q;i++)
96else
102}
103return0;
104 }
4 25學習筆記
見鏈結的pandas學習。我的學習心得 python的基本元素 數字,字串和變數 python內的資料型別有 布林型 boolean true false 整型 integer 浮點型 float 可用科學計數表示法 ex.1.0e3 1000.0 字串 string 字元組成的陣列 2.1 變數 ...
425 單詞方塊
題目 給定乙個單詞集合 沒有重複 找出其中所有的 單詞方塊 乙個單詞序列形成了乙個有效的單詞方塊的意思是指從第 k 行和第 k 列 0 k max 行數,列數 來看都是相同的字串。例如,單詞序列 ball area lead lady 形成了乙個單詞方塊,因為每個單詞從水平方向看和從豎直方向看都是相...
linux 學習筆記 4 25
linux檔案系統目錄結構簡介 對於linux來講它的樹型結構與windows不同,windows可以有多個分割槽,每個分割槽都有根,但linux 只有乙個根,其他的所有檔案 目錄或硬碟分割槽 軟盤 光碟 u 盤都必須mount 掛載 到linux 根下的乙個目錄中才能被訪問和使用.bin用於存放普...