題意:給你乙個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...