可以发现加减号之间可以互相抵消.
真正加到答案里的只有一些前缀积.
记s[i]为a[1]*a[2]*a[3]...*a[i].那s[i]在答案中出现的次数就是2*3^(n-i-1);
修改一个数只会对后面的数有影响.
预处理逆元然后用线段树维护即可.

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100010
#define P 1000000007
using namespace std;
long long t[N<<2],inv[N],a[N],s[N],bin[N],x,p[N<<2];
int n,q,pos;
void build(int k,int l,int r){
int mid=(l+r)>>1;
if (l==r){
if (l!=n) t[k]=(s[l]*bin[n-l-1]*2)%P;
else t[k]=s[l];
return;
}
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
t[k]=(t[k<<1]+t[k<<1|1])%P;
}
void paint(int k,long long v){
t[k]=(t[k]*v)%P;
p[k]=(p[k]*v)%P;
}
void pushdown(int k,int l,int r){
int mid=(l+r)>>1;
paint(k<<1,p[k]);
paint(k<<1|1,p[k]);
p[k]=1;
}
void change(int k,int l,int r,int ll,int rr,long long v){
int mid=(l+r)>>1;
if (ll<=l&&r<=rr){paint(k,v);return;}
if (p[k]!=1) pushdown(k,l,r);
if (ll<=mid) change(k<<1,l,mid,ll,rr,v);
if (mid<rr) change(k<<1|1,mid+1,r,ll,rr,v);
t[k]=(t[k<<1]+t[k<<1|1])%P;
}
int main(){
scanf("%d%d",&n,&q);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
bin[0]=1;
for (int i=1;i<=n;i++) bin[i]=(bin[i-1]*3)%P;
inv[1]=1;
for(int i=2;i<=10000;i++)
inv[i]=(P-(long long)P/i*inv[P%i]%P);
s[1]=a[1];
for (int i=2;i<=n;i++) s[i]=(s[i-1]*a[i])%P;
build(1,1,n);
for (int i=1;i<=n*2;i++) p[i]=1;
for (int i=1;i<=q;i++){
scanf("%d%lld",&pos,&x);
change(1,1,n,pos,n,x*inv[a[pos]]%P);
a[pos]=x;printf("%lld\n",t[1]);
}
}

  

【bzoj4597】 [Shoi2016]随机序列的更多相关文章

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

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

  2. BZOJ4597: [Shoi2016]随机序列

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

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

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

  4. P4340 [SHOI2016]随机序列

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

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

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

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

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

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

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

  8. SHOI2016 随机序列

    给你一个数列,在相邻两个数之间插入加号,减号或乘号 每次支持单点修改,求所有这样可以得到的表达式之和,膜1e9 + 7 sol: 我是个 sb ... 可以发现,如果某位置出现了加号,后面一定有一个减 ...

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

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

随机推荐

  1. SQL Server 兼容级别

    ALTER DATABASE (Transact-SQL) 兼容级别 适用对象:SQL Server(从 2008 版开始)Azure SQL 数据库Azure SQL 数据仓库并行数据仓库 将某些数 ...

  2. 启动myeclipse弹窗Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance

    Please allow Subclipse team to receive anonymous usage statistics for this Eclipse intance(翻译:请允许Sub ...

  3. VM虚拟机中CentOS6.4操作系统安装一

    在 VMware中鼠标单击“编辑虚拟机设置”,在弹出的“虚拟机设置”对话框中的“硬件”标签中选择“CD/DVD(IDE)”,然后在右侧的“CD /DVD(IDE)”连接选项中选择“使用ISO映像文件” ...

  4. 代理模式精讲(手写JDK动态代理)

    代理模式是一种架构型模式,表现出来就是一个类代表另一个类的功能,一般用在想对访问一个类的时候做一些控制,同时又不想影响正常的业务,这种代理模式在现实的生活中应用的也非常的广泛,我用穷举法给举几个好理解 ...

  5. Linux高阶命令进阶

    1. 输出重定向 > (1>):覆盖输出,会覆盖掉原先的文件内容 >> (1>>) :追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加 2> :错误输 ...

  6. js 技巧 (一)

      · 事件源对象 event.srcElement.tagName event.srcElement.type · 捕获释放event.srcElement.setCapture();  event ...

  7. zabbix源码安装后,设置为服务启动和关闭

    zabbix源码安装,使用service启动与关闭服务 1. zabbix客户端的系统服务脚本 1.1 拷贝启动脚本 zabbix的源码提供了系统服务脚本,在/usr/local/src/zabbix ...

  8. node assert.equal()

    浅测试,使用等于比较运算符(==)来比较 actual 和 expected 参数. const assert = require('assert'); assert.equal(1, 1); // ...

  9. C语言学习4

    C/C++语言五大内存分区:堆.栈.自由存储区.全局/静态存储区和常量存储区 栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的存储区,里面的变量通常是全局变量.函数参数等. 堆:就是那些 ...

  10. LeetCode(56)Merge Intervals

    题目 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6], ...