LOJ 6283 數列分塊入門 7

2022-05-02 11:48:09 字數 1975 閱讀 9100

記憶體限制: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] 的之間的數字都乘 ccc。

若 opt=2\mathrm = 2opt=2,表示詢問 ara_ra​r​​ 的值 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,−2​31​​≤others、ans≤231−1 \mathrm \leq 2^-1ans≤2​31​​−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 ...