zoukankan      html  css  js  c++  java
  • hdu5256 二分求LIS+思维

    解题的思路很巧,为了让每个数之间都留出对应的上升空间,使a[i]=a[i]-i,然后再求LIS

    另外二分求LIS是比较快的

    #include<bits/stdc++.h>
    #define maxn 1000005
    #define ll long long 
    
    using namespace std;
    
    int len,n,a[maxn],lis[maxn];
    
    int main(){
        int t;
        scanf("%d",&t);
        for(int tt=1;tt<=t;tt++){
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                lis[i]=-9999999;
            }
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            for(int i=1;i<=n;i++) a[i]=a[i]-i;
            len=0;lis[0]=a[1];
            for(int i=2;i<=n;i++){
                if(a[i]>=lis[len-1]) lis[len++]=a[i];
                else {
                    int pos=upper_bound(lis,lis+len,a[i])-lis;
                    lis[pos]=a[i];
                }
            }
            printf("Case #%d:
    %d
    ",tt,n-len);
        }                
        return 0;
    }
  • 相关阅读:
    String和stringbuffer
    项目中Orcale存储过程优化记录
    大数据项目中的Oracle查询优化
    洛谷P3402 可持久化并查集
    Gym
    CodeForces
    Gym
    Gym
    UVA
    Kattis
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10151309.html
Copyright © 2011-2022 走看看