記憶體限制:256 mib時間限制:500 ms標準輸入輸出
題目型別:傳統評測方式:文字比較
上傳者: hzwer
提交提交記錄
統計討論
測試資料
題目描述
給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間加法,詢問區間內小於某個值 *** 的元素個數。
輸入格式
第一行輸入乙個數字 nnn。
第二行輸入 nnn 個數字,第 i 個數字為 aia_iai,以空格隔開。
接下來輸入 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^2c2 的數字的個數。
輸出格式
對於每次詢問,輸出一行乙個數字表示答案。
樣例樣例輸入
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,−231≤others、ans≤231−1 \mathrm \leq 2^-1ans≤231−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...