码迷,mamicode.com
首页 > 其他好文 > 详细

SCAU_WeiShenWahle 之省赛任务

时间:2015-04-29 00:31:41      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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

线段树

 

平衡树( Treap , sbt , spt )

 

二叉堆 

 

技术分享
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

 

左偏树

 

最短路( 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(精确覆盖,模糊覆盖)

 

SCAU_WeiShenWahle 之省赛任务

标签:

原文地址:http://www.cnblogs.com/hlmark/p/4464256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!