分塊嘛…
馮巨道德午餐講過的
唯一不同的是可能需要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表示...