傳送門: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 ...