→题目链接←
以高度为第一关键字,从大到小
以序号为第二关键字,从小到大
排序
然后从头开始扫,每次找到后继就是第一个高于他的,然后把他的编号插到set里
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
struct node{
int x,num;
friend bool operator < (node a,node b){
if(a.num==b.num)return a.x<b.x;
return a.num>b.num;
}
};
int n;
node a[100010];
int ans[100010];
set<int>s;
set<int>::iterator r;
int main(){
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&a[i].num);
a[i].x=i;
}
sort(a,a+n);
for(int i=0; i<n; i++){
r=s.upper_bound(a[i].x);
if(r==s.end())ans[a[i].x]=0;
else ans[a[i].x]=*r+1;
s.insert(a[i].x);
}
for(int i=0; i<n; i++){
printf("%d\n",ans[i]);
}
return 0;
}