SCAU_WeiShenWahle 之省赛任务
生活随笔
收集整理的這篇文章主要介紹了
SCAU_WeiShenWahle 之省赛任务
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
每一項(xiàng)按順序理解之后裸敲,每個(gè)代碼最多15分鐘,用模板題來(lái)測(cè),超過(guò)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 LOCALfreopen("in","r",stdin);#endifios::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?
左偏樹
?最大優(yōu)先 ~ 可合并堆
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自動(dòng)機(jī)
?
后綴數(shù)組
?
后綴自動(dòng)機(jī)
?
DXL(精確覆蓋,模糊覆蓋)
?
轉(zhuǎn)載于:https://www.cnblogs.com/hlmark/p/4464256.html
總結(jié)
以上是生活随笔為你收集整理的SCAU_WeiShenWahle 之省赛任务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于使用百度地图的总结
- 下一篇: 安卓--selector简单使用