• HDU


    HDU - 5324 

    直接树套树维护dp, 或者分治 + 树状数组维护。

    好像内存卡得比较紧。

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #include<bits/stdc++.h>
    #define LL long long
    #define LD long double
    #define ull unsigned long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PLL pair<LL, LL>
    #define PLI pair<LL, int>
    #define PII pair<int, int>
    #define SZ(x) ((int)x.size())
    #define ALL(x) (x).begin(), (x).end()
    #define fio ios::sync_with_stdio(false); cin.tie(0);
    
    using namespace std;
    
    const int N = 5e4 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = (int)1e9 + 7;
    const double eps = 1e-8;
    const double PI = acos(-1);
    
    template<class T, class S> inline void add(T &a, S b) {a += b; if(a >= mod) a -= mod;}
    template<class T, class S> inline void sub(T &a, S b) {a -= b; if(a < 0) a += mod;}
    template<class T, class S> inline bool chkmax(T &a, S b) {return a < b ? a = b, true : false;}
    template<class T, class S> inline bool chkmin(T &a, S b) {return a > b ? a = b, true : false;}
    
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    
    int n;
    int L[N], R[N];
    int hsL[N], hsR[N];
    int totL, totR;
    int path[N];
    int dp[N];
    vector<int> ans;
    
    struct Node {
        int id, ls, rs;
    } a[N * 80];
    
    int treeTot;
    
    inline int newNode() {
        treeTot++;
        a[treeTot].id = 0;
        a[treeTot].ls = 0;
        a[treeTot].rs = 0;
        return treeTot;
    }
    
    void update(int p, int id, int l, int r, int &rt) {
        if(!rt) rt = newNode();
        if(dp[a[rt].id] < dp[id] || dp[a[rt].id] == dp[id] && id < a[rt].id) a[rt].id = id;
        if(l == r) return;
        int mid = l + r >> 1;
        if(p <= mid) update(p, id, l, mid, a[rt].ls);
        else update(p, id, mid + 1, r, a[rt].rs);
    }
    
    int query(int L, int R, int l, int r, int rt) {
        if(!rt) return 0;
        if(R < l || r < L || R < L) return 0;
        if(L <= l && r <= R) return a[rt].id;
        int mid = l + r >> 1;
        int id = query(L, R, l, mid, a[rt].ls);
        int rid = query(L, R, mid + 1, r, a[rt].rs);
        if(dp[id] < dp[rid] || dp[id] == dp[rid] && id > rid) id = rid;
        return id;
    }
    
    
    struct Bit {
        int a[N];
        void init() {
            for(int i = 1; i <= totL; i++) {
                a[i] = newNode();
            }
        }
        void modify(int x, int y, int id) {
            for(int i = x; i <= totL; i += i & -i) {
                update(y, id, 1, totR, a[i] );
            }
        }
        int query(int x, int y) {
            int id = 0;
            for(int i = x; i; i -= i & -i) {
                int rid = ::query(y, totR, 1, totR, a[i]);
                if(dp[id] < dp[rid] || dp[id] == dp[rid] && id > rid) id = rid;
            }
            return id;
        }
    } bit;
    
    void init() {
        totL = totR = treeTot =  0;
        ans.clear();
        for(int i = 1; i <= n; i++) {
            path[i] = 0;
        }
    }
    
    int main() {
        while(scanf("%d", &n) != EOF) {
            init();
            for(int i = 1; i <= n; i++) {
                scanf("%d", &L[i]);
                hsL[++totL] = L[i];
            }
            for(int i = 1; i <= n; i++) {
                scanf("%d", &R[i]);
                hsR[++totR] = R[i];
            }
            sort(hsL + 1, hsL + 1 + totL);
            sort(hsR + 1, hsR + 1 + totR);
            totL = unique(hsL + 1, hsL + 1 + totL) - hsL - 1;
            totR = unique(hsR + 1, hsR + 1 + totR) - hsR - 1;
            for(int i = 1; i <= n; i++) {
                L[i] = lower_bound(hsL + 1, hsL + 1 + totL, L[i]) - hsL;
                R[i] = lower_bound(hsR + 1, hsR + 1 + totR, R[i]) - hsR;
            }
            bit.init();
            int mx = 0;
            for(int i = n; i >= 1; i--) {
                int id = bit.query(L[i], R[i]);
                dp[i] = 1;
                if(id > 0) {
                    dp[i] = dp[id] + 1;
                    path[i] = id;
                }
                chkmax(mx, dp[i]);
                bit.modify(L[i], R[i], i);
            }
            int start = -1;
            for(int i = 1; i <= n; i++) {
                if(dp[i] == mx) {
                    start = i;
                    break;
                }
            }
            for(int i = start; i; i = path[i]) {
                ans.push_back(i);
            }
            printf("%d
    ", mx);
            for(int i = 0; i < SZ(ans); i++) {
                printf("%d%c", ans[i], " 
    "[i == SZ(ans) - 1]);
            }
        }
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    8月15日
    【k8s】创建 tls 类型 Secret
    使用 openssl 生成 CA 证书
    【k8s】跨 Namespace 使用 Ingress
    Windows 和 Centos 导入 CA 证书
    使用 openssl 生成服务器证书
    【k8s】nginx ingress 配置 https
    【k8s】通过 https 访问 dashboard
    1012day人口普查系统
    8.3日志
  • 原文地址:https://www.cnblogs.com/CJLHY/p/11314362.html
Copyright © 2020-2023  润新知