bzoj3745: [Coci2015]Norma 分治,单调队列
链接
思路
首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解。参见?
求解此题目,我们分治。计算\([l,mid]\)对\([mid+1,r]\)的贡献。
我们从后向前枚举\(mid\)到\(l\),定义为\(x\)。(\(A\)为\([x,mid]\)中的最小值,\(B\)为\([x,mid]\)中的最大值)
得到\(p\)(\([mid+1,r]\)中大于等于\(A\)的位置)和\(q\)(\([mid+1,r]\)中小于等于\(B\)的位置)
然后根据p,q的位置四种情况讨论,处理前缀和O1得到贡献。
显然p,q类似于单调队列是\(O(n)\)求得
代码有种简单但是恶心的感觉
复杂度\(O(nlogn)\)
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+7,inf=0x3f3f3f3f,mod=1e9;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,a[N],ans;
int ma[N],mi[N],sum_mi[N],sum_ma[N],sum_mimai[N],sum_mima[N],sum_mii[N],sum_mai[N];
int jan(int a,int b) {
int ans=(a-b);
if(ans<0) ans+=mod;
return ans;
}
void add(int &x,int y) {
x+=y;
if(x>=mod) x-=mod;
}
void cdq(int l,int r) {
if(l>r) return;
if(l==r) {ans=(1LL*a[l]*a[l]%mod+ans)%mod;return;}
int mid=(l+r)>>1;
cdq(l,mid),cdq(mid+1,r);
sum_mi[mid]=sum_ma[mid]=sum_mima[mid]=sum_mimai[mid]=sum_mii[mid]=sum_mai[mid]=0;
mi[mid]=inf,ma[mid]=0;
for(int i=mid+1;i<=r;++i) {
mi[i]=min(mi[i-1],a[i]);
ma[i]=max(ma[i-1],a[i]);
sum_mi[i]=(sum_mi[i-1]+mi[i])%mod;
sum_ma[i]=(sum_ma[i-1]+ma[i])%mod;
sum_mii[i]=(sum_mii[i-1]+1LL*mi[i]*i%mod)%mod;
sum_mai[i]=(sum_mai[i-1]+1LL*ma[i]*i%mod)%mod;
sum_mima[i]=(sum_mima[i-1]+1LL*mi[i]*ma[i]%mod)%mod;
sum_mimai[i]=(sum_mimai[i-1]+1LL*mi[i]*ma[i]%mod*i%mod)%mod;
}
long long L,R;
int p=mid,q=mid,A=a[mid],B=a[mid];
int tot=ans;
for(int i=mid;i>=l;--i) {
A=min(A,a[i]),B=max(B,a[i]);
while(p<r&&A<=a[p+1]) p++;
while(q<r&&B>=a[q+1]) q++;
L=mid+1,R=min(p,q);
if(L<=R)
add(ans,1LL*A*B%mod*((L+R+2-2LL*i)*(R-L+1)/2%mod)%mod);
L=p+1,R=q;
if(L<=R)
add(ans,1LL*B*jan(sum_mii[R],sum_mii[L-1])%mod),
add(ans,1LL*jan(1,i)*B%mod*jan(sum_mi[R],sum_mi[L-1])%mod);
L=q+1,R=p;
if(L<=R)
add(ans,1LL*A*jan(sum_mai[R],sum_mai[L-1])%mod),
add(ans,1LL*jan(1,i)*A%mod*jan(sum_ma[R],sum_ma[L-1])%mod);
L=max(p+1,q+1),R=r;
if(L<=R)
add(ans,jan(sum_mimai[R],sum_mimai[L-1])),
add(ans,1LL*jan(1,i)*jan(sum_mima[R],sum_mima[L-1])%mod);
}
}
int main() {
n=read();
for(int i=1;i<=n;++i) a[i]=read();
cdq(1,n);
printf("%d",ans);
return 0;
}
bzoj3745: [Coci2015]Norma 分治,单调队列的更多相关文章
- [BZOJ3745][COCI2015]Norma[分治]
题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时 ...
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
- 【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列
一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的 ...
- [BZOJ1758][WC2010]重建计划(点分治+单调队列)
点分治,对于每个分治中心,考虑求出经过它的符合长度条件的链的最大权值和. 从分治中心dfs下去取出所有链,为了防止两条链属于同一个子树,我们一个子树一个子树地处理. 用s1[i]记录目前分治中心伸下去 ...
- BZOJ4860 Beijing2017树的难题(点分治+单调队列)
考虑点分治.对子树按照根部颜色排序,每次处理一种颜色的子树,对同色和不同色两种情况分别做一遍即可,单调队列优化.但是注意到这里每次使用单调队列的复杂度是O(之前的子树最大深度+该子树深度),一不小心就 ...
- bzoj4182 Shopping 点分治+单调队列优化多重背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4182 题解 有一个很直观的想法是设 \(dp[x][i]\) 表示在以 \(x\) 为根的子树 ...
- P4292 [WC2010]重建计划 点分治+单调队列
题目描述 题目传送门 分析 看到比值的形式就想到 \(01分数规划\),二分答案 设当前的值为 \(mids\) 如果存在\(\frac{\sum _{e \in S} v(e)}{|S|} \geq ...
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...
- bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4345 Solved: 1054[Submit][Status][Disc ...
随机推荐
- Lombok简介、使用、工作原理、优缺点
1.Lombok简介官方介绍 Project Lombok is a java library that automatically plugs into your editor and build ...
- mybatis日志,打印sql语句,输出sql
mybatis日志,打印sql语句,输出sql<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE ...
- python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制
CrawlSpider实现的全站数据的爬取 新建一个工程 cd 工程 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com 连接提取器Link ...
- 【转】Webpack 快速上手(下)
由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件输入和输出 中篇介绍了 webpack 在输入和输出 ...
- 23、vue实现获取短信验证码
1.html页面: <el-form-item prop="phoneCode" class="pr"> <el-input placehol ...
- 记录下Hbuilder 打包IOS发布时 总是提示错误:ios prifile文件与私钥证书匹配 的问题
最近两天,新的APP准备要上线,然后打包正式发布版 时,总是提示不匹配 证书照hbuilder里面的文档 一样也不行,然后百度了N种方法,都是不行,而且也比较少搜索到相关问题. 后来都是谷歌了下,找到 ...
- powershell 远程下载并执行
远程下载文件到本地并执行cmd.exe /c powershell.exe -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-ob ...
- 给任意view设置圆角outline.setRoundRect()方法实现
效果图,给banner设置圆角,1没有直接修改imageView而是使用自带方法进行设置 具体方法如下 //圆角方法 @TargetApi(Build.VERSION_CODES.LOLLIPOP) ...
- (十)Kubernetes ConfigMap和Secret
ConfigMap资源 介绍 ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性.许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.这些配置信息需要与docker im ...
- C++学习(5)—— 内存的分区模型
C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放,存放函数的参数值.局部变量等 ...