题目

P4340 [SHOI2016]随机序列

思维好题

做法

是否觉得水在于你是否发现加减是会抵消的,所以我们只用考虑乘的部分

一块乘只能前面无号(也就是前缀形式)才统计,所以用线段树维护区间前缀乘就行了

My complete code

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL maxn=3000000,p=1e9+7;
inline LL Read(){
LL x(0),f(1);char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
inline LL Pow(LL base,LL b){
LL ret(1);
while(b){
if(b&1) ret=ret*base%p;
base=base*base%p,b>>=1;
}return ret;
}
LL root,nod,n,m,a[maxn];
LL lazy[maxn],sum[maxn],s[maxn],pw[maxn],son[maxn][2];
void Build(LL &now,LL l,LL r){
now=++nod; lazy[now]=1;
if(l==r){
if(l!=n)
sum[now]=s[l]*2*pw[n-l-1]%p;
else sum[now]=s[l];
return;
}
LL mid(l+r>>1);
Build(son[now][0],l,mid),Build(son[now][1],mid+1,r);
sum[now]=(sum[son[now][0]]+sum[son[now][1]])%p;
}
inline void Pushdown(LL now){
LL lc(son[now][0]),rc(son[now][1]);
if(lazy[now]!=1){
lazy[lc]=lazy[lc]*lazy[now]%p;
lazy[rc]=lazy[rc]*lazy[now]%p;
sum[lc]=sum[lc]*lazy[now]%p,sum[rc]=sum[rc]*lazy[now]%p;
lazy[now]=1;
}
}
void Change_m(LL now,LL l,LL r,LL lt,LL rt,LL val){
if(lt<=l&&rt>=r){
sum[now]=sum[now]*val%p;
lazy[now]=lazy[now]*val%p;
return;
}Pushdown(now);
LL mid(l+r>>1);
if(lt<=mid) Change_m(son[now][0],l,mid,lt,rt,val);
if(rt>mid) Change_m(son[now][1],mid+1,r,lt,rt,val);
sum[now]=(sum[son[now][0]]+sum[son[now][1]])%p;
}
int main(){
n=Read(),m=Read();
s[0]=pw[0]=1;
for(LL i=1;i<=n;++i)
a[i]=Read()%p,
s[i]=s[i-1]*a[i]%p,
pw[i]=pw[i-1]*3%p;
Build(root,1,n);
while(m--){
LL x(Read()),val(Read());
Change_m(root,1,n,x,n,val*Pow(a[x],p-2)%p);
a[x]=val;
printf("%lld\n",sum[root]);
}return 0;
}

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

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

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

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

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

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

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

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

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

  5. BZOJ4597: [Shoi2016]随机序列

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

  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. SHOI2016 随机序列

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

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

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

随机推荐

  1. Cocos2dx 场景切换动画

    1.http://www.cnblogs.com/linux-ios/archive/2013/04/09/3009292.html

  2. struts-config.xml 文件:

    struts-config.xml配置文件是一个在Web客户端组件的视图和模型之间的联系,但你的项目的99.99就不会碰这些设置%.基本的配置文件包含以下主要内容: SN Interceptor &a ...

  3. git commit --amend用法

    提交信息很长时间内会一直保留在你的代码库(code base)中,所以你肯定希望通过这个信息正确地了解代码修改情况. 下面这个命令可以让你编辑最近一次的提交信息,但是你必须确保没有对当前的代码库(wo ...

  4. Android无线测试之—UiAutomator UiDevice API介绍三

    获取坐标与坐标点击 一.坐标相关的知识: 1)手机屏幕坐标:左上角开始到右下角结束 2)DP:设备独立像素,例如320像素显示到640像素上要拉伸一倍 3)Point:代表一个点(x,y),左上角的坐 ...

  5. hdu 1853 (费用流 拆点)

    // 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...

  6. hihocoder 1279(状压)

    坑爹的题目.不过不能说不是一道挺好的题目. 坑主要坑在,妹的我一样的复杂度,写的姿势略差了点然后就一直超时. 比赛的时候我还直接就看错题目,把AND运算看成了OR...还敲完交了一发. 这题很容易想到 ...

  7. 【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流

    [BZOJ1930][Shoi2003]pacman 吃豆豆 Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会 ...

  8. 如何理解Comparator接口中的升降序?

    import java.util.*; class DescType implements Comparator { public int compare(Object o1, Object o2) ...

  9. 编译java-cef

    javacef即java Chromium Embedded Framework,其功能是通过在java应用中嵌入谷歌浏览器内核Chromium. 编译java-cef的过程可参考以下文档及视频: h ...

  10. Python3 面向对象(1)

    面向.概述 面向过程: 根据业务逻辑从上到下写垒代码面向过程的设计的核心是过程,过程即解决问题的步骤, 面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西 优点: 极大降低了程序的 ...