气温预测
气温预测
Description
现有一个n天的气温表, 请你预测对于每一天,最迟多少天后可以升温(从现在到气温表中最后大于当前温度的那天)。如果不能升温,则当前输出0。
Input
输入第一行为一个n代表天数。
第二行为n个整数,第i个代表第i天的气温a[i]。
1 <= n <= 1e6
0 < a[i] < 1e6.
Output
输出一行n个数,第i个数代表对于第i天,最迟多少天后可以升温,如果不能升温,输出0。
Sample Input 1
5 1 2 5 3 2
Sample Output 1
4 2 0 0 0
Hint
样例中第一天气温为1,最后一个大于1的位置在第五天,所以输出5 - 1 = 4。
第三天气温为5,之后没有比5大的数,所以输出0。
对a数组按温度排个升序然后维护每个数组元素后面最大天数,还要注意排序时温度相同的时候,天数小的要排在后面,因为若天数大的排在后面,则会影响前面天数小的的答案
#include<bits/stdc++.h>
using namespace std;
struct node
{
int wd,id;
}a[1000005];
int ans[1000005]={0};
bool cmp(const node&b,const node&c)
{
if(b.wd==c.wd)
return b.id>c.id;
return b.wd<c.wd;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&(a[i].wd));
a[i].id=i;
ans[i]=0;
}
sort(a+1,a+n+1,cmp);
int maxid=0;
//for(int i=1;i<=n;i++)
//printf("%d %d\n",a[i].wd,a[i].id);
for(int i=n;i>=1;i--)
{
if(a[i].id<maxid)
{
ans[a[i].id]=maxid-a[i].id;
}
else
{
maxid=a[i].id;
}
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
return 0;
}