LibreOJ 6283 數列分塊入門 7

2021-09-20 07:14:33 字數 2748 閱讀 3240

題意:給你乙個n

nn個整數的序列a

aa,讓你進行三種操作:

分析:這裡顯而易見的是,如果我們分塊,那麼需要兩個標記來儲存加法標記和乘法標記,那麼這裡有個關鍵問題,就是順序,順序不同結果不同;我們修改的時候是有順序的,而我們對於標記的操作,到最後是統一修改的,並不考慮乘法和加法的順序;

假設這裡有乙個數t

tt,那麼它所在塊有乘法標記x

+x_+

x+​及加法標記x

∗x_*

x∗​,那麼對於t

tt經乘法與加法的若干次運算,我們以t=t

∗x∗+

x+

t=t*x_*+x_+

t=t∗x∗

​+x+

​當作結果(先加後乘很難處理)(即此時的乘法和加法標記);

如果是先有加法x+′

x_^x+

′​再有乘法標記x∗′

x_^x∗

′​,那麼我們就有t=(

t∗x∗

+x++

x+′)

∗x∗′

t=(t*x_*+x_++x_^)*x_^

t=(t∗x

∗​+x

+​+x

+′​)

∗x∗′

​,如果先有乘法x∗′

′x_^

x∗′′

​,再有加法x+′

′x_^

x+′′

​,那麼我們有t=(

t∗x∗

+x+)

∗x∗′

′+x+

′′

t=(t*x_*+x_+)*x_^+x_^

t=(t∗x

∗​+x

+​)∗

x∗′′

​+x+

′′​,對比一下發現乘法標記都是相同的(即是此時修改的乘法標記乘上原來的乘法標記),而對於加法標記則不一樣,前者是(x+

+x+′

)∗x∗

′(x_++x_^)*x_^

(x+​+x

+′​)

∗x∗′

​,後者是x+∗

x∗′′

+x+′

′x_+*x_^+x_^

x+​∗x∗

′′​+

x+′′

​;前面是先加,後面是先乘,即對於後進行的乘法操作,我們將之前的加法標記乘上這個乘法標記;

總結一下,它即是這樣的,對於乘法操作,我們之前有標記mut

iply

mutiply

mutipl

y,加法有標記add

addad

d,如果下一部進行加法操作a

aa,我們就直接add

+=

aadd+=a

add+=a

來更新,若是乘法操作m

mm,我們就mut

iply

∗=m,

add∗

=m

mutiply*=m,add*=m

mutipl

y∗=m

,add

∗=m來更新;

這題還需要注意取餘,在暴力修改的時候要注意取餘,不然會wa(發現了負數的存在);

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define inf 0x7f7f7f7f

#define maxn 100050

#define n 100100

#define p 2

typedef

long

long ll;

typedef

struct

edge;

edge e[2]

;int cnt, head[1]

;inline

void

add1

(int u,

int v,

int w)

inline

void

write

(int x)

inline

intread()

while

(c >=

'0'&& c <=

'9')

return x * f;

}int opt, l, r, c, sz, n, pos[maxn]

;ll a[maxn]

, mu[maxn]

, ad[maxn]

;// vectorvec[505];

void

update

(int l,

int r,

int val1,

int val2)

if(pl != pr)

}for

(int i = pl +

1; i < pr; i++)}

;ll query

(int x)

intmain()

for(

int i =

1; i <= n; i++

)return0;

}

我們堅持一件事情,並不是因為這樣做了會有效果,而是堅信,這樣做是對的。

——哈維爾

LOJ 6283 數列分塊入門 7

區間加,區間乘,單點查詢。跟線段樹的差不多,為了避免精度問題要先乘再加。區別也和其他的差不多,殘塊暴力。然後就沒什麼了。scanf讀int要 1 include2 include3 include4 include5 using namespace std 6const int mod 10007 ...

LOJ 6283 數列分塊入門 7

記憶體限制 256 mib時間限制 500 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 hzwer 提交提交記錄 統計討論 測試資料 題目描述 給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間乘法,區間加法,單點詢問。輸入格式 第一行輸入乙個數字 nnn。第二行輸入 ...

LibreOJ 6279 數列分塊入門 3

題意 給你乙個n nn個整數的序列a aa,讓你進行兩種操作 分析 這裡用分塊 與第二題相似,查詢前驅我們同樣需要排序,不過這裡可能會想到這樣的情況,即對於查詢x xx前驅,如果查詢區間內有多個x,這樣顯然直接二分是不行的,即我們需要去重,或者統計區間內每個元素的個數,這裡便用到了set setse...