luogu4259 尋找車位

2022-06-07 08:42:12 字數 2330 閱讀 2774

考慮乙個分治的做法:按行分治,將所有區間分為兩類——經過分割線的、在左/右區間內部,後者顯然可以遞迴下取,考慮前者

先求出出該行上每一列向上和向下的最大長度,記作$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 #include2

using

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 }

view code

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用於存放普...