zoukankan      html  css  js  c++  java
  • Codeforces Round #345 (Div. 1) D

    D - Zip-line

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PII pair<int, int>
    
    using namespace std;
    
    const int N = 4e5 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 + 7;
    
    int n, m, tot, h[N], hs[N], dp[2][N], stk[N], cnt[N], LIS;
    bool is[N];
    
    struct ChairmanTree {
        struct node {
            int mx, l, r;
        } a[N * 20];
        int tot, root[N];
        void update(int p, int val, int l, int r, int &x, int y) {
            x = ++tot; a[x] = a[y];
            a[x].mx = max(a[x].mx, val);
            if(l == r) return ;
            int mid = l + r >> 1;
            if(p <= mid) update(p, val, l, mid, a[x].l, a[y].l);
            else update(p, val, mid + 1, r, a[x].r, a[y].r);
        }
        int query(int L, int R, int l, int r, int x) {
            if(hs[r] < L || hs[l] > R) return 0;
            if(hs[l] >= L && hs[r] <= R) return a[x].mx;
            int ans = 0, mid = l + r >> 1;
            if(L <= hs[mid]) ans = query(L, R, l, mid, a[x].l);
            if(R > hs[mid]) ans = max(ans, query(L, R, mid + 1, r, a[x].r));
            return ans;
        }
    }ct[2];
    
    void getLIS() {
        memset(stk, inf, sizeof(stk));
        for(int i = 1; i <= n; i++) {
            dp[0][i] = lower_bound(stk, stk + N, h[i]) - stk + 1;
            stk[dp[0][i] - 1] = h[i];
            LIS = max(LIS, dp[0][i]);
        }
        memset(stk, inf, sizeof(stk));
        for(int i = n; i >= 1; i--) {
            dp[1][i] = lower_bound(stk, stk + N, -h[i]) - stk + 1;
            stk[dp[1][i] - 1] = -h[i];
        }
        for(int i = 1; i <= n; i++) {
            if(dp[0][i] + dp[1][i] == LIS + 1) {
                is[i] = true;
                cnt[dp[0][i]]++;
            }
        }
    }
    
    int main() {
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++) {
            scanf("%d", &h[i]);
            hs[++tot] = h[i];
        }
        sort(hs + 1, hs + 1 + tot);
        tot = unique(hs + 1, hs + 1 + tot) - hs - 1;
    
        for(int i = 1; i <= n; i++)
            h[i] = lower_bound(hs + 1, hs + 1 + tot, h[i]) - hs;
        getLIS();
    
        for(int i = 1; i <= n; i++)
            ct[0].update(h[i], dp[0][i], 1, tot, ct[0].root[i], ct[0].root[i-1]);
        for(int i = n; i >= 1; i--)
            ct[1].update(h[i], dp[1][i], 1, tot, ct[1].root[i], ct[1].root[i+1]);
    
        while(m--) {
            int a, b;
            scanf("%d%d", &a, &b);
            int ans = is[a] ? LIS - 1 : LIS;
            ans = max(ans, ct[0].query(1, b - 1, 1, tot, ct[0].root[a-1])
                      + ct[1].query(b + 1, inf, 1, tot, ct[1].root[a+1]) + 1);
            if(is[a] && cnt[dp[0][a]] > 1) {
                ans = max(ans, LIS);
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    FLASH置于底层
    图片等比缩放
    fedora 系统使用 Broadcom BCM4312 无线网卡(转)
    ubuntu语言问题
    轻松安装、卸载Linux软件
    redhat6.0下使用vnc
    http网络安装centos 5.5系统总结
    如何在windows下搭建python的IDE开发环境
    对做技术的一点思考
    C++继承类和基类之间成员函数和虚函数调用机制
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9699650.html
Copyright © 2011-2022 走看看