Codeforces Round #622(Div 2)C2. Skyscrapers (hard version)
题目链接 :
C2. Skyscrapers (hard version)
题目描述 :
与上一道题类似,只是数据范围变大, 5e5, 如果用我们原来的方法,铁定是超时的。
考察点 :
单调栈,贪心,前缀和,后缀和
析题得侃:
上面说了,用原先得方法得话是铁定超时的,那怎么优化呢?通过 easy version ,我们可以
得知合适的位置一定是由两部分组成的,左侧的数的和,右侧的数的和,我们求这些和的时候
也确实浪费了大量的时间,我们能否知道这个位置,然后直接得到这个位置的和呢?然后直接
取一下最大值。
我们知道左右两侧一定是单调的,那么既然是单调的,我们能不能用单调栈来维护呢?
显然是可以的。
怎么维护呢?
看一组数据 :
下标 : 1 2 3 4 5 6
数值 : 5 2 3 6 7 4 (假设现在都在左侧,还没有找到合适的中间位置)
我们发现 2 的左侧必须 <= 2,同样的, 4 的左侧必须 <= 4,但是 有些数本来就比 4 小
所以 pre[6] = pre[3] + a[6] * (6 - 3)
同理,后缀也是一样的,逆过来就可以了
接下来我们要求某个位置的和就是 : sum = pre[i] + suf[i + 1]
Code:
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5e5 + 10;
typedef long long LL;
LL a[maxn],pre[maxn],suf[maxn];
LL L[maxn],R[maxn];
int n;
stack<int>S;
int main(void) {
scanf("%d",&n);
for(int i = 1; i <= n; i ++) {
scanf("%lld",&a[i]);
}
// 便于我们处理,可以先入栈一个 0
S.push(0);
for(int i = 1; i <= n; i ++) {
while(a[i] <= a[S.top()]) S.pop();
L[i] = S.top();
S.push(i);
}
while(!S.empty()) S.pop();
//同上
S.push(n + 1);
for(int i = n; i ; i --) {
while(a[i] <= a[S.top()]) S.pop();
R[i] = S.top();
S.push(i);
}
//计算每个位置的前缀和
for(int i = 1; i <= n; i ++) {
LL l = L[i];
pre[i] = pre[l] + a[i] * (i - l);
}
//计算每个位置的后缀和
for(int j = n; j ; j --) {
LL r = R[j];
suf[j] = suf[r] + a[j] * (r - j);
}
// 寻找合适的位置
LL sum = pre[1] + suf[2],id = 1;
for(int i = 1; i <= n; i ++ ) {
if(sum < pre[i] + suf[i + 1]) {
id = i;
sum = pre[i] + suf[i + 1];
}
}
for(int i = id - 1; i >= 1; i --) {
a[i] = min(a[i + 1],a[i]);
}
// 中间的那两个位置一定是 ok 的,我们需要从下一个开始
for(int j = id + 2; j <= n; j ++) {
a[j] = min(a[j - 1],a[j]);
}
for(int i = 1; i <= n; i ++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
后记 :
优化往往是再复杂的基础上进行优化,根据某些性质,利用相应的数据结构进行优化。
Codeforces Round #622(Div 2)C2. Skyscrapers (hard version)的更多相关文章
- Codeforces Round #581(Div. 2)
Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...
- Codeforces Round #334(div.2)(新增不用二分代码) B
B. More Cowbell time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces Round #334(div.2) A
A. Uncowed Forces time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- codeforces Round #389(Div.2)C Santa Claus and Robot(思维题)
题目链接:http://codeforces.com/contest/752/problem/C 题意:给出一系列机器人的行动方向(机器人会走任意一条最短路径),问最少标记几个点能让机器人按这个 路径 ...
- Codeforces Round #626 (Div. 2) B. Count Subrectangles
题目连接:https://codeforces.com/contest/1323/problem/B 题意:给一个大小为n的a数组,一个大小为m的b数组,c数组是二维数组c[i][j]=a[i]*b[ ...
- Codeforces Round #342 (Div 2) 解题报告
除夕夜之有生之年CF第一场 下午从奶奶家回到姥姥家,一看还有些时间,先吃点水果陪姥姥姥爷聊了会儿,再一看表,5:20....woc已经开场20分钟了...于是抓紧时间乱搞.. **A. Guest F ...
- Codeforces Round 1153(div. 2)
这场奇差.ABCD四题.179名. 但是E在现场有213个人做出. 描述一下我在35分钟做完D后的心路历程. 首先看到这道E,第一下想到的是把所有的横向和竖向的整列(行)求出相连的个数. 然后想如何能 ...
- Codeforces Round #345 (Div 2)
最后两题是orzCJK学长帮忙代打的,不过总算是到蓝名了(上次睡迟了,只剩半个小时,结果作大死点开题目看,结果rating掉了100多),还有论代码风格的重要性!!!(没写空格被学长各种D) A题 题 ...
- Codeforces Round #556(Div.1)
A 容易发现i,i+1至少有一个数出现,于是可以让尽量多的2和奇数出现 #include<bits/stdc++.h> using namespace std; int n,s1,s2; ...
随机推荐
- PAT_B1002数字分类
#include<stdio.h> #include<iostream> using namespace std; int main(){ ,a2=,a3=,a5=; ; ; ...
- Codeforces_460_B
http://codeforces.com/problemset/problem/460/B 枚举s(X). #include<cstdio> #include<iostream&g ...
- How to do if sqlserver table identity column exceed limited ?
script: select a.TABLE_NAME,a.COLUMN_NAME,a.DATA_TYPE, (CASE a.DATA_TYPE when 'int' then 'limited be ...
- 必知必会之Lambda表达式
Java是一门强大的面向对象的语言,除了8种基本的数据类型,其他一切皆为对象.因此,在Java中定义函数或方法都离不开对象,也就意味着很难直接将方法或函数像参数一样传递,而Java8中的Lambda表 ...
- MySql在Windows下自动备份的几种方法
以下几种全部是批处理命令中对于备份文件 1.复制date文件夹备份============================假想环境:MySQL 安装位置:C:\MySQL论坛数据库名称为:bbs数 ...
- node基础 day1
js为什么能在浏览器中运行 浏览器内部存在一个js解析器,解析ECMAscript 把引擎从浏览器中抽离出来,不再依赖浏览器,作为一个软件安装在电脑上,在命令行里面, 这个软件就是node node ...
- RFC笔记,IPv6 Node Requirements
Request for Comments: 6434,IPv6 Node Requirements 路由器节点必须能够生成链路本地地址 5.9.2. IPv6 Stateless Address Au ...
- NOIP2012-------跳石头(C语言)
#include<stdio.h> ]; int check(long mid, long n, long m) { long last, i, ans; last = a[]; ans ...
- 详解Net Core Web Api项目与在NginX下发布
前言 本文将介绍Net Core的一些基础知识和如何NginX下发布Net Core的WebApi项目. 测试环境 操作系统:windows 10 开发工具:visual studio 2019 框架 ...
- 【HDU - 2859 】Phalanx (dp 最大对称子图)
Phalanx 先搬翻译 Descriptions: 给你一个矩阵,只由小写或大写字母构成.求出它的最大对称子矩阵的边长. 其中对称矩阵是一个k*k的矩阵,它的元素关于从左下角到右上角的对角线对称.例 ...