SHOI2016 隨機序列

2022-05-22 20:45:09 字數 1158 閱讀 8291

給你乙個數列,在相鄰兩個數之間插入加號,減號或乘號

每次支援單點修改,求所有這樣可以得到的表示式之和,膜1e9 + 7

sol:

我是個 sb 。。。

可以發現,如果某位置出現了加號,後面一定有乙個減號把它消掉,於是答案就是一些出現了好幾次的字首積之和

算一下每段字首積的貢獻即可

#include#define int long long

using

namespace

std;

inline

intread()

intn,q;

const

int mod = 1e9 + 7,maxn = 1e5 + 10

;int

a[maxn],fac[maxn];

#define ls (x << 1)

#define rs ((x << 1) | 1)

int seg[maxn << 2],tag[maxn << 2

];inline

int pw(int x,int

t)

return

res;

}inline

void build(int x,int l,int

r)

}inline

void pushdown(int x,int l,intr)}

inline

void update(int x,int l,int r,int l,int r,int

val)

pushdown(x,l,r);

int mid = (l + r) >> 1

;

if(l <=mid)update(ls,l,mid,l,r,val);

if(r > mid)update(rs,mid + 1

,r,l,r,val);

seg[x] = (seg[ls] + seg[rs]) %mod;

}signed main()

build(

1,1,n);

while(q--)

}

view code

$$\sum_^sum_i \times 2 \times 3^ + sum_n$$

$sum$ 陣列為字首積

SHOI2016 隨機序列 (線段樹)

你的面前有 n 個數排成一行,分別為 a a a a 你打算在每相鄰的兩個 a 和 a 間都插入乙個加號 減號或者乘號。那麼一共有 3 種可能的表示式。你對所有可能的表示式的值的和非常感興趣。但這畢竟太簡單了,所以你還打算支援乙個修改操作,可以修改某個 a 的值。你能夠編寫乙個程式對每個修改都輸出修...

BZOJ 4597 Shoi2016 隨機序列

很可做的一道題 考慮一下一段序列的答案為b x,x為最右連續一段是乘積,然後和為x,b則為對應的左邊的和 然後考慮在右邊加乙個數k,分類討論一下發現x kx,b 2x 3b 於是就可以dp了 然後dp可以矩陣轉移 於是就可以用線段樹維護矩陣 就水過去了 好像很簡單哎,ac率好高的說 include ...

BZOJ4597 Shoi2016 隨機序列

bzoj4597 一開始看題一臉不可做的樣子。肯定又有什麼鬼畜的結論qa q 看看題解之後 和加減沒什麼關係。維護一下字首積的和就好了。qa q 然後自己拿n 3 手寫試了一發。md為什麼不自己想。an s i 1n 1 2 3n i 1 j 1i ai j 1 nai 線段樹維護一下就好了嘛。然後...