LOJ 6278 數列分塊入門 2

2021-09-07 16:50:31 字數 1770 閱讀 5729

記憶體限制:256 mib時間限制:500 ms標準輸入輸出

題目型別:傳統評測方式:文字比較

上傳者: hzwer

提交提交記錄

統計討論

測試資料

題目描述

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

輸入格式

第一行輸入乙個數字 nnn。

第二行輸入 nnn 個數字,第 i 個數字為 aia_ia​i​​,以空格隔開。

接下來輸入 nnn 行詢問,每行輸入四個數字 opt\mathrmopt、lll、rrr、ccc,以空格隔開。

若 opt=0\mathrm = 0opt=0,表示將位於 [l,r][l, r][l,r] 的之間的數字都加 ccc。

若 opt=1\mathrm = 1opt=1,表示詢問 [l,r][l, r][l,r] 中,小於 c2c^2c​2​​ 的數字的個數。

輸出格式

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

樣例樣例輸入

4

1 2 2 3

0 1 3 1

1 1 3 2

1 1 4 1

1 2 3 2

樣例輸出

3

02

資料範圍與提示

對於 100% 100\%100% 的資料,1≤n≤50000,−231≤others 1 \leq n \leq 50000, -2^ \leq \mathrm1≤n≤50000,−2​31​​≤others、ans≤231−1 \mathrm \leq 2^-1ans≤2​31​​−1。

對於區間和我們可以按照正常思路做。

對於第二個詢問,我們可以用vector維護每個塊內的有序表,

零散的塊直接暴力,否則在vector內二分

注意vector的編號是從0開始的

#include#include

#include

#include

#include

using

namespace

std;

const

int maxn=1e6+10

;const

int inf=1e8+10

;inline

char

nc()

inline

intread()

while(c>='

0'&&c<='9')

return x*f;

}vector

v[1001];//

用vector儲存分塊後塊內的有序表

intblock,l[maxn],r[maxn],a[maxn],tag[maxn],belong[maxn],n;

void sort(int

p)void intervaladd(int l,int r,int

val)

for(int i=belong[l]+1;i<=belong[r]-1;i++) tag[i]+=val;

}int query(int l,int r,int

val)

return

ans;

}int

main()

return0;

}

LOJ 6278 數列分塊入門 2

題意 給出乙個長為 n 的數列,以及 n個操作,操作涉及區間加法,詢問區間內小於某個值 x的元素個數。思路 這裡有兩種操作,一種是區間加法,這在上一部落格已經介紹過了,不會的戳這裡,還有一種是區間查詢,因為每次查詢的數字都是不一樣的,所以要想時間最優化,必須要排序,因為排序後的查詢操作可以達到log...

loj 6278 數列分塊入門 2

題目 區間修改,詢問區間小於c的個數。分塊排序,用vector。至於那個塊的大小,好像要用到均值不等式 我不太會。就開始乙個個試,發現siz sqrt n 4時最快!明天去學一下算分塊複雜度的方法。include include include include include using names...

LOJ 6278 數列分塊入門 2

解題思路 分塊維護區間遞增序列。對於修改,邊界暴力後修改兩個邊界的遞增串行使其正確,完整塊打標記 對於詢問,邊界暴力 塊內二分 修改的複雜度 o sqrt n 2 sqrt n log sqrtn 詢問複雜度 o sqrt n 2 sqrt n 所以整體大概是 o q sqrt n log sqrt...