CodeForces 91B-K
阿新 • • 發佈:2019-01-31
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; }