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 ...
随机推荐
- winform+cefSharp实现窗体加载浏览器
1:新建winform项目 2:安装cefSharp 3:配置管理器更改为X86 4:添加引用 using CefSharp; using CefSharp.WinForms; 5:项目启动,打开网页 ...
- MVC拦截
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using Syst ...
- j.u.c: Java并发包的5大块
//TODO Executors: ExecutorService executor = Executors.newFixedThreadPool(10);... newForkJoinPool(). ...
- 2019 中兴java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中兴等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中兴,入职一年时间了,也成为了面试官,之 ...
- dubbo循序渐进 - yml配置
Dubbo首先使用com.alibaba.dubbo.config.spring.schema.NamespaceHandler注册解析器,当spring解析xml配置文件时就会调用这些解析器生成对应 ...
- 虚拟环境和pip相关的命令
# 虚拟环境 mkvirtualenv # 创建虚拟环境 rmvirtualenv # 删除虚拟环境 workon # 进入虚拟环境.查看所有虚拟环境 deactivate # 退出虚拟环境 eg: ...
- Cheat Engine 字节数组类型
BIG5 编码:http://www.qqxiuzi.cn/zh/hanzi-big5-bianma.php 打开游戏 准备修改名字 查找BIG5码 藤 吉 开始扫描 使用字节数组类型扫描 新BIG5 ...
- Vue Nginx反向代理配置 解决生产环境跨域
Vue本地代理举例: module.exports = { publicPath: './', devServer: { proxy: { '/api': { target: 'https://mov ...
- cetos报错“Lack of free swap space” 解决方法
前提:今天发现某台主机一直报警:swap内存被用光 1.查看了服务器的内存情况[发现在物理内存还剩余的情况下,swap开始被使用,甚至到被用光][root@note1 ~]# free -htotal ...
- 直接将字典转为DataFrame格式时,会出现:ValueError: If using all scalar values, you must pass an index(四种解决方案)
问题:想要将字典直接转为DataFrame格式时,除了字典外没有传入其他参数时,会报错 ValueError: If using all scalar values, you must pass an ...