SHOI2016 随机序列
给你一个数列,在相邻两个数之间插入加号,减号或乘号
每次支持单点修改,求所有这样可以得到的表达式之和,膜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 随机序列的更多相关文章
- 【BZOJ4597】[Shoi2016]随机序列 线段树
[BZOJ4597][Shoi2016]随机序列 Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者减号 ...
- P4340 [SHOI2016]随机序列
题目 P4340 [SHOI2016]随机序列 思维好题 做法 是否觉得水在于你是否发现加减是会抵消的,所以我们只用考虑乘的部分 一块乘只能前面无号(也就是前缀形式)才统计,所以用线段树维护区间前缀乘 ...
- BZOJ 4597: [Shoi2016]随机序列
4597: [Shoi2016]随机序列 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 255 Solved: 174[Submit][Status ...
- BZOJ4597: [Shoi2016]随机序列
Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...
- [洛谷P4340][SHOI2016]随机序列
题目大意:有$n(n\leqslant10^5)$个数,每两个数之间可以加入$+-\times$三种符号,$q(q\leqslant10^5)$次询问,每次询问修改一个数后,所有表达式可能的值的和 题 ...
- BZOJ4597:[SHOI2016]随机序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 ...
- BZOJ4597 SHOI2016随机序列(线段树)
先考虑题目所说的太简单了的问题.注意到只要把加减号相取反,就可以得到一对除了第一项都互相抵消的式子.于是得到答案即为Σf(i)g(i),其中f(i)为前缀积,g(i)为第i个数前面所有符号均填乘号,第 ...
- bzoj 4597||洛谷P4340 [Shoi2016]随机序列
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 https://www.luogu.org/problemnew/show/P4340 妄图 ...
- 【bzoj4597】 [Shoi2016]随机序列
可以发现加减号之间可以互相抵消. 真正加到答案里的只有一些前缀积. 记s[i]为a[1]*a[2]*a[3]...*a[i].那s[i]在答案中出现的次数就是2*3^(n-i-1); 修改一个数只会对 ...
随机推荐
- ios 推送 证书配置
S的推送证书,有有效期限制,一般为一年.当我们证书过期的时候,就需要重新生成证书了.有一段时间没有上苹果网站了,昨天上去一看,此奥,改版了,下边我们将重新生成一个正式环境的push推送的证书. 1.先 ...
- pycharm的安装和破解
前提: 为了学习爬虫,单独下载了一个pycharm编辑器,所以就有了这篇文章,和PHPstorm的安装和破解及其类似, 如有想了解PHPstorm的安装破解可参考我的另一篇博文:http://www. ...
- Unity3d 中文菜单
- ACboy needs your help(简单DP)
HDU 1712 Problem Description ACboy has N courses this term, and he plans to spend at most M days on ...
- Ogbect对象转换为泛型对象
相信很多人都自己写个这个转换的方法,再次附上我自己的写转换方法仅供参考. T t = BeanUtil.dbObject2Bean(obj, tClass); public static <T& ...
- WCF基础之Message类
客户端和服务端的通信都是通过接收和发送的Message实例建立起来的,大多数情况我们通过服务协定.数据协定和消息协定来构造传入和传出消息的. 一般什么时候使用Message类呢?不需要将消息序列化或者 ...
- MySQL登陆数据库
下面是几种登陆到MySql数据库的登陆方式代码 1mysql -u root -ppassword 2.mysql -u root -p Enter password:password3.mysql ...
- Python日期和时间
日期和时间主要有两个库,datetime和time. datetime: 日期:datetime.date.today() 日期和时间:datetime.datetime.now() 1000天之后: ...
- Django——form组件is_valid校验机制
#先来归纳一下整个流程#(1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase#(2)接着分析errors.里面判断_errors是都为空,如果为空返回self. ...
- 培训笔记——Linux目录说明
一般我们的电脑里都只有一块硬盘,但是这块硬盘怎么使用呢? 我们的头脑里大体有个分区的概念,为什么要分区呢? 不是很清楚,不过有句话说 不要把鸡蛋放在同一个篮子里,可能有这种考虑吧. 好,最起码知道分区 ...