BZOJ4597: [Shoi2016]随机序列
Description
Input
Output
Sample Input
9384 887 2778 6916 7794
2 8336
5 493
3 1422
1 28
4 60
Sample Output
252923708
942282590
228728040
608998099
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
return x*f;
}
typedef long long ll;
const int maxn=100010;
const int mod=1000000007;
ll pow(ll n,int m) {
ll ans=1;
for(;m;m>>=1,(n*=n)%=mod) if(m&1) (ans*=n)%=mod;
return ans;
}
int n,q,A[maxn],xp[maxn];
ll pown,inv3,sumk[maxn<<2],sumv[maxn<<2];
void maintain(int o,int l,int r) {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
sumk[o]=sumk[lc]*sumk[rc]%mod;
sumv[o]=(sumv[lc]+sumv[rc]*xp[mid-l+1]%mod*sumk[lc])%mod;
}
void build(int o,int l,int r) {
if(l==r) sumk[o]=A[l],sumv[o]=A[l]*pown%mod;
else {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
build(lc,l,mid);build(rc,mid+1,r);
maintain(o,l,r);
}
}
void update(int o,int l,int r,int p) {
if(p==n) {A[n]=read();return;}
if(l==r) sumk[o]=read(),sumv[o]=sumk[o]*pown%mod;
else {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
if(p<=mid) update(lc,l,mid,p);
else update(rc,mid+1,r,p);
maintain(o,l,r);
}
}
int main() {
n=read();q=read();xp[0]=1;inv3=pow(3,mod-2);pown=pow(3,n-2);
rep(i,1,n) A[i]=read(),xp[i]=xp[i-1]*inv3%mod;
build(1,1,n-1);
rep(i,1,q) {
update(1,1,n-1,read());
printf("%lld\n",(sumv[1]*2+sumk[1]*A[n])%mod);
}
return 0;
}
BZOJ4597: [Shoi2016]随机序列的更多相关文章
- BZOJ4597 SHOI2016随机序列(线段树)
先考虑题目所说的太简单了的问题.注意到只要把加减号相取反,就可以得到一对除了第一项都互相抵消的式子.于是得到答案即为Σf(i)g(i),其中f(i)为前缀积,g(i)为第i个数前面所有符号均填乘号,第 ...
- 【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和 ...
- 【bzoj4597】 [Shoi2016]随机序列
可以发现加减号之间可以互相抵消. 真正加到答案里的只有一些前缀积. 记s[i]为a[1]*a[2]*a[3]...*a[i].那s[i]在答案中出现的次数就是2*3^(n-i-1); 修改一个数只会对 ...
- [洛谷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 妄图 ...
随机推荐
- xml编辑器
cstring转cha型方法在mfc中用过可行 int CstringToch(CString str, char *ch) { assert(ch); memset(ch, 0, sizeof(ch ...
- airflow 部署
环境 : ubuntu 14.04 LTS python 2.7 script: 设置环境变量: export AIRFLOW_HOME=~/airflow 安装相关依赖包: sudo apt-get ...
- 完美解决window.navigator.geolocation.getCurrentPosition,在IOS10系统中无法定位问题
目前由于许多用户都将电话升级到了iOS系统,苹果的iOS 10已经正式对外推送,相信很多用户已经更新到了最新的系统.然而,如果web站没有及时支持https协议的话,当很多用户在iOS 10下访问很多 ...
- dell md3200i mdss (企业管理) 安装的那点事儿
首先获取安装包,解压后如图: 我是在windows 机上安装,所以执行windows 文件夹下的可执行程序: 双击红箭头文件,进行安装,步骤截图如下: 出现最后这个界面,就说明安装成功,直接重启系统就 ...
- 关于清除arp 缓存的那点事儿
在Linux下,清除arp缓存表,例如: arp -d 10.0.3.6 我们可以用上面这条命令清除某一条记录,也可以用 arp -n |awk '/^[1-9]/{print "arp - ...
- Sublime 3 如何设置xftp 排除文件夹“bower_components”,“node_modules”
“bower_components”,“node_modules”这个文件夹,作为模块得引用文件,不需要下载本地进行编码,这里得文件非常多,若是不把这个两个文件夹排除掉掉话,通过xftp下载所有文件的 ...
- gdb 调试多线程
基本i threads 等操作略过,只谈线程同步.异步控制: 先点到,gdb attach到主线程t1 时,所有线程都会停止,所谓同步异步效果,是指在apply continue到所有线程之后, 再切 ...
- Ubuntu安装Mysqlcluster集群
可参考:http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%92%8C ...
- MFC如何读取XML
<?xml version="1.0" encoding="utf-8"?> <Cases> <case> <No&g ...
- wireshark使用方法总结
Wireshark基本用法 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口. ...