數列分塊入門 2

2021-10-04 15:04:39 字數 1661 閱讀 8473

題目描述

給出乙個長為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...