【题解】2016.5.8SWJTU校赛题解

这套题目总体而言,中等题偏多,而简单题和难题较少。一些题目需要组合运用多种算法和数据结构,而代码复杂度并不高,主要目的使是选手在整个比赛过程中不至于进入“垃圾时间”,能感受到思考并解决题目的乐趣……但好像大家都跳进坑里面了。

 

A:Tickets

寻找最少花费及购买方式,若有多种则输出最前一种,直接处理即可,注意数据较大,用cin,cout可能会超时,这点在宣讲会上已经提过了。

 

B:Wave string

       定义了波浪串,要求寻找从某位开始的波浪长度为L的波浪串个数,用manacher求出每位为中心的最大回文串个数后,可以在log(n)内完成查询。

总复杂度n + mlog(n)(m为询问个数,n为长度)

 

C:The road ahead to beboundless

       不知道没给第三个样例有多少人能做出来……贪心,考虑如何将最慢的两个人送过去时间最短,且不影响其他人,一种方案是:(1,n)->(1)<-(1,n-1)->(1)<-,另一种方案是(1,2)->(1)<-(n-1,n)->(2)->,比较一下两种方案花费时间,直到人数<=3处理边界情况。

 

D: King’s Knight

       求解等比数列之和,列出公式后可发现需要高精度,快速幂,逆元,对应处理即可(毒瘤题……)

 

E:DaVinci code

       给出原始字符串和目标字符串,给定两个操作,求最小操作数,BFS即可。

 

F:Legend of theGalactic Heroes

       求给定若干条sum[r]-sum[l-1]=k的信息,询问有多少条错误信息,带权并查集的运用,若f[i] = j(应保证i>j),则weight[i] = sum[i]-sum[j],若不在一个集合中就合并,在一个集合中就查询是否正确。

 

G: White album 2

(为什么会这样呢?)送分题,寻找强连通分量并缩点,拓扑排序找最大路径即可。

 

H: Put an elephant into a refrigerator

       令f[l,r,k]表示已经走到的左边最远点是l,右边最远点是r,k=0表示在左端点,k=1表示在右端点,每次转移向左或向右多走一个点。

 

I:  Buy buy buy

       若令f[i]表示以i结尾的最长序列长度,则f[i]= max{f[j]} + 1(j < i && f[i]-k[i]<=f[j]<=f[i]+k[i]),普通dp实现是O(n^2)的时间复杂度,需要用线段树进行优化,具体优化方式是离散化以后,在计算f[i]时,查询范围内的最大f[j]值并将f[i]插入线段树中,复杂度均为log(n),总复杂度为nlog(n)。

 

J:Escape from theearth

       多重二分图匹配,模板题。

 

代码地址:https://github.com/bamboohiko/problemSolve

你可能感兴趣的:(ACM)