題目描述
給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的元素個數。
輸入格式
第一行輸入乙個數字n。
第二行輸入n個數字,第i個數字為ai,以空格隔開。
接下來輸入n行詢問,每行輸入四個數字 opt、l、r、c,以空格隔開。
若opt=0 ,表示將位於 [l,r] 的之間的數字都加 。
若 opt=1,表示詢問 [l,r] 中,小於 c^2 的數字的個數。
輸出格式
對於每次詢問,輸出一行乙個數字表示答案。
樣例樣例輸入
41 2 2 3
0 1 3 1
1 1 3 2
1 1 4 1
1 2 3 2
樣例輸出30
2資料範圍與提示
對於100%的資料,
1≤n≤50000,
-2^31 ≤ others、ans ≤ 2^31-1
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
// tip: belong[i]=(i-1)/sz+1; //sz指每一塊的大小
int a[
500010];
int belong[
100010];
int sz;
int atag[
100010];
int ans;
vector<
int> g[
500010];
//g[i]指第i塊
int n;
void
reset
(int x)
void
add(
int l,
int r,
int c)
for(
int i = belong[l]+1
; i <= belong[r]-1
; i++)}
intinquire
(int l,
int r,
int c)
if(belong[l]
!= belong[r]);
}for
(int i = belong[l]+1
; i <= belong[r]-1
; i++
)return ans;
}int
main()
memset
(atag,0,
sizeof
(atag));
for(
int i =
1; i <= belong[n]
; i++
)sort
(g[i]
.begin()
, g[i]
.end()
);//排序好序才能進行二分查詢
while
(m--
)else
if(opt ==1)
}}return0;
}
數列分塊入門2
題目鏈結 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 的元素個數。根據數列分塊入門1的思想,把n個數分為根號n塊,不完整塊的去暴力求和和查詢,完整塊用加法標進行標記,查詢排序後進行二分查詢。include include include include inc...
數列分塊入門 2
這道題他們說不用分塊就用平衡樹,所以暴力拆解就用分塊。做了兩道分塊已經漸漸明白分塊的一些模板在這裡就放一下吧 用vector比用陣列md方便多了 1 void 修改操作 查詢操作 int l,int r.int val 修改的要素 2 8if l 和 r 不在同乙個區間 就把 r 所在的角區間列舉修...
6278 數列分塊入門 2
題目描述 給出乙個長為 nn 的數列,以及 nn 個操作,操作涉及區間加法,詢問區間內小於某個值 xx 的元素個數。輸入格式 第一行輸入乙個數字 nn。第二行輸入 nn 個數字,第 ii 個數字為 a iai 以空格隔開。接下來輸入 nn 行詢問,每行輸入四個數字 mathrmopt ll rr c...