記憶體限制: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] 的之間的數字都乘 ccc。
若 opt=2\mathrm = 2opt=2,表示詢問 ara_rar 的值 mod 10007mod \ 10007mod10007(lll 和 ccc 忽略)。
輸出格式
對於每次詢問,輸出一行乙個數字表示答案。
樣例樣例輸入
7
1 2 2 3 9 3 2
0 1 3 1
2 1 3 1
1 1 4 4
0 1 7 2
1 2 6 4
1 1 6 5
2 2 6 4
樣例輸出
3
100
資料範圍與提示
對於 100% 100\%100% 的資料,1≤n≤100000,−231≤others 1 \leq n \leq 100000, -2^ \leq \mathrm1≤n≤100000,−231≤others、ans≤231−1 \mathrm \leq 2^-1ans≤231−1。
顯示分類標籤
對於兩種標記,分別進行維護。
按照運算規律(這個可以自己推式子),我們先考慮乘法,再考慮加法
對於加的操作,相當於直接對於每個塊的加法標記加
對於乘的操作,我們需要對乘法標記和加法標記都乘上對應的值
零散塊不好記錄,直接暴力修改
#include#include#include
#include
using
namespace
std;
const
int maxn=1e5+10,mod=10007
;inline
char
nc()
inline
intread()
while(c>='
0'&&c<='9')
return x*f;
}int
a[maxn],belong[maxn],l[maxn],r[maxn],block,n;
intmul[maxn],add[maxn];
void reset(int
x)void add(int l,int r,int
val)
for(int i=belong[l]+1;i<=belong[r]-1;i++)
add[i]+=val,add[i]%=mod;
}void mul(int l,int r,int
val)
for(int i=belong[l]+1;i<=belong[r]-1;i++)
mul[i]*=val,add[i]*=val,mul[i]%=mod,add[i]%=mod;
}int
main()
return0;
}
LOJ 6283 數列分塊入門 7
區間加,區間乘,單點查詢。跟線段樹的差不多,為了避免精度問題要先乘再加。區別也和其他的差不多,殘塊暴力。然後就沒什麼了。scanf讀int要 1 include2 include3 include4 include5 using namespace std 6const int mod 10007 ...
LibreOJ 6283 數列分塊入門 7
題意 給你乙個n nn個整數的序列a aa,讓你進行三種操作 分析 這裡顯而易見的是,如果我們分塊,那麼需要兩個標記來儲存加法標記和乘法標記,那麼這裡有個關鍵問題,就是順序,順序不同結果不同 我們修改的時候是有順序的,而我們對於標記的操作,到最後是統一修改的,並不考慮乘法和加法的順序 假設這裡有乙個...
LOJ 數列分塊入門 1
link 優雅的暴力,對於乙個數列,他不是乙個元素乙個元素處理,而是分成若干塊,成塊成塊的處理,以此達到降低時間複雜度的目的。首先,我們需要處理劃分的塊的大小 block 一般是根號n 塊的數目 每乙個元素對應第幾塊,然後,每一塊的左端點和右端點。完整的塊 更新 我們用lz i lz i lz i ...