高階的暴力(一) 分塊

2022-08-20 12:12:12 字數 1243 閱讀 3543

在某大佬的幫助下我今天get到了分塊

簡單來說分塊就是可以把塊分成某些奇怪的大小,使之達到優秀的複雜度。but我現在只會把塊分成根號大小,然後我們修改乙個點的

資訊時就可以順便修改次點所在塊的資訊(o(1))。接著當我們查詢[l,r]這段區間,的時候,對於中間的大塊可以直接拿來用,對於兩

邊不完整的塊則直接暴力查詢(都是根號n,)。

差不多就這樣,最後附上dcoj 1324用分塊過的**

[cpp]view plain

copy

#include

#include

#include

#include

#include

using namespace std;  

const int maxn=1e5+7;  

int num,block,l[maxn],r[maxn],n,m,p,x,t,belong[maxn];  

long long max[maxn],a[maxn];  

void build()  

//確定每個塊的左右區間   

r[num]=n;//不要忘記最右為n   

for(int i=1;i<=n;i++)    belong[i]=(i-1)/block+1;//確定每個 點所屬的塊   

for(int i=1;i<=num;i++)  

for(int j=l[i];j<=r[i];j++)  

max[i]=max(max[i],a[j]);//預處理   

}  void update(int x,int date)//單點更改   

long long ask(int x,int y)//區間查詢   

return ans;  

}//如果左右端點在同一塊內則直接暴力查詢   

for(int i=x;i<=r[belong[x]];i++)  

ans=max(ans,a[i]);  

for(int i=belong[x]+1;i

ans=max(ans,max[i]);//如果左右端點需跨塊,那麼對於中間大塊的資訊直接使用  

for(int i=l[belong[y]];i<=y;i++)  

ans=max(ans,a[i]);// 兩端不完整的的塊暴力查詢   

return ans;  

}  int main()  

return 0;  

}   

M 一道普通題1 (分塊

給出乙個長為 n n 的數列,以及 n n 個操作,操作涉及區間加法,詢問區間內小於某個值 x x 的前驅 比其小的最大元素 input 第一行輸入乙個數字 n,1 n 100000n,1 n 100000。第二行輸入 nn 個非負整數,第 ii個數字為 ai 0 ai 109 ai 0 ai 10...

第十四周 專案一 (2)分塊查詢

問題描述及 煙台大學計控學院 作 者 邊朔 完成日期 2016年11日 問題描述 請用 共n 25據,每塊資料個數s 5作為資料表,自行構造索引表,分別對查詢85測試。include define maxl 100 資料表的最大長度 define maxi 20 索引表的最大長度 typedef i...

第十四周 專案一(2)分塊查詢

檔名稱 graph.cpp 完成日期 2016年12月8日 版本號 vc 6.0 問題描述 分塊查詢 輸入描述 無 程式輸出 graph.cpp include include include graph.h 功能 由乙個反映圖中頂點鄰接關係的二維陣列,構造出用鄰接矩陣儲存的圖 引數 arr 陣列名...