BZOJ 4597 随机序列
一定要想到,对于一个空位如果填了+,那么一定有一个表达式这里填-号使得后面的全部抵消掉。这点十分重要。
于是发现这个答案只和前缀积有关,线段树维护即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100500
#define mod 1000000007
using namespace std;
long long n,q,table[maxn],a[maxn],x,y;
long long root,tot=,ls[maxn<<],rs[maxn<<],sum1[maxn<<],sum2[maxn<<];
void get_table()
{
table[]=;
for (long long i=;i<=;i++)
table[i]=(table[i-]*)%mod;
}
void pushup(long long now,long long left,long long right)
{
long long mid=(left+right)>>;
long long ret1,ret2,ret3;
ret1=((sum1[ls[now]]-sum2[ls[now]])+mod);
ret2=sum2[ls[now]];
ret3=sum1[rs[now]];
sum1[now]=(((ret1*table[right-mid])%mod+((ret2*table[right-mid-])%mod*)%mod)%mod+(ret3*ret2)%mod)%mod;
sum2[now]=(sum2[ls[now]]*sum2[rs[now]])%mod;
}
void build(long long &now,long long left,long long right)
{
now=++tot;
if (left==right)
{
sum1[now]=sum2[now]=a[left]%mod;
return;
}
long long mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
pushup(now,left,right);
}
void modify(long long now,long long left,long long right,long long pos,long long x)
{
if (left==right)
{
sum1[now]=sum2[now]=x%mod;
return;
}
long long mid=(left+right)>>;
if (pos<=mid) modify(ls[now],left,mid,pos,x);
else modify(rs[now],mid+,right,pos,x);
pushup(now,left,right);
}
int main()
{
scanf("%lld%lld",&n,&q);
for (long long i=;i<=n;i++)
scanf("%lld",&a[i]);
get_table();
build(root,,n);
for (long long i=;i<=q;i++)
{
scanf("%lld%lld",&x,&y);
modify(root,,n,x,y);
printf("%lld\n",sum1[root]%mod);
}
return ;
}
BZOJ 4597 随机序列的更多相关文章
- BZOJ 4597: [Shoi2016]随机序列
4597: [Shoi2016]随机序列 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 255 Solved: 174[Submit][Status ...
- bzoj 4597||洛谷P4340 [Shoi2016]随机序列
https://www.lydsy.com/JudgeOnline/problem.php?id=4597 https://www.luogu.org/problemnew/show/P4340 妄图 ...
- BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维
Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- Java 8怎么了:局部套用vs闭包
[编者按]本文作者为专注于自然语言处理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主讲 Java 软件开发的书籍,自2008开始供职于 Alcatel-Luce ...
- Delphi美化界面 转载
手头的项目做的差不多了,交给客户,结果给出的结论是界面太难看了,至少要做成像QQ类似的界面.(目前是QQ2009界面确实还是不错的,本人也非常喜欢). 1.透明问题. 要重新调整界面确实很麻烦,以前用 ...
- codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
题目 //参考了网上的代码 注意答案可能超过32位 //要达成目标,就是要所有数列a的都比数列b的要小或者等于 //然后,要使最小的要和最大的一样大,就要移动(大-小)步, //要使较小的要和较大的一 ...
- Java script 看看黑客怎么写的
在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例java script 代码: ($=[$=[ ] ] [(__=!$+$)[_=-~-~-~$] ...
- opal 将ruby代码转化成javascript
点这里 https://github.com/opal Opal Opal is a ruby to javascript source-to-source compiler. It also ...
- POJ 1317
#include <iostream> #include <string> using namespace std; char p_code[] = {'_','a','b', ...
- C# 调用Windows API实现两个进程间的通信
使用Windows API实现两个进程间(含窗体)的通信http://blog.csdn.net/huangxinfeng/article/details/5513608 从C#下使用WM_COPYD ...
- Linux网络编程3——socket
宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...
- JDBC第一次学习
JDBC(Java Data Base Connectivity,java数据库连接),由一些类和接口构成的API,它是J2SE的一部分,由java.sql,javax.sql包组成. 应用程序.J ...
- 545E. Paths and Trees
题目链接 题意:给定一个无向图和一个点u,找出若干条边组成一个子图,要求这个子图中u到其他个点的最短距离与在原图中的相等,并且要求子图所有边的权重之和最小,求出最小值并输出子图的边号. 思路:先求一遍 ...