zoukankan      html  css  js  c++  java
  • 算法笔记--笛卡尔树模板

    详见:oi-wi
    模板:

    const int N = 3e6 + 10;
    struct Node {
        int id, val, par, ch[2], sz;
        inline bool operator < (Node & rhs) {return id < rhs.id;}
        inline void init(int _id, int _val, int _par) {
            id = _id, val = _val, par = _par, ch[0] = ch[1] = 0, sz = 1;
        }
    }tree[N];
    inline int cartesian_build(int n) {
        for (int i = 1; i <= n; ++i) {
            int k = i-1;
            while(tree[k].val > tree[i].val) k = tree[k].par;
            tree[i].ch[0] = tree[k].ch[1];
            tree[tree[i].ch[0]].par = i;
            tree[k].ch[1] = i;
            tree[i].par = k;
        }
        return tree[0].ch[1];
    }
    

    例题:LightOJ - 1083
    代码:

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize(4)
    #include<bits/stdc++.h>
    using namespace std;
    #define y1 y11
    #define fi first
    #define se second
    #define pi acos(-1.0)
    #define LL long long
    //#define mp make_pair
    #define pb emplace_back
    #define ls rt<<1, l, m
    #define rs rt<<1|1, m+1, r
    #define ULL unsigned LL
    #define pll pair<LL, LL>
    #define pli pair<LL, int>
    #define pii pair<int, int>
    #define piii pair<pii, int>
    #define pdd pair<double, double>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define debug(x) cerr << #x << " = " << x << "
    ";
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    //head
    
    const int N = 3e4 + 10;
    struct Node {
        int id, val, par, ch[2], sz;
        bool operator < (Node & rhs) {return id < rhs.id;}
        void init(int _id, int _val, int _par) {
            id = _id, val = _val, par = _par, ch[0] = ch[1] = 0, sz = 1;
        }
    }tree[N];
    int cartesian_build(int n) {
        for (int i = 1; i <= n; ++i) {
            int k = i-1;
            while(tree[k].val > tree[i].val) k = tree[k].par;
            tree[i].ch[0] = tree[k].ch[1];
            tree[tree[i].ch[0]].par = i;
            tree[k].ch[1] = i;
            tree[i].par = k;
        }
        return tree[0].ch[1];
    }
    LL ans;
    void dfs(int u) {
        if(tree[u].ch[0]) dfs(tree[u].ch[0]), tree[u].sz += tree[tree[u].ch[0]].sz;
        if(tree[u].ch[1]) dfs(tree[u].ch[1]), tree[u].sz += tree[tree[u].ch[1]].sz;
        ans = max(ans, tree[u].sz*1LL*tree[u].val);
    }
    int T, n, a[N], rt;
    int main() {
        scanf("%d", &T);
        for (int cs = 1; cs <= T; ++cs) {
            scanf("%d", &n);
            tree[0].init(0, 0, 0);
            for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), tree[i].init(i, a[i], 0);
            rt = cartesian_build(n);
            ans = 0, dfs(rt);
            printf("Case %d: %lld
    ", cs, ans);
        }
        return 0;
    }
    
  • 相关阅读:
    swift延时执行
    Swift3.0 — CocoaAsyncSocket客户端(Socket通信)
    SnapKit配置过程
    iOS App图标和启动画面尺寸
    mac升级到10.13 CocoaPods不能使用
    上传app到app store遇到 An error occurred uploading to the iTunes Store.(iTunes Store Operation Failed)的解决方法
    swift高斯模糊的自定义view
    Swift 实现部分圆角
    android 代码设置、打开wifi热点及热点的连接
    自定义android Dialog
  • 原文地址:https://www.cnblogs.com/widsom/p/11258675.html
Copyright © 2011-2022 走看看