分塊 分塊練習三題

2021-10-09 09:33:43 字數 3215 閱讀 9778

分塊嘛…

馮巨道德午餐講過的

唯一不同的是可能需要st[n],ed[n]來記錄一下範圍

教主的魔法 板

#include

using

namespace std;

#define in read()

int in

const

int n=

1e6+5;

int n,q,a[n]

,b[n]

,add[n]

;int siz,m,st[n]

,ed[n]

;void

init()

ed[m]

=n;for

(int i=

1;i<=m;

++i)

sort

(b+st[i]

,b+ed[i]+1

);return;}

void

frag_modify

(int l,

int r,

int num,

int c)

void

blok_modify

(int blol,

int blor,

int c)

void

modify

(int l,

int r,

int c)

intfrag_inquir

(int l,

int r,

int num,

int c)

intblok_inquir

(int blol,

int blor,

int c)

return cnt;

}void

inquir

(int l,

int r,

int c)

intmain()

return0;

}

argestes and sequence 板

#include

using

namespace std;

#define in read()

#define int long long

int in

const

int n=

1e5+5;

int b[

1000][

13][10

],a[n]

;int n,m,t,siz,tot,st[n]

,ed[n]

;int

qpw(

int a,

int b)

return res;

}void

init()

ed[tot]

=n;int block=1;

for(

int i=

1;i<=n;

++i)

for(

int i=pos+

1;i<=10;

++i)

++b[block]

[i][0]

;}return;}

void

modify

(int x,

int y)

for(

int i=pos+

1;i<=10;

++i)

--b[block]

[i][0]

; a[x]

=y,pos=0;

while

(y)for

(int i=pos+

1;i<=10;

++i)

++b[block]

[i][0]

;return;}

intfrag

(int l,

int r,

int d,

int p)

return cnt;

}int

blok

(int l,

int r,

int d,

int p)

void

query

(int l,

int r,

int d,

int p)

signed

main()

else

if(opt[0]

=='q')}

}return0;

}

[hnoi2010]彈飛綿羊

想學lct

考慮分塊

單點查,單點改

考慮維護乙個塊:

記錄塊中點跳出塊所需的次數step和跳出去的點to

然後就可以跳塊了

預處理時倒著加

分塊的核心也許就在於把單點暴力合併成塊吧

吐槽這題下標太坑了

而且下標錯了就t掉

#include

using

namespace std;

#define in read()

#define int long long

int in

const

int n=

2e5+5;

int n,m,bl[n]

,siz,tot,k[n]

,st[n]

,to[n]

,step[n]

;void

init()

st[bl[n]+1

]=n+1;

m=in;

for(

int i=n;i>=1;

--i)

else

}return;}

void

query

(int p)

printf

("%lld\n"

,res)

;return;}

void

modify

(int p,

int t)

else

}return;}

signed

main()

else

}return0;

}

分塊入門題

分塊入門題5 給 l,r 取開方,乙個數字最多被取開方6次,那麼乙個塊內有需要開方的時候才對這個塊取開方,那麼最多6 n sqrt n 次,分塊直接寫 includeusing namespace std typedef long long ll const int maxn 1e5 7 int l...

分塊模板題

題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,單點查值。輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為a i 以空格隔開 接下來輸入 n 行詢問,每行輸入四個數字 opt,l,r,c,以空格隔開 若 opt 0,表示將 l,r 的之間的數都加 c 若 o...

分塊模板 模板題

嗯 直接貼板子了,注釋寫了點 include using namespace std const int maxn 1e5 10 int a maxn belong maxn l 1010 r 1010 block,num a陣列訪問原始資料,belong陣列表示每個數屬於哪一塊方便呼叫,l和r表示...