在某大佬的幫助下我今天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 陣列名...