[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 ...
随机推荐
- 第二次spring会议
今天所做之事: 我用C#用DelectText对行数进行了定义,刚开始写代码有点无从下手. 遇到的问题:刚开始用datagridView进行了文本的输入,但是它更适合EXCEL之类的数据计算不符合我们 ...
- ----关于position的四个标签----
从[ two1-4 ]分别为absolute,fixed,static,relative标签 四个标签下位移值相同,[ two2 ]和[ two1 ]都出现在左上角,[ two2 ] 盖住了[ two ...
- 软件推荐-有限元开发软件FELAC
首页:http://yuanjisuan.cn/ 有限元语言及其编译器(Finite Element Language And it’s Compiler),以下简称FELAC是中国科学院数学与系统科 ...
- POJ2455 Secret Milking Machine
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12324 Accepted ...
- tomcat的调优管理
1 记性调整存设定. A: 方法如下: 1. linux 下编辑tomcat安装目录下的bin目录下的catalina.sh文件,windows下为catalina.bat vi catalina. ...
- POJ2516K次费用流建图
Description: N个订单(每个订单订K种商品),M个供应商(每个供应商供应K种商品),K种商品,后N行,表示每一个订单的详细信息,后M行表示每个供应商供应的详细信息,后K 个N * M的矩阵 ...
- (转载)Linux之虚拟机 rehl7的ip
RHEL7最小化安装之后(桥接模式),我们查看本机IP, ip addr 我们要修改配置文件 找到目录 找到文件(每个人的ifcfg-eno16777736都不同),用vi编辑器打开修改配置文件 保存 ...
- ubuntu16.04下idea、webstorm等开发工具不能输入中文问题
问题: ubuntu16.04下idea.webstorm开发工具不能输入中文,就算切换到中文输入法输入的也是英文字母. 解决方案: 1.vim打开开发工具的启动文件(idea下就是idea.sh) ...
- Unity全面的面试题(包含答案)
一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3D中 ...
- [bug]”System.InvalidProgramException:公共语言运行时检测到无效程序“解决方案
Visual Studio 2017版本15.8.x运行某些程序会报这样的错误:“System.InvalidProgramException:公共语言运行时检测到无效程序” 此问题的临时解决方案: ...