洛谷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 ...
随机推荐
- DDoS攻击、CC攻击的攻击方式和防御方法
DDoS攻击.CC攻击的攻击方式和防御方法 - sochishun - 博客园https://www.cnblogs.com/sochishun/p/7081739.html cc攻击_百度百科htt ...
- oracle查看表结构命令desc
- Oracle 备份表数据
--备份表数据 select * from t_owners; --创建备份表 create table t_owners_copy ( id number, name ), addressid nu ...
- K3 WISE安全认证方式
k/3中间层注册三种安全认证方式: 交互式用户方式,网络服务方式,信任方式,是指组件服务中生成的COM+应用程序中的组件包的运行账户(注册中间层后产生很多ebo开头的和kdsvrmgr组件包). 三种 ...
- James 3.1服务器的安装与搭建
参考:1. ububtu下基于docker安装配置Apache James 3.1.0: https://blog.csdn.net/bonwei/article/details/83061372 2 ...
- RestTemplate proxy 设置方式
RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory() {{ setProxy(new ja ...
- 刪除nodejs
https://www.cnblogs.com/fighxp/p/7410235.html https://www.cnblogs.com/fighxp/p/7411608.html
- Ajax之Jquery封装使用举例
<html> <head> <meta charset="UTF-8"> <title>登陆页面</title> < ...
- python之类和__init__
构建一个商品类,__init__函数类似于构造方法,self类似于this import random class Goods: def __init__(self, name, price): se ...
- linux 依赖解决办法
在安装软件过程中如果出现依赖不满足,有两种情况: 1:你系统里面没有安装依赖软件,[但是你的软件源里面有这个软件,你只是没有安装], 这种情况很简单,通过 sudo apt-get install - ...