給你乙個數列,在相鄰兩個數之間插入加號,減號或乘號
每次支援單點修改,求所有這樣可以得到的表示式之和,膜1e9 + 7
sol:
我是個 sb 。。。
可以發現,如果某位置出現了加號,後面一定有乙個減號把它消掉,於是答案就是一些出現了好幾次的字首積之和
算一下每段字首積的貢獻即可
#include#define int long longview codeusing
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--)
}
$$\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 線段樹維護一下就好了嘛。然後...