TopCoder SRM570题解

掉回Div 2了……尼玛……

依旧是翻译向。官方题解:http://apps.topcoder.com/wiki/display/tc/SRM+570


250pts:

题意:给定一系列指令,让一个机器人在一个无限区域内移动。指令包括向前移动x格以及顺时针旋转90*x度。求运行指令T次之后机器人距起始位置的曼哈顿距离。T很大。

分析:先模拟求出运行一次指令后机器人距起始位置的距离d和转过的角度。如果角度为0,那么答案就是d*T;如果角度为90或者270,那么答案就是运行T%4次指令;如果角度为180,答案就是运行T%2次指令。


550pts:

题意:……(略)……求期望费用。

分析:对于分成c个连通块的n个点,产生的费用为max(0,2*c-n-2)。那么令f[p,n1,c1,n2,c2]为以p为根的子树中被染上颜色1和2的点有n1和n2个,分成c1和c2个连通块,这样的状态的个数。如果儿子的颜色和父亲相同则不产生新的连通块,否则会产生一个新的连通块。可以另外处理一个数组g[col,x,n1,c1,n2,c2]表示给根节点染上col,已经处理x个儿子后子树的方案数。这样的复杂度过高,于是需要优化……具体的见官方题解,大致思路就是这样。


900pts:

题意:一个区域被划分成N*M个格子,每个格子要么是空地,要么是障碍。有一些空地上住着一群基佬。现在要铺铁轨,要求每块空地都被铺到,障碍上不能铺,而且每条铁轨都构成一个环。基佬喜欢弯的东西,所以在基佬住的地方铺一块直的铁轨需要1的代价。求是否有解,以及有解情况下的最小代价。N,M≤25。

分析:考试的时候想都没想就贴了个插头DP,结果样例TLE出翔……注意到这里铁轨并不一定构成哈密尔顿回路,而且所求不是方案数而是最小代价,所以有别的解法。下面的图都用的TC的官图。

先判断是否有解。有解的条件是:每块空地都向相邻的空地连出恰好两条轨道。于是可以对地图黑白染色,构建网络流模型:从源点向黑格子、从白格子向汇点连容量为2的边,相邻和黑白格子之间连容量为1的边,满流则有解。如下图:


再考虑直的和弯的轨道。如果我们要求每一块轨道都是弯的,也即每一个格子横着和竖着各连出一条边,我们可以对每个格子拆点,一个点代表横着,另一个代表竖着,各从源或向汇连容量为1的边,然后横着相邻和竖着相邻的黑白格子之间也连容量为1的边。同样满流代表有解。如下图(还是上面那个地图):


再考虑费用。我们肯定是要把网络流模型改为费用流模型。这里我们想让一些格子铺直的铁轨,也即改变某个节点代表的“方向”。那么我们在每个格子拆出的两个节点之间连容量为1的双向边,如果这条边有流量,就代表这个格子铺了直的铁轨。如下图:

费用就很好处理了。如果这个格子里有基佬,就给双向边加上1的费用,否则费用为0。其他边的费用也都为0。整个网络的最小费用最大流就是答案。在最优方案中一定不存在一个格子的两个节点都转向的情况。


个人感觉这种建模方法还是相当巧妙的,应当好好体会一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值