SCAU_WeiShenWahle 之省赛任务

每一项按顺序理解之后裸敲,每个代码最多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 ) ;
}

左偏树

最短路( 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 ;
}

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 ;
}

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 ;
}

BCC

SCC

KMP

Manancher

AC自动机

后缀数组

后缀自动机

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

时间: 2024-10-24 17:18:45

SCAU_WeiShenWahle 之省赛任务的相关文章

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 B

<神无月>作为盛大游戏2017年的全新原创大作,其开发团队在自研实力强大的传世工作室基础之上,还有美树本晴彦等日本一线知名画师及日本游戏音乐大师崎元仁加盟参与制作.目前正在不限号内测中,有很多玩家进入到神无月的世界中. 在神无月中,有着玩家之间切磋的排位赛,其段位主要分为五大段位,从低到高依次为:新兵.菁英.战将.统帅.王者.每个玩家只有从新兵段位慢慢努力,一点点晋级才能到达王者段位.成为一个王者是每一个玩家的追求和心愿. 假设神无月的段位系统如下: 从低到高的段位依次简记为:D.C.B.A.

赛码网线上PHP编译器报错

360笔试题,在赛码网提交后报错“Runtime Error:[ERROR] A Not allowed system call: runid:6660947 callid:25” 题目链接:http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3980&konwledgeId=42 报错内容: 产生该错误的代码: 申明:不是因为代码逻辑原因产生错误,首先代码逻辑是按照官方给出的答案通过php实现:其次,同样的用例在本地运行(

赛门铁克23亿美元打造全球最大数字安全平台

作者:茱莉叶 [IT战略家] 赛门铁克打造全球最大数字安全平台   赛门铁克周日同意以23亿美元收购消费者身份防窃取保护服务商LifeLock,打造"全球最大的消费者和家庭数字安全平台",扩展赛门铁克的消费者系列产品. 赛门铁克采用现金和7.5亿美元新债务的形式,以每股24美元,高于LifeLock上周五收盘价16%的价格进行收购.截至上周五,LifeLock股价在2016年上涨了45%,市值达到约19.5亿美元.该交易预计将于2017年第一个季度完成.赛门铁克的董事会也将公司的股票回

UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站

这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看过那一场的题了.昨天我的队友的高中同学建议我们一起来打一打这场比赛吧,然后我才再次回顾这场比赛.结果一堆琐事,我一共也没有做多久的题,我的队友扎扎实实看了5个小时的题,把另一道水题给过了.全场我们也只过了那么一道题.学姐说,做重现赛和现场赛比较,需要去掉一题,那么我们又爆零了. 题意: 我方有n个人

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛

Banana Bananas are the favoured food of monkeys. In the forest, there is a Banana Company that provides bananas from different places. The company has two lists. The first list records the types of bananas preferred by different monkeys, and the seco

Sdut2411 Pixel density 山东省第三届ACM省赛(输入输出字符串处理)

本文出处:http://blog.csdn.net/svitter 原题:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2411 题意:给你一个串,让你依据那个串来输出ppi.坑特别多.ppi的计算方法是dp / inches; dp = sqrt(wp*wp + hp * hp); 现在我来说说这个题目有多坑: 给你的串的格式是这样: name + inches+ "inches"

sdut 2413:n a^o7 !(第三届山东省省赛原题,水题,字符串处理)

n a^o7 ! Time Limit: 1000MS Memory limit: 65536K 题目描述 All brave and intelligent fighters, next you will step into a distinctive battleground which is full of sweet and happiness. If you want to win the battle, you must do warm-up according to my inst

hdu6153 A Secret CCPC网络赛 51nod 1277 KMP

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意: 给出两个字符串S1,S2,求S2的所有后缀在S1中出现的次数与其长度的乘积之和. 思路: CCPC网络赛题解: https://post.icpc-camp.org/d/714-ccpc-2017 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277   是一样的 将s1,s2翻转,转化为求前缀在s1中出

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共