单调队列+二分 G - Queue 小阳买水果
这个题目会做的很偶然,突然想到的,因为我们要求离这只海象的最远的比他年轻的海象,这个年轻的海象可以用单调栈维护。
就是从前往后遍历一遍,单调栈里面存年龄从小往大的海象,这个为什么这么存呢,因为如果后面有比这个队列里面更年轻的海象,
那么就可以更新,而且这个更新是正确的,不会有影响,这个可以自己想一想/
然后就可以得到一个单调栈的数组,这个时候因为单调栈是单调的,所以可以用二分来查找我们所需要的值。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <iostream>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
typedef long long ll;
int queue_min[maxn];
int f1 = , t1 = , r = ;
int ans[maxn];
ll num[maxn];
ll a[maxn]; int ok(ll s)
{
int x = , y = t1;
int mid = (x + y) / ;
while(x<=y)
{
mid = (x + y) / ;
if (a[queue_min[mid]] >= s) y = mid-;
else x = mid + ;
//printf("x=%d y=%d mid=%d\n",x,y, mid);
}
//printf("mid=%d queue_min=%d\n", mid, queue_min[mid]);
if (a[queue_min[mid]] >= s) return queue_min[mid - ];
return queue_min[mid];
} int main()
{
int n;
scanf("%d", &n);
f1 = , t1 = , r = ;
for (int i = ; i <= n; i++) scanf("%lld", &a[i]);
queue_min[] = ;
while(r<n)
{
r++;
while (f1 <= t1 && a[r] < a[queue_min[t1]]) t1--;
queue_min[++t1] = r;
}
for (int i = f1; i <= t1; i++) {
num[i] = a[queue_min[i]];
// printf("queue_min[%d]=%d\n", i, queue_min[i]);
// printf("num[%d]=%lld\n", i, num[i]);
}
for(int i=;i<=n;i++)
{
int f = ok(a[i]);
//printf("F=%d\n",f);
if (f < i) ans[i] = -;
else ans[i] = f - i - ;
printf("%d ", ans[i]);
}
printf("\n");
return ;
}
单调栈 海象
这个题目和上面那个其实是一样的,但是我居然没有发现,这个要先前缀和处理一下,然后你就发现其实求的就是 比如 i ,求的就是 i 后面的比 i 更大的sum的最远位置。
也是二分+单调队列
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 2e6 + ;
typedef long long ll;
int queue_max[maxn];
int a[maxn], num[maxn];
ll sum[maxn];
int f1, t1;
int r; int ok(ll s) {
int x = , y = t1;
int mid = (x + y) / ;
while (x <= y) {
mid = (x + y) / ;
if (sum[queue_max[mid]] > s) x = mid + ;
else y = mid - ;
//printf("x=%d y=%d mid=%d\n", x, y, mid);
}
//printf("mid=%d queue_min=%d\n", mid, queue_min[mid]);
if (sum[queue_max[mid]] <= s) return queue_max[mid - ];
return queue_max[mid];
} int main() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%lld", &sum[i]);
sum[i] += sum[i - ];
// printf("sum[%d]=%lld\n", i, sum[i]);
}
f1 = , t1 = ;
r = ;
queue_max[] = ;
int ans = ;
while (r <= n) {
while (t1 >= f1 && sum[r] > sum[queue_max[t1]]) t1--;
queue_max[++t1] = r;
//printf("queue_max[%d]=%d\n", t1, queue_max[t1]);
r++;
}
for (int i = f1; i <= t1; i++) {
num[i] = sum[queue_max[i]];
//printf("queue[%d]=%d\n", i, queue_max[i]);
}
for (int i = ; i <= n; i++) {
int f = ok(sum[i]);
//printf("i=%d f=%d\n", i, f);
if (f > i)
{
if (sum[i] >= ) ans = max(ans, f - i + );
else ans = max(ans, f - i);
}
}
printf("%d\n", ans);
return ;
}
二分+单调队列
单调队列+二分 G - Queue 小阳买水果的更多相关文章
- 牛客小白月赛16 D 小阳买水果 (思维题)
链接:https://ac.nowcoder.com/acm/contest/949/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)
P2698 [USACO12MAR]花盆Flowerpot 一看标签........十分后悔 标签告诉你单调队列+二分了............ 每次二分花盆长度,蓝后开2个单调队列维护最大最小值 蓝 ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- HDU - 5289:Assignment(单调队列||二分+RMQ||二分+线段树)
Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this com ...
- [USACO12MAR]花盆Flowerpot (单调队列,二分答案)
题目链接 Solution 转化一下,就是个单调队列. 可以发现就是一段区间 \([L,R]\) 使得其高度的极差不小于 \(d\) ,同时满足 \(R-L\) 最小. 然后可以考虑二分然后再 \(O ...
- bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2216 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...
- 【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber
[题意] 维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数 [AC] #include< ...
- BZOJ 1012 单调队列+二分
思路: 维护一个单减的序列 序号是单增的 每回二分查找第一个比询问的大的值 我手懒 用得lower_bound //By SiriusRen #include <cstdio> #incl ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
随机推荐
- shell 数组遍历加引号和不加引号的区别?
前言 shell 是一个比较神奇的国度,里面有太多的坑需要填,今天需要填的坑就是,数组遍历在使用时加了引号和不加引号的区别. 案例 解析: 不加引号,数组中元素间的“空格”就会编程换行符 加引号, ...
- 虚拟机VMware 安装后虚拟机网卡与主机网卡数据交换关系
安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后面会详细介绍.在VMware Worksta ...
- R - C Looooops POJ - 2115 (exgcd)
题目大意:很好理解,一个for循环语句,从a开始到b结束,步长是c,模数是pow(2,k) 问,最少循环多少次,才能到达b,如果永远都到不了b,输出FOREVER 题解:其实就是求一个线性方程,cx= ...
- 全平台阅读器 StartReader
前段时间在网上闲逛, 发现了一款全平台阅读器 StartReader, 用了一阵子感觉还不错,网址是: https://www.startreader.com/ 感觉这款阅读器是程序员的福音,it人员 ...
- linux常用命令--打包和压缩文件
bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 bzip2 file1 压缩一个叫做 'file1' 的文件 gunzip file1.gz 解压一个叫做 'file1 ...
- 小知识点:session的存放位置
在php.ini里的配置session.save_path是注释掉的,那么Seesion保存的路径在不同类型操作系统保存在什么位置? Linux: /tmp 或 /var/lib/php/sessio ...
- python 使用记录及问题
编码问题 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 1: ordinal not in range(12 ...
- node 搭载本地代理,处理web本地开发跨域问题
var path = require('path') var httpProxy = require('http-proxy') var express = require('express') va ...
- QMessage自动定时关闭
QMessageBox *box = new QMessageBox(QMessageBox::Information,tr("test"),tr("testtest&q ...
- Linux系统硬件时间12小时制和24小时制表示设置
目前的服务器status是下面这样的 服务器系统 centos7 Linux系统时间 Fri Mar 20 15:26:27 CST 2020 Linux系统硬件时间 Fri 20 ...