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;
    }
    
  • 相关阅读:
    Java线程基础(二)
    Java线程基础(一)
    泛型集合List的详细用法
    Java中日期格式(String、Date、Calendar)的相互转换
    重写Java中包装类的方法
    Java的集合框架(第一次小结)
    node.js 调用mysql 数据库
    win10 系统解决mysql中文乱码问题
    vue-echarts图表
    文件上传的几个例子
  • 原文地址:https://www.cnblogs.com/widsom/p/11258675.html
Copyright © 2011-2022 走看看