分塊 例題2

2021-08-16 16:50:04 字數 1534 閱讀 7563

不懂分塊的可以參見部落格:

分塊傳送門

題目描述

給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的元素個數。

輸入格式

第一行輸入乙個數字 n

第二行輸入 n 個數字,第 i 個數字為a[i],以空格隔開

接下來輸入 n 行詢問,每行輸入四個數字 opt, l,r,c, 以空格隔開

若 opt = 0,表示將 [l,r] 的之間的數都加 c

若 opt = 1,表示詢問[l,r]中 小於c平方 的數的個數

輸出格式

對於每次詢問,輸出一行乙個數字表示答案

樣例資料

input

4 1 2 2 3

0 1 3 1

1 1 3 2

1 1 4 1

1 2 3 2

output

3 0

2資料規模與約定

n <= 50000,數列中的數和所有答案在 int 範圍內

他們有大佬說要寫二分。。但是我沒寫二分就過了。。。

直接上**

#include

using

namespace

std;

inline

int read()

const

int maxn=50020;

int n,a[maxn],delta[maxn],p[maxn];

int opt,l,r,c,q;

void init()

}void add()

void query()

int main()

else

}return

0;}

#include

using namespace std;

inline int

read()

const int maxn=50020;

int n,a[maxn],p[maxn],delta[maxn],b[maxn];

int opt,l,r,c,q;

void init()

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

sort(b+(i-1)*q+1,b+i*q+1);

if(n%q!=0)

sort(b+p[n]*q-q+1,b+n+1);

}void add()

for(int i=p[l]+1;iint dichotomia(int l,int r)//二分

if(b[r]+delta[p[r]]return r-t;

return l-t;

}void query()

int main()

else

}return

0;}

分塊 基礎,(例題)HDU1556

把乙個長度為a序列分成a 份,對於每乙個塊分別進行處理,對於一些沒有完全覆蓋乙個塊的情況,我們暴力處理就可以了,這是乙個根號級別的演算法 感覺好難解釋啊qaq 與區間修改,區間查詢有關係的一些問題,但是要維護的值不能合併,這個時候就可以用分塊了 或者確定用分塊不會超時,然後又比較懶233 probl...

數列分塊入門2

題目鏈結 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 的元素個數。根據數列分塊入門1的思想,把n個數分為根號n塊,不完整塊的去暴力求和和查詢,完整塊用加法標進行標記,查詢排序後進行二分查詢。include include include include inc...

數列分塊入門 2

題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的元素個數。輸入格式 第一行輸入乙個數字n。第二行輸入n個數字,第i個數字為ai,以空格隔開。接下來輸入n行詢問,每行輸入四個數字 opt l r c,以空格隔開。若opt 0 表示將位於 l,r 的之間的數字都加...