CodeForces 91B-K - Queue 二分

tm数组记录原始数据

b数组记录的是 从i到 n里面 最小的一个数

对tm[i],如果 b[i+1]都大于等于它,则i位置前面不可能会有比tm[i]小的数,输出-1

如果tm[i]>b[i+1]的话,答案必然是在 b 的i+1到 bn 之间,  因为b是有序的,那么就二分查找就好




#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<string.h>
#include<stack>
#include<queue>
#define MAX 100005
#define inf 0x3f3f3f3f
using namespace std;
int tm[100000+5];
int b[100000+5];
int main()
{
	int n; 
	scanf("%d",&n);
	int i;


	for (i=1;i<=n;i++)
	{
		scanf("%d",&tm[i]);
	} 
	int minn=tm[n]; 
	for (i=n;i>=1;i--)
	{
		if (tm[i]<minn)
		minn=tm[i];
		b[i]=minn;<span style="white-space:pre">		</span>//b时刻记录i~n中最小的数
	} 
	for (i=1;i<=n;i++)
	{
		if (i!=1) printf(" ");

		if (tm[i]<=b[i+1])<span style="white-space:pre">			</span>//如果b[i+1]>=tm[i] 则tm[i]前面不会有比它小的数了,-1
				printf("-1");
		else 
 printf("%d",upper_bound(b+i+2,b+n+1,tm[i])-&b[i]-2);  //二分找到第一个大于等于tm[i]的数  他的前一个就是答案,即tm[I]对应最远的数
	}
	printf("\n");   
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值