[SPOJ22343] Norma
Description
现在有一个长度为\(N(N\leq 500000)\)的序列,定义区间\([l,r]\)的价值为\([l,r]\)的最小值乘上\([l,r]\)的最大值乘上\([l,r]\)的长度。问这个序列的所有区间的价值和对\(10^9\)取模的结果。
Solution
遇到神仙题考虑分治。
考虑所有经过\(mid\)的区间。
对于小于等于\(mid的\)\(i\),我们要求所有在\(mid\)右边的\(j\)并计算\([i,j]\)的价值。
可以先维护出来\([i,mid]\)的最小值和最大值记为\(minn,maxn\)。
在右边维护两个指针\(p,q\),分别表示第一个大于\(minn\)的位置和第一个小于\(maxn\)的位置。
如果我们把\(i\)从\(mid\)倒序循环到\(l\),那么可以发现,\(maxn,minn,p,q\)都是具有单调性的。
那对于一个\(i\)的答案就可以分成三部分计算(假设\(p<q\)) :\([mid+1,p),[p,q),[q,r]\)。做几个前缀和弄一下就行了。
Code
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cctype>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
using std::min;
using std::max;
using std::swap;
using std::vector;
const int N=5e5+5;
typedef double db;
const int mod=1e9;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define mp(A,B) std::make_pair(A,B)
int n;
ll qz[N][2];
ll mn[N][2];
ll mx[N][2];
ll val[N],ans;
int stk[N],top;
int qh(int l,int r){
if(l>r) return 0;
int len=r-l+1;
return (l+r)*len/2%mod;
}
int getint(){
int X=0,w=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
}
const int inf=1e9;
void solve(int l,int r){
if(l==r){(ans+=val[l]*val[l]%mod)%=mod;return;}
int mid=l+r>>1;
solve(l,mid);solve(mid+1,r);
ll minn=inf,maxn=-inf;
qz[mid][0]=qz[mid][1]=0;
for(int i=mid+1;i<=r;i++){
minn=min(minn,val[i]);
maxn=max(maxn,val[i]);
mn[i][0]=(mn[i-1][0]+minn)%mod;
mn[i][1]=(mn[i-1][1]+minn*(i-mid)%mod)%mod;
mx[i][0]=(mx[i-1][0]+maxn)%mod;
mx[i][1]=(mx[i-1][1]+maxn*(i-mid)%mod)%mod;
qz[i][0]=(qz[i-1][0]+(ll)minn*maxn%mod)%mod;
qz[i][1]=(qz[i-1][1]+(ll)minn*maxn%mod*(i-mid)%mod)%mod;
}
minn=inf,maxn=-inf;
int p=mid+1,q=mid+1;
for(int i=mid;i>=l;i--){
minn=min(minn,val[i]);
maxn=max(maxn,val[i]);
while(p<=r and val[p]>=minn) p++;
while(q<=r and val[q]<=maxn) q++;
int lll=min(p,q),rr=max(p,q);
int len=lll-mid-1;
(ans+=qh(mid+1-i+1,lll-1-i+1)*maxn%mod*minn%mod)%=mod;
if(p<q) (ans+=(mn[q-1][1]-mn[p-1][1]+mod)%mod*maxn%mod+(mn[q-1][0]-mn[p-1][0]+mod)%mod*(mid-i+1)%mod*maxn%mod)%=mod;
if(p>q) (ans+=(mx[p-1][1]-mx[q-1][1]+mod)%mod*minn%mod +(mx[p-1][0]-mx[q-1][0]+mod)%mod*(mid-i+1)%mod*minn%mod)%=mod;
(ans+=(qz[r][1]-qz[rr-1][1]+mod)%mod+(qz[r][0]-qz[rr-1][0]+mod)%mod*(mid-i+1)%mod)%=mod;
}
}
signed main(){
n=getint();
for(int i=1;i<=n;i++) val[i]=getint();
solve(1,n);
printf("%lld\n",ans);
return 0;
}
[SPOJ22343] Norma的更多相关文章
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 【BZOJ3745】Norma(CDQ分治)
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答 ...
- 【BZOJ3745】Norma [分治]
Norma Time Limit: 20 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第1行,一个整数N: ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- 【题解】Norma [COCI2014] [SP22343]
[题解]Norma [COCI2014] [SP22343] 传送门:\(\text{Norma [COCI2014]}\) \(\text{[SP22343]}\) [题目描述] 给定一个整数 \( ...
- 『Norma 分治』
Norma Description Input Format 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output Format 输出答案对10^9取模后的结果. Sample ...
- bzoj3745: [Coci2015]Norma
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离, ...
- BZOJ3745 : [Coci2014]Norma
考虑枚举右端点,用线段树维护[i,nowr]的答案. 当右端点向右延伸时,需要知道它前面第一个比它大/小的数的位置,这里面的最值将发生改变,这个使用单调队列求出,然后将所有的l都加1. 注意常数优化. ...
- white-space norma nowrap强制同一行内显示所有文本文字,让所有文字内容中一排显示不换行
日常我们为了让文字内容在一行内显示完,哪怕宽度不够也不能换行,我们可以使用white-space样式,但如果遇到了html br强制换行标签,无论是设置white-space与否都会被<br&g ...
随机推荐
- js 定时更改div背景图片
今天遇到一个业务场景,使用js将一个div标签的背景图片定时更换一下. 之前百度了几个,有css+js,也有css3的,不过css3的兼容有问题,之后同事提示,可以使用js直接来更换div的北京图片, ...
- 《Linux就该这么学》第五天课程
今天我很迷茫! 一下是一些命令的整合 原创地址:https://www.linuxprobe.com/chapter-04.html 下面是Linux系统中最重要的10个环境变量 变量名称 作用 HO ...
- using五大用法
1.命名空间 using namespace 命名空间;//这样每次使用命名空间中的变量时就不用指定命名空间了 注意:头文件中不应有using命名空间的声明 2.类型别名(C++11) using a ...
- Cura - CuraEngine - 架构分析
参考: https://blog.csdn.net/justdoithai/article/details/52746094
- ·通过wifi_scan学习esp32wifi程序编写
在ESP32的设计开发中,我们必然会需要使用到wifi或ble功能,今天就讲解下如何将WIFI功能纳入到ESP32中来. 初始化WiFi环境 首先,WiFi子系统的初始化需要由我们自己来自行,当我们写 ...
- Android Studio中的大量findViewById
一. 分析 在Android Studio中开发时,findViewById是用的最多的函数之一.经常需要对返回的view进行类型转换,输入麻烦.代码丑陋. 本文提供两种方案来解决这个问题: 1.安装 ...
- Django View 进阶
返回404 from django.http import HttpResponse, HttpResponseNotFound def not_found(request): ) 或 return ...
- What does git fsck stand for?
fsck -> File System ChecK https://stackoverflow.com/questions/21151945/what-does-git-fsck-stand-f ...
- Go语言数据类型
目录 基本数据类型说明 整型 浮点型 字符 字符类型本质探讨 布尔型 字符串 指针 值类型与引用类型 基本数据类型默认值 基本数据类型相互转换 注意事项 其他基本类型转string类型 string类 ...
- docker,docker-compose部署服务器
搭建服务器 docker 是一种容器技术,作用是用来快速部署服务,docker-compose 是用来做docker 的多容器控制. 简单的来说:docker-compose即为一种自动化部署服务. ...