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. MYSQ创建联合索引,字段的先后顺序,对查询的影响分析

    MYSQ创建联合索引,字段的先后顺序,对查询的影响分析 前言 最左匹配原则 为什么会有最左前缀呢? 联合索引的存储结构 联合索引字段的先后顺序 b+树可以存储的数据条数 总结 参考 MYSQ创建联合索 ...

  2. java 第七周课后作业0417

    定义一个矩形类Rectangle:(知识点:对象的创建和使用)1 定义三个方法:getArea()求面积.getPer()求周长,showAll()分别在控制台输出长.宽.面积.周长.2 有2个属性: ...

  3. Java读源码之ReentrantLock(2)

    前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源 ...

  4. summary && scenarios

    小组中期总结 项目目标: 我们的目标是制作一款pdf阅读器的必应查词插件,帮助大家在阅读英文资料的时候查单词更加的方便并且可以帮助人们英语学习. 痛点:对于在电脑上现在屏幕取词软件已经做得相当好了,所 ...

  5. STL迭代器的使用

    STL的迭代器听起来怪吓人的,其实并不是什么高深的东西,说白了就是定义了一个指向STL的指针.. 对于没个STIL都可以定义 set,,vector ,,map,,,string 定义: set< ...

  6. 计算机系统基础学习笔记(1)-基本GCC,objdump,GBD命令的使用

    基本GCC命令的使用 GCC是一套由GNU项目开发的编程语言编译器,可处理C语言. C++.Fortran.Pascal.Objective-C.Java等等.GCC通常是 跨平台软件的编译器首选.g ...

  7. 尾递归和JAVA

    简单来说,递归即是调用自己本身.所有递归都应该有至少一个基本条件,在满足基本条件时不进行递归. 给出一个递归实例: int fact(int N){ if(N==1) return 1; else r ...

  8. linux上Docker安装gogs私服

    一.背景介绍 Gogs 是一款类似GitHub的开源文件/代码管理系统(基于Git),Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...

  9. 【vue】nextTick源码解析

    1.整体入手 阅读代码和画画是一样的,忌讳一开始就从细节下手(比如一行一行读),我们先将细节代码折叠起来,整体观察nextTick源码的几大块. 折叠后代码如下图 整体观察代码结构 上图中,可以看到: ...

  10. VHD VHDX 区别

    A Virtual hard disk is saved either with VHD or VHDX file extension. VHD is the older while VHDX is ...