码迷,mamicode.com
首页 > 其他好文 > 详细

严格递增序列

时间:2020-12-09 12:09:28      阅读:5      评论:0      收藏:0      [点我收藏+]

标签:col   二分   return   std   c++   include   name   nbsp   can   

 想了很久没想出来,无奈之下看了题解。

如果 a[i] < a[j] ,因为要保证都是整数,所以 j - i 必须要小于 a[j] - a[i] ,才能使区间 i,j 内的所有数均可修改。

j - i < a[j] - a[i] 移项得 a[i] - i < a[j] - j。

所以 a[i] 里要存 a[i] - i 的值,则求出最长不下降子序列后就可以保证其中的数都能够修改。

105 数据 n2 肯定跑不过,所以要用 n log n 的求法。

#include<bits/stdc++.h>
using namespace std;
int n,a[100001],h[100001],ans;
int main()
{
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++)
    {
        scanf("%d",&a[i]);
        a[i] -= i;
    }
    int cnt=1;
    h[cnt] = a[1];
    for(int i = 2;i <= n;i ++)
    {
        if(a[i] > h[cnt]) h[++cnt]=a[i];
        else
        {
            int tmp=lower_bound(h + 1,h + 1 + cnt,a[i]) - a;//二分查找
            h[tmp]=a[i];
        }
    }
    cout<<n - cnt<<endl;
    return 0;
}

 

严格递增序列

标签:col   二分   return   std   c++   include   name   nbsp   can   

原文地址:https://www.cnblogs.com/ying-xue/p/14088071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!