JZOJ.5231【NOIP2017模拟8.5】序列问题
Description

Input
首先输入n。
接下来输入n个数,描述序列 A。
Output
输出一行一个整数代表答案。
Sample Input
7
0 35 40 45 56 65 94
Sample Output
66636
Data Constraint
对于60%的数据,n<=50000
对于100%的数据,n<=500000,0<=A[i]<=10^9
ST加暴力枚举区间显然过不了,复杂度为O(n2)
考虑分治。对于区间[l,r],我们可以轻易求得[l,mid]和[mid+1,r]的值,关键在于求$\sum_{x\in[l,\,mid],\,y\in[mid+1,\,r]}f(x,\,y)*g(x,\,y)$
我们可以先枚举右端点r,求得每个点i到mid+1的最大值和最小值max[i]和min[i],然后从mid开始右往左枚举每一个左端点j,求得min_l,max_l,然后可以求得右端点中从左到右的第一个大于max_l,第一个小于min_l,的位置i,如图所示
(我们假设min的位置在max位置的左边)
这样右边就被分成三段。
对于第一段(mid-min之间),由于最大值和最小值都是max_l,min_l,所以右端点这一段的值就是min_l*max_l*(min-mid)
对于第二段(min-max之间),由于最大值是max_l,最小值不定,不过我们可以把max_l提取出来,剩下的就是这段区间min_l的和了,所以我们可以用前缀和维护一下。smin[max-1]-smin[min-1]
对于第三段(max-r之间),由于最大值最小值都是不定,但是它们都在mid的右边,我们在分治的时候就已经算好了,直接加上去就好了 。 spul[r]-spul[max-1]
min在max右边同理。
#include<iostream>
#include<cstdio>
#define qaq 1000000007
using namespace std;
const int N=;
long long a[N],minn[N],maxx[N],sminn[N],smaxx[N],spul[N],ans;
int n;
void fz(long long l,long long r){
if (r<l) return;
if (l==r){
ans=(ans+a[l]*a[r])%qaq;
return;
}
long long mid=(l+r)>>;
fz(l,mid);
fz(mid+,r);
minn[mid]=1e12;
maxx[mid]=;
sminn[mid]=;
smaxx[mid]=;
spul[mid]=;
for (int i=mid+;i<=r;i++){
if (a[i]>maxx[i-]) maxx[i]=a[i];
else maxx[i]=maxx[i-];
if (a[i]<minn[i-]) minn[i]=a[i];
else minn[i]=minn[i-];
sminn[i]=sminn[i-]+minn[i];
smaxx[i]=smaxx[i-]+maxx[i];
spul[i]=(spul[i-]+maxx[i]*minn[i])%qaq;
}
long long mi=mid;
long long ma=mid;
long long mis=1e12;
long long mas=;
for (int i=mid;i>=l;i--){
if (a[i]<mis) mis=a[i];
if (a[i]>mas) mas=a[i];
while ((mi<r)&&(minn[mi+]>=mis)) mi++;
while ((ma<r)&&(maxx[ma+]<=mas)) ma++;
if (mi<ma)
ans=(ans+mis%qaq*mas%qaq*(mi-mid)%qaq+(sminn[ma]-sminn[mi])%qaq*mas%qaq+(spul[r]-spul[ma])%qaq)%qaq;
else
ans=(ans+mis%qaq*mas%qaq*(ma-mid)%qaq+(smaxx[mi]-smaxx[ma])%qaq*mis%qaq+(spul[r]-spul[mi])%qaq)%qaq;
}
}
int main(){
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%lld",&a[i]);
ans=;
fz(,n);
printf("%lld\n",ans);
return ;
}
神奇的代码
乘的顺序很重要,乘的顺序很重要,乘的顺序很重要!!!(苦悲的ans那里乘的放到后面没有事先%%%就变负数waaaaaaaa了QAQ)
JZOJ.5231【NOIP2017模拟8.5】序列问题的更多相关文章
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- JZOJ.5335【NOIP2017模拟8.24】早苗
Description
- JZOJ.5281【NOIP2017模拟8.15】钦点
Description
随机推荐
- 飞机3D轨迹绘制(经度-纬度-高度)
使用Python绘制 #绘制三维直线图,将飞机飞行的航迹用(经度,纬度和高度)来描述 #******************************************************** ...
- 关于cnblogs的排版
cnblogs默认的样式实在让我无法接受.今天去看了看div+css的基本知识. 决定这周抄一个别人的排版,稍微改改. 不然,就这样式,实在没心情写博客. 写博客,这次准备要大干一场了.
- 如何在mysql下实现事务的提交与回滚
最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制. 首先我们建一张tran_test表 CREATE TABLE ...
- unity Editor下自启动
[InitializeOnLoad] 加上这个特性,并且在静态构造函数里写上内容.即可在Unity启动的时候自启动这个Editor脚本
- Garbage First(G1)垃圾收集器
1. 概述 G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一.早在JDK7就已加入JVM的收集器大家庭中,成为HotSpot重点发展的垃圾回收技术.同优秀的CMS垃圾回收 ...
- Python3.0+Selenium3进行Web自动化遇到的坑
1.搭建环境时,已经把chromedriver的路径加入到PATH,但是还是报错说需要加入PATH.此时重新启动下Pycharm即可
- jsp tag 直接文件实现
引入 <%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %> 这里注意/WEB-INF/tags ...
- Objective-C中.h文件、.m文件中@interface、@synthesize及其它
很多开发iOS好几年的老鸟,可能都不太分的清.h文件和.m文件里各种结构的用途和区别.最近仔细研究了一下,写一篇文章记下来. 一般的,写一个Class的时候,经常是这种格式(以UIViewContro ...
- java -jar Incompatible argument to function
原因分析:jar包版本问题 解决方法:到工程中查看代码引用的jar包版本是多少,然后升级jar包,就可以了!
- JavaScript中的对象冒充
JavaScript里没有继承关键字,想要继承一个类需要用到“对象冒充”. <!DOCTYPE html> <html xmlns="http://www.w3.org/1 ...