给你一个数列,在相邻两个数之间插入加号,减号或乘号

每次支持单点修改,求所有这样可以得到的表达式之和,膜1e9 + 7

sol:

我是个 sb 。。。

可以发现,如果某位置出现了加号,后面一定有一个减号把它消掉,于是答案就是一些出现了好几次的前缀积之和

算一下每段前缀积的贡献即可

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
int n,q;
const int mod = 1e9 + ,maxn = 1e5 + ;
int a[maxn],fac[maxn];
#define ls (x << 1)
#define rs ((x << 1) | 1)
int seg[maxn << ],tag[maxn << ];
inline int pw(int x,int t)
{
int res = ;x %= mod;
while(t)
{
if(t & )res = res * x % mod;
x = x * x % mod;
t = t >> ;
}
return res;
}
inline void build(int x,int l,int r)
{
tag[x] = ;
if(l == r)seg[x] = fac[l];
else
{
int mid = (l + r) >> ;
build(ls,l,mid);build(rs,mid + ,r);
seg[x] = (seg[ls] + seg[rs]) % mod;
}
}
inline void pushdown(int x,int l,int r)
{
if(tag[x] != )
{
(tag[ls] *= tag[x]) %= mod;(tag[rs] *= tag[x]) %= mod;
(seg[ls] *= tag[x]) %= mod;(seg[rs] *= tag[x]) %= mod;
tag[x] = ;
}
}
inline void update(int x,int l,int r,int L,int R,int val)
{
if(L <= l && r <= R)
{
(seg[x] *= val) %= mod;
(tag[x] *= val) %= mod;
return;
}
pushdown(x,l,r);
int mid = (l + r) >> ;
if(L <= mid)update(ls,l,mid,L,R,val);
if(R > mid)update(rs,mid + ,r,L,R,val);
seg[x] = (seg[ls] + seg[rs]) % mod;
}
signed main()
{
n = read(),q = read();
for(int i=;i<=n;i++)a[i] = read();
int mul = ;
for(int i=;i<=n;i++)
{
mul = (long long)mul * a[i] % mod;
if(i == n)fac[i] = mul;
else fac[i] = (long long)mul * * pw(, n - i - ) % mod;
}build(,,n);
while(q--)
{
int p = read(),v = read();
update(,,n,p,n,(long long)v * pw(a[p],mod - ) % mod);
a[p] = v;
printf("%lld\n",seg[]);
}
}

$$\sum_{i=1}^{n-1}sum_i \times 2 \times 3^{n-i-1} + sum_n$$

$sum$ 数组为前缀积

SHOI2016 随机序列的更多相关文章

  1. 【BZOJ4597】[Shoi2016]随机序列 线段树

    [BZOJ4597][Shoi2016]随机序列 Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者减号 ...

  2. P4340 [SHOI2016]随机序列

    题目 P4340 [SHOI2016]随机序列 思维好题 做法 是否觉得水在于你是否发现加减是会抵消的,所以我们只用考虑乘的部分 一块乘只能前面无号(也就是前缀形式)才统计,所以用线段树维护区间前缀乘 ...

  3. BZOJ 4597: [Shoi2016]随机序列

    4597: [Shoi2016]随机序列 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 255  Solved: 174[Submit][Status ...

  4. BZOJ4597: [Shoi2016]随机序列

    Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...

  5. [洛谷P4340][SHOI2016]随机序列

    题目大意:有$n(n\leqslant10^5)$个数,每两个数之间可以加入$+-\times$三种符号,$q(q\leqslant10^5)$次询问,每次询问修改一个数后,所有表达式可能的值的和 题 ...

  6. BZOJ4597:[SHOI2016]随机序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4597 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 ...

  7. BZOJ4597 SHOI2016随机序列(线段树)

    先考虑题目所说的太简单了的问题.注意到只要把加减号相取反,就可以得到一对除了第一项都互相抵消的式子.于是得到答案即为Σf(i)g(i),其中f(i)为前缀积,g(i)为第i个数前面所有符号均填乘号,第 ...

  8. bzoj 4597||洛谷P4340 [Shoi2016]随机序列

    https://www.lydsy.com/JudgeOnline/problem.php?id=4597 https://www.luogu.org/problemnew/show/P4340 妄图 ...

  9. 【bzoj4597】 [Shoi2016]随机序列

    可以发现加减号之间可以互相抵消. 真正加到答案里的只有一些前缀积. 记s[i]为a[1]*a[2]*a[3]...*a[i].那s[i]在答案中出现的次数就是2*3^(n-i-1); 修改一个数只会对 ...

随机推荐

  1. 【BZOJ1109】[POI2007]堆积木Klo 二维偏序

    [BZOJ1109][POI2007]堆积木Klo Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔 ...

  2. 爬虫入门【2】Requests库简介

    发送请求 使用Requests发送网络请求很简单 #首先要导入requests库 import requests #返回一个Response对象 r=requests.get('https://git ...

  3. 线段覆盖 2(序列DP)

    Code vs 3027 线段覆盖 2   题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段, ...

  4. StackOverflow&&Quora&&More 翻译系列——目录

    启动了一个翻译系列,主要收录个人在伯乐在线上翻译的文章,或者在 StackOverflow.Quora 及其他资讯站上发现的好文,选文比较偏个人喜好.希望能够学习.理解文章的同时提高英语水平,并共享知 ...

  5. Django redis2 列表 和其他操作

    列表的操作 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush插值至列表最左边 lpush(name,values) # 在name对应的list ...

  6. 云计算服务的三种类型(SaaS、PaaS、IaaS)

    云计算可以帮助企业降低IT方面的成本和复杂性,并获得他们蓬勃发展所需的灵活性与敏捷性.但是,规划出通往云的明确路径并非易事.毕竟用户需要看透与云相关的市场大肆宣传,然后理解并分析不同种类的云计算模式的 ...

  7. python读取文件存到excel中

    用xlwt模块执行代码报下面的错 ValueError: column index (256) not an int in range(256) xlwt 模块看源码说最大列只支持255列,所以超过这 ...

  8. java项目常用架构

    三层架构 : 界面层/表现层 UI 业务逻辑层 BLL 针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理. 数据访问层 DAL 访问数据库 mvc : 而 MVC 是在三层架构的基 ...

  9. 什么是shell【TLCL】

    常用命令 date cal df——report file system disk space usage free——display amount of free and used memory i ...

  10. oracle 从select的结果update其他表

    update a set a.id=(selelct b.id from temp b where b.line = a.line)  where a.line = (select line from ...