不懂分塊的可以參見部落格:
分塊傳送門
題目描述
給出乙個長為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 的之間的數字都加...