• SCAU_WeiShenWahle 之省赛任务


    每一项按顺序理解之后裸敲,每个代码最多15分钟,用模板题来测,超过15分钟算未理解

    线段树

    平衡树( Treap , sbt , spt )

    #include <iostream>
    #include <cstdio>
    using namespace std ;
    const int N = 1000010 ;
    struct node {
        int lr , rr , r , v ;
        node(){}
        node( int lr , int rr , int r , int v ):lr(lr),rr(rr),r(r),v(v) {}
    };
    struct Treap {
        node e[N];
        int root , size ;
        void init() {
            size = 0 ; root = -1 ;
        }
        void Rot_l( int &o ) {
            int tmp = e[o].rr ;
            e[o].rr = e[tmp].lr ;
            e[tmp].lr = o ;
            o = tmp ;
        }
        void Rot_r( int &o ) {
            int tmp = e[o].lr ;
            e[o].lr = e[tmp].rr ;
            e[tmp].rr = o ;
            o = tmp ;
        }
        void insert( int &o , int v , int r ) {
            if( o == -1 ) {
                o = size++ ;
                e[o].lr = e[o].rr = -1 ;
                e[o].r = r , e[o].v = v ;
            } else if( v < e[o].v ) {
                insert( e[o].lr , v , r ) ;
                if( e[ e[o].lr ].r > e[o].r ) Rot_r(o) ;
            } else {
                insert( e[o].rr , v , r );
                if( e[ e[o].rr ].r > e[o].r ) Rot_l(o) ;
            }
        }
        void remove( int &o , int x ) {
            if( e[o].v == x ) {
                if( e[o].lr == -1 ) {
                    o = e[o].rr ;
                } else if( e[o].rr == -1 ) {
                    o = e[o].lr ;
                } else {
                    if( e[ e[o].lr ].r > e[ e[o].rr ].r ) {
                        Rot_r(o);
                        remove( e[o].rr , x );
                    } else {
                        Rot_l(o);
                        remove( e[o].lr , x ) ;
                    }
                }
            } else if( e[o].v > x ) {
                remove( e[o].lr , x ) ;
            } else {
                remove( e[o].rr , x ) ;
            }
        }
        int Find_max( int o ) {
            if( o == -1 ) return -1 ;
            while( e[o].rr != -1 ) o = e[o].rr ;
            cout << e[o].r << endl ;
            return e[o].v ;
        }
        int Find_min( int o ) {
            if( o == -1 ) return -1 ;
            while( e[o].lr != -1 ) o = e[o].lr ;
            cout << e[o].r << endl ;
            return e[o].v ;
        }
    } T ;
    
    int Run () {
        int op , x , y ;
        T.init() ;
        while( cin >> op ) {
            if( !op ) {
                break ;
            } else if( op == 1 ) {
                cin >> x >> y ;
                T.insert( T.root , y , x ) ;
            } else if( op == 2 ) {
                x = T.Find_max( T.root ) ;
                if( x == -1 ) { cout << '0' << endl ; continue ; }
                T.remove( T.root , x ) ;
            } else {
                x = T.Find_min( T.root ) ;
                if( x == -1 ) { cout << '0' << endl ; continue ; }
                T.remove( T.root , x ) ;
            }
        }
        return 0 ;
    }
    int main () {
        ios::sync_with_stdio(0);
        return Run() ;
    }
    Treap
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    const int N = 2000010;
    const int M = 10000010;
    int mp[M];
    struct node {
        int lr , rr , siz , v ;
        node(){}
        node( int lr , int rr , int siz , int v ):lr(lr),rr(rr),siz(siz),v(v){}
    };
    struct SBT {
        node e[N] ;
        int rt , tot;
        void init() { rt = tot = 1 ; }
        void Rot_l( int &o ) {
            int y = e[o].rr ;
            e[o].rr = e[y].lr;
            e[y].lr = o ;
            e[y].siz = e[o].siz ;
            e[o].siz = e[ e[o].lr ].siz + e[ e[o].rr ].siz + 1 ;
            o = y ;
        }
        void Rot_r( int &o ) {
            int y = e[o].lr ;
            e[o].lr = e[y].rr ;
            e[y].rr = o ;
            e[y].siz = e[o].siz ;
            e[o].siz = e[ e[o].lr ].siz + e[ e[o].rr ].siz + 1 ;
            o = y ;
        }
        void Maintain( int &o , bool flag ) {
            if( !flag ) {
                if( e[ e[ e[o].lr ].lr ].siz > e[ e[o].rr ].siz ) {
                    Rot_r(o) ;
                } else if( e[ e[ e[o].lr ].rr ].siz > e[ e[o].rr ].siz ) {
                    Rot_l( e[o].lr ) ;
                    Rot_r(o);
                } else return ;
            } else {
                if( e[ e[ e[o].rr ].rr ].siz > e[ e[o].lr ].siz ) {
                    Rot_l(o) ;
                } else if( e[ e[ e[o].rr ].lr ].siz > e[ e[o].lr ].siz ) {
                    Rot_r( e[o].rr ) ;
                    Rot_l(o);
                } else return ;
            }
            Maintain( e[o].lr , false ) ;
            Maintain( e[o].rr , true ) ;
            Maintain( o , false ) ;
            Maintain( o , true ) ;
        }
        void Insert( int &o , int v ) {
            if( !o ) {
                o = tot++ ;
                e[o] = node( 0 , 0 , 1 , v ) ;
                return ;
            } else {
                e[o].siz++ ;
                if( v < e[o].v ) {
                    Insert( e[o].lr , v ) ;
                } else {
                    Insert( e[o].rr , v ) ;
                }
            }
            Maintain(o, v >= e[o].v ) ;
        }
        void Delete( int &o , int v ) {
            if( !o ) return ;
            e[o].siz-- ;
            if( v < e[o].v ) Delete( e[o].lr , v ) ;
            else if( v > e[o].v ) Delete( e[o].rr , v ) ;
            else {
                if( e[o].lr == 0 ) o = e[o].rr ;
                else if( e[o].rr == 0 ) o = e[o].lr ;
                else {
                    int y = e[o].rr ;
                    while( e[y].lr ) y = e[y].lr ;
                    e[o].v = e[y].v ;
                    Delete( e[o].rr , e[y].v ) ;
                }
            }
        }
        int Find_Max( int &o ) {
            int y = o ;
            while( e[y].rr ) y = e[y].rr ;
            return e[y].v ;
        }
        int Find_Min( int &o ) {
            int y = o ;
            while( e[y].lr ) y = e[y].lr ;
            return e[y].v ;
        }
    } T ;
    int Run() {
        int op , x , y ; T.init();
        while( cin >> op ) {
            if( op == 0 ) break ;
            else if( op == 1 ) {
                cin >> x >> y ;
                mp[y] = x ;
                T.Insert( T.rt , y ) ;
            } else if( op == 2 ) {
                if( T.e[T.rt].siz == 0 ) {
                    cout << '0' << endl ;
                } else {
                    int v = T.Find_Max( T.rt ) ;
                    cout << mp[v] << endl ;
                    T.Delete(T.rt,v);
                }
            } else {
                if( T.e[T.rt].siz == 0 ) {
                    cout << '0' << endl ;
                } else {
                    int v = T.Find_Min( T.rt );
                    cout << mp[v] << endl ;
                    T.Delete(T.rt,v);
                }
            }
        }
        return 0 ;
    }
    int main()
    {
        #ifdef LOCAL
            freopen("in","r",stdin);
        #endif
        ios::sync_with_stdio(0);
        return Run();
    }
    Size Balance Tree

    二叉堆 

    const int N = 1000010 ;
    int h[N] , size ;
    void Modify( int p ) {
        if( p == 1 ) return ;
        if( h[p>>1] > h[p] ) swap( h[p>>1] , h[p] ) , Modify( p>>1 ) ;
    }
    
    void Update( int p ) {
        int l = p<<1 , r = p<<1|1 , f = p ;
        if( l <= size && h[l] < h[f] ) f = l ;
        if( r <= size && h[r] < h[f] ) f = r ;
        if( p != f ) swap( h[f] , h[p] ) , Update(f) ;
    }
    
    void Pop() {
        swap( h[1] , h[size--] ) ; Update(1) ;
    }
    
    void Push( int x ) {
        h[++size] = x ; Modify( size ) ;
    }
    View Code

    左偏树

     最大优先 ~ 可合并堆

    const int N = 100010 ;
    struct node {
        int lr , rr , dis , fa , val ;
    } T[N] ;
    
    inline int find( int k ) { return k == T[k].fa ? k : T[k].fa = find(T[k].fa) ; }
    
    int Merge( int a , int b ) {
        if( !a ) return b ;
        if( !b ) return a ;
        if( T[a].val < T[b].val ) swap( a , b ) ;
        T[a].rr = Merge( b , T[a].rr ) ;
        T[ T[a].rr ].fa = a ;
        if( T[ T[a].lr ].dis < T[ T[a].rr ].dis ) swap( T[a].lr , T[a].rr ) ;
        if( T[a].rr == 0 ) T[a].dis = 0 ;
        else T[a].dis = T[ T[a].rr ].dis + 1 ;
        return a ;
    }
    
    int Pop( int a ) {
        int l = T[a].lr , r = T[a].rr ;
        T[l].fa = l , T[r].fa = r ;
        T[a].lr = T[a].rr = T[a].dis = 0 ;
        return Merge( l , r ) ;
    }
    View Code

    最短路( Dij , Spfa ) 

    匈牙利

    HK

    带花树

    Dinic 

    const int N = 404;
    const int M = 30030 ;
    const int inf = 1e9 ;
    
    int s , t , n , m ;
    int eh[N] , ef[M] , et[M] , ec[M] , nxt[M] , tot ;
    int cur[N] , d[N] ;
    bool vis[N] ;
    
    void init() {
        memset( eh , -1 , sizeof eh ) ;
        tot = 0 ;
    }
    void addedge( int u , int v,  int c , int f ) {
        et[tot] = v , ec[tot] = c , ef[tot] = f , nxt[tot] = eh[u] , eh[u] = tot++ ;
        et[tot] = u , ec[tot] = 0 , ef[tot] = f , nxt[tot] = eh[v] , eh[v] = tot++ ;
    }
    
    bool bfs() {
        memset( vis , false , sizeof vis ) ;
        queue<int>que;
        que.push(s);
        vis[s] = true ;
        d[s] = 0 ;
        while( !que.empty() ) {
            int u = que.front() ; que.pop() ;
            for( int i = eh[u] ; ~i ; i = nxt[i] ) {
                int v = et[i] ;
                if( !vis[v] && ef[i] < ec[i] ) {
                    vis[v] = true ;
                    d[v] = d[u] + 1 ;
                    que.push(v);
                }
            }
        }
        return vis[t] ;
    }
    
    int dfs( int x , int a ) {
        if( x == t || a == 0 ) return a ;
        int flow = 0 , F ;
        for( int &i = cur[x] ; ~i ; i = nxt[i] ) {
            int v = et[i] , c = ec[i] , &f = ef[i] ;
            if( d[x] + 1 == d[v] && ( F = dfs( v , min( a , c - f ) ) ) > 0  )  {
                    f += F , ef[i^1] -= F , a -= F , flow += F ;
                    if( a == 0 ) break ;
            }
        }
        return flow ;
    }
    
    int MF() {
        int flow = 0 ;
        while( bfs() ) {
            memcpy( cur , eh , sizeof eh ) ;
            flow += dfs( s , 10000000 );
        }
        return flow ;
    }
    View Code

    ISAP

    const int N = 1020 ;
    const int M = 300010 ;
    const int INF = 0x3f3f3f3f;
    int n , m , s , t ;
    int eh[N] , et[M] , nxt[M] , ef[M] , ec[M] , tot ;
    
    void init() {
            memset( eh , -1 , sizeof eh ) ;
            tot = 0 ;
    }
    
    void addedge( int u , int v , int c ) {
            et[tot] = v ; ec[tot] = c ; ef[tot] = 0 ; nxt[tot] = eh[u] ; eh[u] = tot++;
            et[tot] = u ; ec[tot] = 0 ; ef[tot] = 0 ; nxt[tot] = eh[v] ; eh[v] = tot++;
    }
    
    int d[N] , cur[N] , pre[N] , gap[N] ;
    int Q[M] , S[M] ;
    
    void bfs() {
            memset( d , -1 , sizeof d ) ;
            memset( gap , 0 , sizeof gap ) ;
            int head = 0 , tail = 0 ;
            d[t] = 0 ; gap[0]++ ;
            Q[tail++] = t ;
            while( head < tail ) {
                    int u = Q[head++] ;
                    for( int i = eh[u] ; ~i ; i = nxt[i] ) {
                            int v = et[i] ;
                            if( d[v] != -1 ) continue ;
                            Q[tail++] = v ;
                            d[v] = d[u] + 1;
                            gap[ d[v] ]++;
                    }
            }
    }
    
    int Sap( int n ) {
            bfs();
            memcpy( cur , eh , sizeof eh ) ;
            int top = 0 , u = s  , flow = 0 ;
            while( d[s] < n ) {
                    if( u == t ) {
                            int Min = INF  , inser ;
                            for( int i = 0 ; i < top ; ++i ) {
                                    if( Min > ec[ S[i] ] - ef[ S[i] ] ) {
                                            Min = ec[ S[i] ] - ef[ S[i] ] ;
                                            inser = i ;
                                    }
                            }
                            for( int i = 0 ; i < top ; ++i ) {
                                    ef[ S[i] ] += Min ;
                                    ef[ S[i]^1 ] -= Min ;
                            }
                            flow += Min ;
                            top = inser ;
                            u = et[ S[top]^1 ];
                            continue ;
                    }
                    bool flag = false ;
                    int v ;
                    for( int i = cur[u] ; ~i ; i = nxt[i] ) {
                            v = et[i] ;
                            if( ec[i] > ef[i] && d[v] + 1 == d[u] ) {
                                    flag = true ;
                                    cur[u] = i ;
                                    break ;
                            }
                    }
                    if( flag ) {
                            S[top++] = cur[u] ;
                            u = v ;
                            continue ;
                    }
                    int Min = n ;
                    for( int i = eh[u] ; ~i ; i = nxt[i] ) {
                            if( ec[i] > ef[i] && d[ et[i] ] < Min ) {
                                    Min = d[ et[i] ] ;
                                    cur[u] = i  ;
                            }
                    }
                    gap[ d[u] ]-- ;
                    if( !gap[ d[u] ] ) return flow  ;
                    d[u] = Min + 1 ;
                    gap[ d[u] ]++ ;
                    if( u != s  ) u = et[ S[--top]^1 ] ;
            }
            return flow ;
    }
    View Code

    MCMF 

    const int N = 10000;
    const int M = 100000;
    const int INF = 0x3f3f3f3f;
    
    int eh[N] , ec[M] , et[M] , ef[M] , ew[M] , nxt[M] , tot ;
    int pre[N] , dis[N] ;
    bool vis[N] ;
    int s , t , n , m , k ;
    void init() {
        memset( eh, -1 , sizeof eh );
        tot = 0 ;
    }
    void addedge( int u , int v , int cap , int cost ) {
        et[tot] = v ; ef[tot] = 0 ; ec[tot] = cap ; ew[tot] = cost ; nxt[tot] = eh[u] ; eh[u] = tot++ ;
        et[tot] = u ; ef[tot] = 0 ; ec[tot] = 0 ; ew[tot] = -cost ; nxt[tot] = eh[v] ; eh[v] = tot++ ;
    }
    
    bool spfa() {
        memset( vis, false, sizeof vis ) ;
        memset( dis ,0x3f , sizeof dis ) ;
        memset( pre , -1 ,sizeof pre ) ;
        queue<int>que;
        dis[s] = 0 ;
        vis[s] = true ;
        que.push(s) ;
        while( !que.empty() ) {
            int u = que.front() ; que.pop() ;
            vis[u] =false ;
            for( int i = eh[u] ; ~i ; i = nxt[i] ) {
                int v = et[i] ;
                if( ec[i] > ef[i] && dis[v] > dis[u] + ew[i] ) {
                    dis[v] = dis[u] + ew[i] ;
                    pre[v] = i ;
                    if( !vis[v] ) {
                        vis[v] = true ;
                        que.push(v) ;
                    }
                }
            }
        }
        return pre[t] != -1 ;
    }
    
    int MCMF( int &cost ) {
        int flow = 0 ;
        cost = 0 ;
        while( spfa() ) {
            int Min = INF ;
            for( int i = pre[t] ; ~i ; i = pre[ et[i^1] ] ) {
                if( Min > ec[i] - ef[i] ) {
                    Min = ec[i] - ef[i] ;
                }
            }
            for( int i = pre[t] ; ~i ; i = pre[ et[i^1] ] ) {
                ef[i] += Min ;
                ef[i^1] -= Min ;
                cost += ew[i] * Min ;
            }
            flow += Min ;
        }
        return flow ;
    }
    View Code

    BCC

    SCC

    KMP

    Manancher

    AC自动机

    后缀数组

    后缀自动机

    DXL(精确覆盖,模糊覆盖)

  • 相关阅读:
    HTML转码码表
    【转】javascript 小技巧 JavaScript[对象.属性]集锦
    枯燥的数据库插入修改,投机取巧的方法
    asp.net jquery ajax处理json数据
    .net生成zTree标准形式的json数据源
    SqlDateTime 溢出
    limit 与 offset
    祖国六十大寿阅兵
    Esri for Window Phone 7(一) 加载BingMap
    Create a Settings Page for Windows phone
  • 原文地址:https://www.cnblogs.com/hlmark/p/4464256.html
Copyright © 2020-2023  润新知