(分塊)LOJ 6279 數列分塊入門 3

2021-08-22 02:19:33 字數 1117 閱讀 2892

傳送門:loj#6279. 數列分塊入門 3

題意:給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的前驅(比其小的最大元素)。

以下引用hzwer大佬的解答:

n<=100000其實是為了區分暴力和一些常數較大的寫法。

接著第二題的解法,其實只要把塊內查詢的二分稍作修改即可。

不過這題其實想表達:可以在塊內維護其它結構使其更具有拓展性,比如放乙個set,這樣如果還有插入、刪除元素的操作,會更加的方便。

分塊的除錯檢測技巧:

可以生成一些大資料,然後用兩份分塊大小不同的**來對拍,還可以根據執行時間嘗試調整分塊大小,減小常數。

這裡我直接用vector來實現的:

#include#include#include#include#includeusing namespace std;

#define ll long long

const int maxn=100010;

//const int maxm=sqrt(maxn)+10;

ll read()

while(ch>='0'&&ch<='9')

return x*f;}

int n,block;

int a[maxn],pos[maxn],tag[maxn];

vectorv[510];

void reset(int x)

void add(int l,int r,int c)

for(int i=pos[l]+1;i<=pos[r]-1;i++)

tag[i]+=c;}

int query(int l,int r,int c)

for(int i=pos[l]+1;i<=pos[r]-1;i++)

return ans;}

int main()

//cout<<"**"

int opt,l,r,c;

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

return 0;

}

LOJ 6279 數列分塊3

題目大意 維護 n 個數組成的序列,支援兩種操作 區間加 區間查詢某個值的前驅 小於該值的最大值,若無前驅,輸出 1 題解1 可以像分塊2一樣,維護每個塊內元素的乙個有序序列,每次查詢時二分查詢即可。如下 include define pb push back define all x x.begi...

題解 loj6279 數列分塊入門3 (分塊)

用set維護有序序列 或許sort也可以,但這題的前驅定義是嚴格小於 所以要去重 然後就是記得自己打的加法tag在query的時候一定要算上 話說這題資料有點fake啊忘了查詢算上自己的標記了還有70 然後還有玄學優化 塊的大小從 sqrt x 變成1000每個點能快300ms的樣子qwq 似乎原理...

LOJ 數列分塊入門 1

link 優雅的暴力,對於乙個數列,他不是乙個元素乙個元素處理,而是分成若干塊,成塊成塊的處理,以此達到降低時間複雜度的目的。首先,我們需要處理劃分的塊的大小 block 一般是根號n 塊的數目 每乙個元素對應第幾塊,然後,每一塊的左端點和右端點。完整的塊 更新 我們用lz i lz i lz i ...