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

2022-05-01 21:18:08 字數 848 閱讀 6791

用set維護有序序列

或許sort也可以,但這題的前驅定義是嚴格小於

所以要去重

然後就是記得自己打的加法tag在query的時候一定要算上

話說這題資料有點fake啊忘了查詢算上自己的標記了還有70

然後還有玄學優化

塊的大小從\( \sqrt x \)變成1000每個點能快300ms的樣子qwq

似乎原理是減少維護的set的個數吧

#include #include #include #include #include using namespace std;

const int maxn = 101000;

int n,sz,num,tag[maxn],a[maxn],belong[maxn];

setb[105];

void calbe(int n)

void reset(int x)

void update(int l,int r,int w)

if(xl!=xr)

} for(int i=xl+1;i<=xr-1;i++)

tag[i]+=w;

}int query(int l,int r,int w){

int xl=belong[l];

int xr=belong[r];

int ans=-1;

for(int i=l;i<=min(r,xl*sz);i++)

if(a[i]-tag[xl]&&a[i]+tag[xl]>ans)

ans=a[i]+tag[xl];

if(xl!=xr){

for(int i=(xr-1

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

傳送門 loj 6279.數列分塊入門 3 題意 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的前驅 比其小的最大元素 以下引用hzwer大佬的解答 n 100000其實是為了區分暴力和一些常數較大的寫法。接著第二題的解法,其實只要把塊內查詢的二分稍作修改即可。不過這...

LOJ 6279 數列分塊3

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

LibreOJ6279 數列分塊入門 3 題解

題目描述 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 x 的前驅 比其小的最大元素 輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為 a i 以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c 以空格隔開。若 o...