codeforces 817 D. Imbalanced Array(单调栈+思维)
题目链接:http://codeforces.com/contest/817/problem/D
题意:给你n个数a[1..n]定义连续子段imbalance值为最大值和最小值的差,要你求这个数组的imbalance总值
题解:首先要知道imbalance的值可以有所有区间的Max的和减去所有区间Min的和。那么就是怎么求所有区间的Max和与Min和。要知道如果是以a[i]为最小值那么最小值为a[i]的区间数为a[i]左边第一个小于a[i]的位置l,a[i]右边第一个大于等于a[i]的位置r,ans=r*l*a[i]。然后就是怎么快速求解。这里可以利用一下单调栈的思想。具体看一下代码。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int M = 1e6 + 10;
ll a[M] , dpl_Max[M] , dpl_Min[M] , dpr_Max[M] , dpr_Min[M];
int main() {
int n;
scanf("%d" , &n);
for(int i = 1 ; i <= n ; i++) scanf("%lld" , &a[i]);
dpl_Max[1] = 0 , dpl_Min[1] = 0;
for(int i = 2 ; i <= n ; i++) {
dpl_Max[i] = dpl_Min[i] = i - 1;
while(dpl_Max[i] >= 1 && a[dpl_Max[i]] < a[i]) dpl_Max[i] = dpl_Max[dpl_Max[i]];
while(dpl_Min[i] >= 1 && a[dpl_Min[i]] > a[i]) dpl_Min[i] = dpl_Min[dpl_Min[i]];
}
dpr_Max[n] = n + 1 , dpr_Min[n] = n + 1;
for(int i = n - 1 ; i >= 1 ; i--) {
dpr_Max[i] = dpr_Min[i] = i + 1;
while(dpr_Max[i] <= n && a[dpr_Max[i]] <= a[i]) dpr_Max[i] = dpr_Max[dpr_Max[i]];
while(dpr_Min[i] <= n && a[dpr_Min[i]] >= a[i]) dpr_Min[i] = dpr_Min[dpr_Min[i]];
}
ll Sum_Max = 0 , Sum_Min = 0;
for(int i = 1 ; i <= n ; i++) {
Sum_Max += a[i] * (i - dpl_Max[i]) * (dpr_Max[i] - i);
Sum_Min += a[i] * (i - dpl_Min[i]) * (dpr_Min[i] - i);
}
printf("%lld\n" , Sum_Max - Sum_Min);
return 0;
}
codeforces 817 D. Imbalanced Array(单调栈+思维)的更多相关文章
- Educational Codeforces Round 23 D. Imbalanced Array 单调栈
D. Imbalanced Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 601B. Lipshitz Sequence(单调栈)
Codeforces 601B. Lipshitz Sequence 题意:,q个询问,每次询问给出l,r,求a数组[l,r]中所有子区间的L值的和. 思路:首先要观察到,斜率最大值只会出现在相邻两点 ...
- 「10.11」chess(DP,组合数学)·array(单调栈)·ants(莫队,并茶几)
菜鸡wwb因为想不出口胡题所以来写题解了 A. chess 昨天晚上考试,有点困 开考先花五分钟扫了一边题,好开始肝$T1$ 看了一眼$m$的范围很大,第一反应矩阵快速幂?? $n$很小,那么可以打$ ...
- codeforces 547B. Mike and Feet 单调栈
题目链接 用单调栈计算出一个数字, 左边第一个比他小的数字的位置, 右边比第一个他小的数字的位置, 然后len = r[i] - l[i] +1. ans[len] = max(ans[len], a ...
- Codeforces 547B. Mike and Feet[单调栈/队列]
这道题用单调递增的单调栈维护每个数能够覆盖的最大区间即可. 对于 1 2 3 4 5 4 3 2 1 6 这组样例, 1能够覆盖的最大区间是10,2能够覆盖的最大区间是7,以此类推,我们可以使用单 ...
- Codeforces 601B(贪心+斜率+组合数学+单调栈)
题面 传送门 题目大意: L(h)的值是区间[L,R]内,abs(h[i]-h[j])/(i-j)的最大值.现在有q个询问,每个询问表示询问区间[L,R]内,所有子序列的L(h)的值的和 分析 将|h ...
- 2019牛客暑期多校训练营(第八场)A-All-one Matrices(单调栈+思维)
>传送门< 题意:给你一个01矩阵,求出所有不可扩大的全为1的矩阵的个数 思路:比赛的时候想到了用单调栈,但是也只是想到了,并不知道怎么用,其实和之前求二维01矩阵中全为1的矩阵最大面积非 ...
- hdu 4923 Room and Moor (单调栈+思维)
题意: 给一个0和1组成的序列a,要构造一个相同长度的序列b.b要满足非严格单调,且 值为0到1的实数.最后使得 sum((ai-bi)^2)最小. 算法: 首先a序列開始的连续0和末尾的连续1是能 ...
- Imbalanced Array CodeForces - 817D (思维+单调栈)
You are given an array a consisting of n elements. The imbalance value of some subsegment of this ar ...
随机推荐
- UE4 游戏模块初始化顺序
最近看教学,有个讲解UE4初始化顺序的,记录一下. 首先创建一个Actor,Character,GameInstance,GameMode,LevelScriptActor(关卡),PlayerCon ...
- POJ18060
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16244 Accepted: 565 ...
- RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群
本文使用Docker搭建RabbitMQ集群,然后使用HAProxy做负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群.受限于自身条件,本 ...
- c#小灶——输出语句
前面我我们学习了如何在控制台输出一句话,今天我们学习一下更详细的输出方式. Console.WriteLine();和Console.Write(); 我们来看一下下面几行代码, using Syst ...
- Kubernetes容器集群管理环境 - 完整部署(上篇)
Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...
- 使用ADO.NET操作SqlServer,开启一个事务
1.创建SqlConnection对象(connStr是链接字符串) SqlConnection conn = new SqlConnection(connStr); 2.创建SqlTransacti ...
- eclipse使用(一)
使用eclipse时,编写对象的返回值非常麻烦,而使用返回值快捷键可以简化这一过程. 第一种 Alt+shift+L 将光标放在有返回值的代码句的分号后面: Resources.getResource ...
- Go中的命名规范
1.命名规范 1.1 Go是一门区分大小写的语言. 命名规则涉及变量.常量.全局函数.结构.接口.方法等的命名. Go语言从语法层面进行了以下限定:任何需要对外暴露的名字必须以大写字母开头,不需要对外 ...
- dns自动配置shell脚本
代码: #!/bin/bash #获取url echo "url:" read url #获取ip echo "ip:" read ip #向/etc/name ...
- 零拷贝Zero copy-linux and java
背景-几种拷贝方式 方式1:Copying in Two Sample System Calls read(file, tmp_buf, len); write(socket, tmp_buf, le ...