P4340 [SHOI2016]随机序列
题目
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]随机序列的更多相关文章
- bzoj 4597||洛谷P4340 [Shoi2016]随机序列
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 https://www.luogu.org/problemnew/show/P4340 妄图 ...
- [洛谷P4340][SHOI2016]随机序列
题目大意:有$n(n\leqslant10^5)$个数,每两个数之间可以加入$+-\times$三种符号,$q(q\leqslant10^5)$次询问,每次询问修改一个数后,所有表达式可能的值的和 题 ...
- 【BZOJ4597】[Shoi2016]随机序列 线段树
[BZOJ4597][Shoi2016]随机序列 Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者减号 ...
- 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) 种可能的表 ...
- 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个数前面所有符号均填乘号,第 ...
- SHOI2016 随机序列
给你一个数列,在相邻两个数之间插入加号,减号或乘号 每次支持单点修改,求所有这样可以得到的表达式之和,膜1e9 + 7 sol: 我是个 sb ... 可以发现,如果某位置出现了加号,后面一定有一个减 ...
- 【bzoj4597】 [Shoi2016]随机序列
可以发现加减号之间可以互相抵消. 真正加到答案里的只有一些前缀积. 记s[i]为a[1]*a[2]*a[3]...*a[i].那s[i]在答案中出现的次数就是2*3^(n-i-1); 修改一个数只会对 ...
随机推荐
- php 字符串截取
$str="3,22,11,444,33,1,3455,33,22,444,55,66,77,88,99,554336,"; echo substr($str,0,strlen($ ...
- 如何解决HTML在各种浏览器的兼容性
方法/步骤 不同浏览器对HTML标记所具有的内外边距属性具有不同的定义. 因此如果想消除这种差距,应该在相应的CSS部分加入以下CSS代码: *{margin:0px;padding:0px;} 借于 ...
- libsvm easy.py ValueError: need more than 0 values to unpack windows下终极解决
现象是: python easy.py train test 输出: Scaling training data...WARNING: original #nonzeros 100389 new #n ...
- metadata简介
元资料(Metadata),又称元数据.诠释资料.中继资料后设资料,为描述资料的资料(data about data),主要是描述资料属性(property)的资讯,用来支持如指示储存位置.历史资料. ...
- GOCR v0.50 原理分析
一,简介: GOCR是一个c写的开源OCR库,GNU Public License,作者:Joerg Schulenburg 项目主页:http://jocr.sourceforge.net/inde ...
- Eclipse调试部分手机不显示日志问题解决
在拨号键盘输入一串指令,然后会进入到工程模式,最后可以在Log设置里面设置了. 华为:*#*#2846579#*#* 酷派:*20121220#
- HDOJ 4549 M斐波那契数列 费马小定理+矩阵高速幂
MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i ) ( i>=3) mod 1000000007 是质数 , 依据费马小定理 a^phi( p ) = 1 ( ...
- http://www.haolizi.net/example/view_2380.html
null
- pycharn设置git提交代码
1.设置pycharm的git地址 2.设置git地址及本地路径 3.提交代码
- HTML学习笔记——常用元素及其属性(二)
一.HTML表单 -- form标签 -- 与浏览者交互 1.form 标签 -- 代表HTML表单 form标签是成对出现的,以<form>开始,以</form>结束 属性. ...