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
随机推荐
- Struts2简介以及结果集转发
一.分析之前的项目的不足,编写属于自己的框架二.Struts2简介(面试)三.搭建Struts2的开发环境 1.找到所需的jar包:发行包的lib目录中(不同版本需要的最小jar包是不同的,参见不同版 ...
- unity, particle play once and destroy
粒子播放一次后销毁: //ref: http://answers.unity3d.com/questions/219609/auto-destroying-particle-system ...
- Unity中使用ulua的个人经验总结
热度 286052 2015-3-15 14:32 |个人分类:技术类| Lua Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件:所以更新逻辑只需要更新脚本,不需要再 ...
- Linux之实用GDB技巧
一.引言 在Linux下开发,肯定少不了与gdb打交道,而gdb的命令又非常多,有些是不常用的但是特殊情况下却是必须的,因此记录在此,以便翻阅 二.基本命令 前面是命令全名,在不混淆的情况下,可以简写 ...
- listView里面添加gridview
package com.example.cc.ecustapp.Adapter; import android.content.Context;import android.util.DisplayM ...
- Macbook上Windows的触摸板设置工具
Macbook上用Boot Camp装了双系统后,没了触摸板的三指拖拽功能,滚动(scroll)也太过灵敏,装Boot Camp官方驱动也没用. 装了Trackpad++这个第三方驱动,就能完美实现M ...
- P3P解决cookie跨域
P3P是什么 P3P(Platform for Privacy Preferences)是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护. P3P标准的构想是:Web 站点的隐私策略应该告 ...
- python post get请求
安装 Requests pip install requests import requests requests.get('https://github.com/timeline.json') 使用 ...
- textarea去掉边框
<textarea style="BORDER-BOTTOM: 0px solid; BORDER-LEFT: 0px solid; BORDER-RIGHT: 0px solid; ...
- easyui menu 添加hideItem/showItem 方法
$.extend($.fn.menu.methods,{ showItem:function(jq,text){ return jq.each(function(){ var item = $(thi ...