• [存档]Young Tableau


    you know...

    #include <cassert>
    #include <algorithm>
    using namespace std;
    
    const int INF = 1111111111;
    const int M = 1111;
    const int N = 1111;
    
    //minimum young_tableau
    struct young_tableau {
        int a[M][N];
    
        young_tableau() {
            for (int i = 0; i < M; ++i)
                for (int j = 0; j < N; ++j)
                    a[i][j] = INF;
        }
    
        bool empty() {
            return !(a[0][0]<INF);
        }
    
        bool full() {
            return a[M-1][N-1]<INF;
        }
    
        //O(1)
        int top() {
            assert(!empty());
            return a[0][0];
        }
    
        void sink(int i, int j) {
            int mi = i, mj = j;
            if (i<M-1 && a[i+1][j]<a[mi][mj]) mi = i+1, mj = j;
            if (j<N-1 && a[i][j+1]<a[mi][mj]) mi = i, mj = j+1;
            if (mi!=i || mj!=j) {
                swap(a[i][j], a[mi][mj]);
                sink(mi, mj);
            }
        }
    
        //O(M+N)
        void pop() {
            assert(!empty());
            a[0][0] = INF;
            sink(0, 0);
        }
    
        void rise(int i, int j) {
            int mi = i, mj = j;
            if (i>0 && a[mi][mj]<a[i-1][j]) mi = i-1, mj = j;
            if (j>0 && a[mi][mj]<a[i][j-1]) mi = i, mj = j-1;
            if (mi!=i || mj!=j) {
                swap(a[i][j], a[mi][mj]);
                rise(mi, mj);
            }
        }
    
        //O(M+N)
        void push(int key) {
            assert(!full());
            a[M-1][N-1] = key;
            rise(M-1, N-1);
        }
    
        //O(M+N)
        //(M, N) for not found
        pair<int, int> lower_bound(int key) {
            pair<int, int> res = make_pair(M, N);
            int i = 0, j = N-1;
            while (i<M && j>=0) {
                if (a[i][j]<key) i++;
                else res = make_pair(i, j--);
            }
            return i<M&&j>=0 ? res : make_pair(M, N);
        }
    
        pair<int, int> find(int key) {
            pair<int, int> res = lower_bound(key);
            if (res==make_pair(M, N) || key<a[res.first][res.second])
                return make_pair(M, N);
            else
                return res;
        }
    };
  • 相关阅读:
    详解Oracle安装与配置.
    如何做大规模软件的配置管理
    关于软件权限设置的一点心得体会
    使用RDLC报表(一)
    详细解析Linux scp命令的应用
    spring propertyplaceholderconfigurer
    hibernate ehcache
    由Eclipse内存不足谈谈JVM内存
    事务策略: API 层策略
    什么叫控制反转(IoC )
  • 原文地址:https://www.cnblogs.com/jffifa/p/2740109.html
Copyright © 2020-2023  润新知