1. 程式人生 > >CodeForces 91B-K

CodeForces 91B-K

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;
}