【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 妄图 ...
随机推荐
- thinkphp5验证码处理
1.确定项目目录>vendor>topthink>think-captcha目录存在 2.在config中添加验证码配置 //验证码配置 'captcha' => [ // 验 ...
- 五、面向切面的spring(1)
spring的依赖注入看完了,接下来是spring中与DI一并重要的AOP了,开始吧,GO. 在软件开发中,散布于应用中多处的功能被称为横切发关注点,通常来讲,这些横切关注点从概念上市与应用的业务逻辑 ...
- Elasticsearch入门和基本使用
1. 什么是Elasticsearch? Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统:Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开 ...
- extjs动态添加列
可以根据日期,动态的插入一列 controller层: StdDayWordQuery:function(btn,event){ var form=Ext.getCmp('queryFormSDW') ...
- C++链表STL
#include <iostream> #include <list> #include <algorithm> #include <stdlib.h> ...
- 微信小程序 设置计时器(setInterval)、清除计时器(clearInterval)
1.wxml代码 <!--index.wxml--> <view class="container"> <button type='primary' ...
- 自动清除日期目录shell脚本
很多时候备份通常会使用到基于日期来创建文件夹,对于这些日期文件夹下面又有很多子文件夹,对于这些日期文件整个移除,通过find结合rm或者delete显得有些力不从心.本文提供一个简单的小脚本,可以嵌入 ...
- PHP:POST OR GET 请求
文章来源:http://www.cnblogs.com/hello-tl/p/7685216.html /** * 模拟提交参数,支持https提交 可用于各类api请求 * @param strin ...
- 78-DeMarker,价格波动指数.(2015.7.1)
DeMarker 价格波动指数 观井映天 2015.7.1
- Jackson入门
Jackson 框架,轻易转换JSON Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象. 前面有介绍过json-lib这个框架,在 ...