zoukankan      html  css  js  c++  java
  • HDU

    http://acm.hdu.edu.cn/showproblem.php?pid=3564

    题意

    给出1~n的插入顺序,要求每次插入之后的LIS

    分析

    首先用线段树还原出最终序列。因为插入的顺序是按1-n的顺序插入的,我们还原位置后,直接对位置进行求LIS,即为当前数的LIS。这里根据数据是从小到大插入的性质,用了比较巧妙的解法。先把每个数的位置保存起来,从小到大遍历,二分查找当前数据的位置处在已求出的LIS中的位置,比较长度后更新,再加入这个数据的位置,因为数据是从小到大的。

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    #include<map>
    #include<set>
    #define rep(i,e) for(int i=0;i<(e);i++)
    #define rep1(i,e) for(int i=1;i<=(e);i++)
    #define repx(i,x,e) for(int i=(x);i<=(e);i++)
    #define X first
    #define Y second
    #define PB push_back
    #define MP make_pair
    #define mset(var,val) memset(var,val,sizeof(var))
    #define scd(a) scanf("%d",&a)
    #define scdd(a,b) scanf("%d%d",&a,&b)
    #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define pd(a) printf("%d
    ",a)
    #define scl(a) scanf("%lld",&a)
    #define scll(a,b) scanf("%lld%lld",&a,&b)
    #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
    #define IOS ios::sync_with_stdio(false);cin.tie(0)
    #define lc idx<<1
    #define rc idx<<1|1
    #define lson l,mid,lc
    #define rson mid+1,r,rc
    using namespace std;
    typedef long long ll;
    template <class T>
    void test(T a){cout<<a<<endl;}
    template <class T,class T2>
    void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
    template <class T,class T2,class T3>
    void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
    const int N = 1e6+10;
    const int inf = 0x3f3f3f3f;
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    const ll mod = 1000000007;
    int T;
    void testcase(){
        printf("Case #%d:
    ",++T);
    }
    const int MAXN = 2e5+10;
    const int MAXM = 30;
    struct node{
        int l,r,w;
    }tree[MAXN<<2];
    int n,len;
    int ans[MAXN],val[MAXN],pos[MAXN],dp[MAXN];
    void build(int l,int r,int idx){
        tree[idx].l=l,tree[idx].r=r;
    //    tree[idx].w=r-l+1;
        if(l==r){
            tree[idx].w=1;
            return;
        }
        int mid = (l+r)>>1;
        build(lson);
        build(rson);
        tree[idx].w=tree[lc].w+tree[rc].w;
    }
    void update(int pos,int val,int idx){
        if(tree[idx].l==tree[idx].r){
            tree[idx].w--;
            ans[val]=tree[idx].l;
            return;
        }
        if(pos<=tree[lc].w) update(pos,val,lc);
        else update(pos-tree[lc].w,val,rc);
        tree[idx].w=tree[lc].w+tree[rc].w;
    }
    int bin(int k){
        int l=1,r=len;
        while(l<=r){
            int mid = (l+r)>>1;
            if(k>dp[mid]) l=mid+1;
            else r=mid-1;
        }
        return l;
    }
    int main() {
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif // LOCAL
        int t;
        scd(t);
        T=0;
        while(t--){
            scd(n);
            for(int i=1;i<=n;i++) scd(pos[i]),val[i]=i;
            build(1,n,1);
            for(int i=n;i>0;i--) update(pos[i]+1,val[i],1);
            testcase();
            len=0;
            for(int i=1;i<=n;i++){
                int k =bin(ans[i]);
                len=max(len,k);
                dp[k]=ans[i];
                printf("%d
    ",len);
            }
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    沃尔玛的问题
    为什么没有“128位”的通用处理器
    用户模式驱动模型(UMDF)简介
    Live Space的谢幕
    Cheap HDD bracket
    让 UV4 支持STC 单片机
    SQLServer 分组查询相邻两条记录的时间差
    ERP采购系统流程
    C++运算符的优先级和结合性
    Entity Framework 4.1延时加载与贪婪加载之我的理解和数据库中如何存入图片
  • 原文地址:https://www.cnblogs.com/fht-litost/p/9292016.html
Copyright © 2011-2022 走看看