气温预测
-
Time Limit
1500MS
-
Memory Limit
256MB
看样例 Hint, 很容易明白题意。 太难了,看标程 才明白。 QAQ
思路:线段树,以值 a[i] 作为区间, 维护 大于值a[i] 的最大下标
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int tree[maxn*4];
int a[maxn];
int ans[maxn];
void update(int i,int l,int r,int q,int id){
if(l == r){
tree[i] = max(id,tree[i]);
}
else {
int mid = (l + r) >> 1;
if(q <= mid) update(i << 1,l,mid,q,id);
else update(i << 1 | 1,mid + 1,r,q,id);
tree[i] = max(tree[i<<1],tree[i<<1|1]);
}
}
int query(int i,int l,int r,int ql,int qr){
if(ql <= l && r <= qr)
return tree[i];
int mid = (l + r) >> 1;
int mx = 0;
if(ql <= mid) mx = max(mx,query(i << 1,l,mid,ql,qr));
if(qr > mid) mx = max(mx,query(i << 1 | 1,mid + 1,r,ql,qr));
return mx;
}
int main()
{
int n; scanf("%d",&n);
for(int i = 1;i <= n;i ++) scanf("%d",&a[i]);
memset(tree,0,sizeof(tree));
for(int i = n;i >= 1;i --){
int mx = query(1,1,1000000,a[i] + 1,1000000);
if(mx == 0) ans[i] = 0;
else ans[i] = mx - i;
update(1,1,1000000,a[i],i);
}
for(int i = 1;i <= n;i ++)
printf("%d ",ans[i]);
printf("\n");
return 0;
}