link
優雅的暴力,對於乙個數列,他不是乙個元素乙個元素處理,而是分成若干塊,成塊成塊的處理,以此達到降低時間複雜度的目的。
首先,我們需要處理劃分的塊的大小—block(一般是根號n)、塊的數目、每乙個元素對應第幾塊,然後,每一塊的左端點和右端點。
完整的塊:更新:我們用lz[i]
lz[i]
lz[i
]儲存第i
ii個塊整塊都要加上某個數的總和。
不完整的塊:更新:直接更新。
查詢:返回這個數和這個數所在塊的lz的和。
#include
using namespace std;
const
int maxn =
5e4+
100;
int a[maxn]
,block,n,num;
int l[maxn]
,r[maxn]
,belong[maxn]
,lz[maxn]
;void
init()
r[num]
= n;
}voidup(
int ql,
int qr,
int c)
for(
int i=belong[ql]+1
; i ;i++
)lz[i]
+= c;
for(
int i=ql;i<=r[belong[ql]
];i++
) a[i]
+= c;
for(
int i=l[belong[qr]
];i<=qr;i++
) a[i]
+= c;
}intqu(
int p)
intmain()
else
}}
LOJ 6277 數列分塊入門 1
給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。第一行輸入乙個數字 n。第二行輸入 n 個數字,第 i 個數字為 a i 以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 mathrm,l,r,c,以空格隔開。若 mathrm 0 表示將位於 l,r 的之間的數字都加 c...
LOJ 6277 數列分塊入門 1(分塊入門)
記憶體限制 256 mib時間限制 100 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 hzwer 提交 提交記錄 統計討論 3 測試資料 題目描述 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,單點查值。輸入格式 第一行輸入乙個數字 n。第二行輸入 n 個數字,第 ...
LOJ 6277 數列分塊入門 1 (分塊)
給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間加法,單點查值。分塊,每次更新的話對塊兩側不完整的地方暴力更新,對完整的塊內部分打標記,查詢時直接返回資料值和標記部分的值即可。include using namespace std typedef long long ll const...