B. 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 小阳买水果的更多相关文章

  1. 牛客小白月赛16 D 小阳买水果 (思维题)

    链接:https://ac.nowcoder.com/acm/contest/949/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  2. P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)

    P2698 [USACO12MAR]花盆Flowerpot 一看标签........十分后悔 标签告诉你单调队列+二分了............ 每次二分花盆长度,蓝后开2个单调队列维护最大最小值 蓝 ...

  3. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

  4. 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 ...

  5. [USACO12MAR]花盆Flowerpot (单调队列,二分答案)

    题目链接 Solution 转化一下,就是个单调队列. 可以发现就是一段区间 \([L,R]\) 使得其高度的极差不小于 \(d\) ,同时满足 \(R-L\) 最小. 然后可以考虑二分然后再 \(O ...

  6. bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2216 那个关于位置的代价是带根号的,所以随着距离的增加而增长变慢:所以靠后的位置一旦比靠前的 ...

  7. 【单调队列+二分查找】bzoj 1012: [JSOI2008]最大数maxnumber

    [题意] 维护一个单调递减的q数组,用id数组记录q数组的每个下标对应在原数组的位置,那么id数组一定有单调性(q数组中越靠后,原数组中也靠后),然后二分查找这个数 [AC] #include< ...

  8. BZOJ 1012 单调队列+二分

    思路: 维护一个单减的序列 序号是单增的 每回二分查找第一个比询问的大的值 我手懒 用得lower_bound //By SiriusRen #include <cstdio> #incl ...

  9. 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 ...

随机推荐

  1. 【python实现卷积神经网络】池化层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  2. 牛客练习赛61 相似的子串(二分+Hash)

    题面在此 题解:将字符串分成k部分,然后求最长前缀,所以我们只关注前缀部分就好了,公共前缀后边的是啥不用管,那么问题就转化成了是否存在k个不相交的字符串的最长公共前缀问题.首先用Hash来记录一下字符 ...

  3. 如何在Ubuntu 18.04上安装Nginx

    Nginx功能之强大,想必大家比我更清楚. 百度百科:Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔 ...

  4. vue2.x学习笔记(九)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12577948.html. 数组的更新检测 数组在javascript是一种特殊的对象,不是像普通的对象那样通过Ob ...

  5. Blazor WebAssembly 3.2.0 已在塔架就位 将发射新一代前端SPA框架

    最美人间四月天,春光不负赶路人.在充满无限希望的明媚春天里,一路风雨兼程的.NET团队正奋力实现新的突破. 根据计划,新一代基于WebAssembly 技术研发的前端SPA框架Blazor 将于5月1 ...

  6. Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践

    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...

  7. search(7)- elastic4s-search-filter模式

    现在我们可以开始探讨ES的核心环节:搜索search了.search又分filter,query两种模式.filter模式即筛选模式:将符合筛选条件的记录作为结果找出来.query模式则分两个步骤:先 ...

  8. 轻量级mysql安装教程-避免采坑

    1:安装包获取 安装了很多次,来来回回踩,踩出了一片光明大道,简单好用. 百度网盘获取:链接:https://pan.baidu.com/s/13frFBTODaMeADZOHj5KdJQ 提取码:a ...

  9. wx.request出现400 bad request的问题

    wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'content-type': 'a ...

  10. Inno Setup 大师 Tlama

    https://stackoverflow.com/users/960757/tlama