【bzoj4597】 [Shoi2016]随机序列
#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]随机序列的更多相关文章
- BZOJ4597 SHOI2016随机序列(线段树)
先考虑题目所说的太简单了的问题.注意到只要把加减号相取反,就可以得到一对除了第一项都互相抵消的式子.于是得到答案即为Σf(i)g(i),其中f(i)为前缀积,g(i)为第i个数前面所有符号均填乘号,第 ...
- BZOJ4597: [Shoi2016]随机序列
Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...
- 【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]随机序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 ...
- [洛谷P4340][SHOI2016]随机序列
题目大意:有$n(n\leqslant10^5)$个数,每两个数之间可以加入$+-\times$三种符号,$q(q\leqslant10^5)$次询问,每次询问修改一个数后,所有表达式可能的值的和 题 ...
- SHOI2016 随机序列
给你一个数列,在相邻两个数之间插入加号,减号或乘号 每次支持单点修改,求所有这样可以得到的表达式之和,膜1e9 + 7 sol: 我是个 sb ... 可以发现,如果某位置出现了加号,后面一定有一个减 ...
- bzoj 4597||洛谷P4340 [Shoi2016]随机序列
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 https://www.luogu.org/problemnew/show/P4340 妄图 ...
随机推荐
- RabbitMQ 基础概念介绍
AMQP 消息模型 RabbitMQ 是基于 AMQP(高级消息队列协议)的一个开源实现,其内部实际也是 AMQP 的基本概念.
- 第2节 mapreduce深入学习:12、reducetask运行机制(多看几遍)
ReduceTask的运行的整个过程 背下来1.启动线程到mapTask那里去拷贝数据,拉取属于每一个reducetask自己内部的数据2.数据的合并,拉取过来的数据进行合并,合并的过程,有可能在内存 ...
- Myeclipse下载
地址:http://www.jb51.net/softs/593889.html#download
- seq2seq(1)- EncoderDecoder架构
零 seq2seq是从序列到序列的学习过程,最重要的是输入序列和输出序列是可变长的,这种方式就非常灵活了,典型的机器翻译就是这样一个过程. 一 最基本的seq2seq网络架构如下所示: 可以看到,en ...
- CF792E Colored Balls
题目大意:将n个数分解成若干组,如4 = 2+2, 7 = 2+2+3,保证所有组中数字之差<=1. 首先我们能想到找一个最小值x,然后从x+1到1枚举并check,找到了就输出.这是40分做法 ...
- C#基础学习(二)
---恢复内容开始--- 面向对象 (类是不占内存,实例占内存) C#与python不用可以直接从另一个文件直接实例化一个类,不需要导包: ...
- 合并多个MP4文件
把多个MP4文件连接起来的方法与音频文件不太一样,比较有效的方法是: $ cat mylist.txt file '/path/to/file1' file '/path/to/file2' file ...
- 杭电 2124 Repair the Wall(贪心)
Description Long time ago , Kitty lived in a small village. The air was fresh and the scenery was ve ...
- 动态规划之最长公共子序列(LCS)
在字符串S中按照其先后顺序依次取出若干个字符,并讲它们排列成一个新的字符串,这个字符串就被称为原字符串的子串 有两个字符串S1和S2,求一个最长公共子串,即求字符串 ...
- [NOIP2008] 提高组 洛谷P1125 笨小猴
题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最 ...