洛谷SP22343 NORMA2 - Norma(分治,前缀和)
这题推式子恶心。。。。。
考虑分治,每次统计跨过\(mid\)的所有区间的答案和。\(i\)从\(mid-1\)到\(l\)枚举,统计以\(i\)为左端点的所有区间。
我们先维护好\([i,mid]\)区间内最小值\(mn\)和最大值\(mx\)。我们可以想到,对于某一个左端点,它的右端点\(j\)在一定的范围内,最小值和最大值都不会变。这里就看到一些可以重复利用并快速计算的信息了。
维护两个指针\(p,q\),分别表示\([mid+1,r]\)内元素值第一个小于\(mn/\)大于\(mx\)的位置,那么\(\sum\limits_{j=mid+1}^rans[i,j]\)就可以分成三类讨论。暂时假设\(p<q\)。
\(j\in[mid+1,p-1]\)时,区间的最值不变,都是\(mn,mx\),直接高斯求和
\]
\(j\in[p,q-1]\)时,区间最大值不变,但最小值取的是\([mid+1,j]\)里的了。预处理\(mid+1\)到\(r\)的前缀最小值\(min_j\),同时记录\(min_j\)和\(min_j\cdot j\)的前缀和(\(p\ge q\)同理)
\]
\]
\(j\in[q,r]\)时,最值和\(mn,mx\)无关了,记录\(min_jmax_j\)和\(min_jmax_j\cdot j\)的前缀和
\]
\]
容易发现\(mn,mx,p,q\)都是单调移动的,那么就大功告成啦!
#include<bits/stdc++.h>
#define LL long long
#define RG register
#define R RG LL//常数大也无所谓了
#define G if(++ip==ie)fread(ip=buf,1,N,stdin)
#define A(V) (ans+=V)%=YL
using namespace std;
const LL N=1<<19,YL=1e9;
char buf[N],*ie=buf+N,*ip=ie-1;
LL ans,a[N],mns[N],mxs[N],mnj[N],mxj[N],mms[N],mmj[N];
inline LL in(){
G;while(*ip<'-')G;
R x=*ip&15;G;
while(*ip>'-'){x*=10;x+=*ip&15;G;}
return x;
}
inline LL S(R l,R r){//高斯求和
return (l+r)*(r-l+1)/2%YL;
}
void solve(R l,R r){
if(l==r){A(a[l]*a[l]);return;}
R m=(l+r)>>1,i,j,p,q,mn=YL,mx=0;
solve(l,m);solve(m+1,r);
mns[m]=mxs[m]=mnj[m]=mxj[m]=mms[m]=mmj[m]=0;
for(j=m+1;j<=r;++j){//预处理,变量名不解释
mn=min(mn,a[j]);mx=max(mx,a[j]);
mns[j]=(mns[j-1]+mn)%YL;
mxs[j]=(mxs[j-1]+mx)%YL;
mnj[j]=(mnj[j-1]+mn*j)%YL;
mxj[j]=(mxj[j-1]+mx*j)%YL;
mms[j]=(mms[j-1]+mn*mx)%YL;
mmj[j]=(mmj[j-1]+mn*mx%YL*j)%YL;
}
mn=YL;mx=0;
for(p=q=m+1,i=m;i>=l;--i){//计算答案
mn=min(mn,a[i]);mx=max(mx,a[i]);
while(p<=r&&mn<a[p])++p;//单调移动
while(q<=r&&mx>a[q])++q;
if(p<q){
A(mn*mx%YL*S(m-i+2,p-i));//注意做减法的都要加一下模数
A(mx*(mnj[q-1]-mnj[p-1]+YL)+mx*(mns[q-1]-mns[p-1]+YL)%YL*(1-i+YL));
A(mmj[r]-mmj[q-1]+(mms[r]-mms[q-1]+YL)*(1-i+YL));
}
else{
A(mn*mx%YL*S(m-i+2,q-i));
A(mn*(mxj[p-1]-mxj[q-1]+YL)+mn*(mxs[p-1]-mxs[q-1]+YL)%YL*(1-i+YL));
A(mmj[r]-mmj[p-1]+(mms[r]-mms[p-1]+YL)*(1-i+YL));
}
}
}
int main(){
R n=in();
for(R i=1;i<=n;++i)a[i]=in();
solve(1,n);
printf("%lld\n",ans);
return 0;
}
洛谷SP22343 NORMA2 - Norma(分治,前缀和)的更多相关文章
- BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治
要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- [洛谷P3806] [模板] 点分治1
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...
- 洛谷P4390 Mokia CDQ分治
喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就 ...
- Solution -「COCI 2014-2015 #2」「洛谷 P6406」Norma
\(\mathcal{Description}\) Link. 给定 \(\{a_n\}\),求: \[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min_{k=i}^j\ ...
- 洛谷P4178 Tree (点分治)
题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式: N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下 ...
- 洛谷P2280 [HNOI2003] 激光炸弹 [前缀和]
题目传送门 题目描述 输入输出格式 输入格式: 输入文件名为input.txt 输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示 xi,yi ,vi . 输出格式: 输出文 ...
- 洛谷 4178 Tree——点分治
题目:https://www.luogu.org/problemnew/show/P4178 点分治.如果把每次的 dis 和 K-dis 都离散化,用树状数组找,是O(n*logn*logn),会T ...
- 洛谷T44252 线索_分治线段树_思维题
分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...
随机推荐
- Linux&Windows中VNC协议及使用方法
[转载]window下使用vnc远程登录ubuntu/linux图形界面_五个粽子_新浪博客http://blog.sina.com.cn/s/blog_677265f601012mqg.html V ...
- react-redux异步数据操作
import React, { Component } from 'react'; import './App.css'; import {connect} from 'react-redux'; i ...
- IDEA将项目上传至码云/GitHub托管
怎么将本地的项目放到码云或者GitHub去托管了?(以码云为例) 一.创建远程项目 第一步:点击创建项目 第二步:填写项目相关信息 第三步:复制远程的项目地址,注意:此处码云官方已经给出上传项目方法, ...
- 【学亮IT手记】PL/SQL游标编程
游标提供了一种从表中检索数据并进行操作的灵活手段,主要用在服务器上,处理由客户端发送给服务器端的sql语句,或者是批处理.存储过程.触发器中的数据处理请求. 显式游标 是由用户声明和操作的一种游标,通 ...
- Select2 4.0.5 API
详细属性参考官方API,https://github.com/select2/select2/releases/tag/4.0.5 注:4.0.5版本API与3.x版本有差异,有些属性已废弃,以下列出 ...
- liunx 运维知识三部分
一. 用户级用户组相关 二. 文件属性和链接知识及磁盘已满故障案例 三. 通配符 四. 特殊符号 五. 基础正则 六. 扩展正则 七. sed实践 八. awk实践
- linux之ssh互信
1.如果你是之作root用户互信的话,直接一路执行如下命令就行. 1.切换你需要互信的账户 su hadoop1 2.执行命令,一路回车即可(在当前用的宿主用户目录下的.ssh目录下生成公钥和秘钥id ...
- Spirng boot maven多模块打包不踩坑
本文参考 https://blog.csdn.net/Ser_Bad/article/details/78433340 经过实战一次通过.回话不多说,话费不多说,直接上图. 项目整体结构: 父模块: ...
- Python turtle绘制阴阳太极图代码解析
本文详细分析如何使用Python turtle绘制阴阳太极图,先来分解这个图形,图片中有四种颜色,每条曲线上的箭头表示乌龟移动的方向,首先从中心画一个半圆(红线),以红线所示圆的直径作半径画一个校园, ...
- HTML中文本过长时自动隐藏末尾部分或中间等任意部分
一. 一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px; ...