2013 ACM/ICPC Asia Regional Hangzhou Online(解题报告) 正在更新

hdu 4745   Two Rabbits

   求一个环形序列的最长双回文子序列,可以先在后面补一段来破环,但仔细观察可以发现这个题并不需要破环,比如

 cdedcba  fff    ab ,可以将ba fff ab组合,然后前面剩下的还是回文的。

hdu 4747 Mex

 此题太神,找了份代码研究了一下,边看又边思考,发现了单调性,然后果断涨姿势。

 首先可以发现mex值是单调的,这个非常关键,然后我们可以每次统计sigma(i,j)(i<=j<=n)的mex的和,即所有的以i开头的区间的mex之和,也就是当前的所有前缀。

然后,我们可以每次删除最左边的那个数,这个时候我们想一下,删除这个数会对那些区间的mex产生影响,因为mex是单调的,所以我们可以找到对应的影响的区间,显然区间右端点会在下一个a[i]之前,因为这一段只有一个a[i],而且mex又是单调的,那么我们从某个右端点开始往前去掉所有的mex值比a[i]大的,去掉一个之后我们得减去相应的mex,因为我们始终维护着一个sum,表示当前所有的前缀的mex之和。具体实现的时候当然可以更加优雅。

hdu  4741 Save Labman No.004

这个题用网上搜的公式AC显然不靠谱,所以类似的题到了现场赛就完全不同了。

标准的几何解法是:先求出两条直线公共的法向量,然后这个法向量与两条直线各自可以构成两个平面,每条直线与另一个平面都会有一个交点,这两个交点就是答案。

其实挺自然的,这两个点构成的直线肯定分别平行于两个平面,两条直线的法向量又是平行于两个平面的,所以这条交线各自垂直与两条直线。

hdu 4742 Pinball Game 3D

一维问题直接排序,二维问题就加个数据结构,三维可以数据结构套数据结构。。。。这题用树套树做的话其实挺显然的,不过得好好优化一下空间。

按照x排序后设dp[i]表示以第i个点结尾的最大值,另一个方案数只需要顺带着记录一下就好了,那么对于一个点(y,z),x已经搞定了,我们只需要在前面的y坐标在[0,y],且z坐标在[0,z]的点中找一个dp值最大的继承过来就好了,再把新的值插入进去。调了蛮久的,都在搞空间问题,好坑,不过重敲之后还是顺利的1A了.

听说还可以用分治来做,赶紧学/

Upd:传说中的分治,不要求在线的情况下以后得优先考虑分治了,因为写起来超简单,思想也简单

(先按x排序)假设当前要解决l,r区间的问题,我们先解决l,m,然后利用l,m去更新(m+1,r),完了之后m+1,r,自己内部再更新,当然这其中又对第二维关键字排序了,所以又去掉了一维关键字,剩下的z可以用树状数组

hdu 4744 Starloop System

做过http://acm.hdu.edu.cn/showproblem.php?pid=1853这题的稍微想一下就应该会上面这题的建图了。

我认为费用流有解原图就有解的本质是欧拉回路。因为每个点进去w出来w次,所以每个点的度数都是偶数了。有了欧拉回路,至少也会有一个环

拆点,a->b+n  连边,s->a  a+n-->t连边,直接跑费用流就好了

不过坑的是卡了普通的费用流,那就上稠密图利器zkw费用流了。。http://www.artofproblemsolving.com/blog/54262

边看边回顾km算法的思想,总算是有点懂了,说完全掌握,还有点勉强,不过很多东西都是不断理解加深的过程。

km的主要思想就是先给每个点一个较大的顶标,然后试图降低顶标去逼近那个最大权,在降低的过程中始终满足一条边的顶标和大于等于边权。

每次降低顶标其实就是贪心,以最小的代价降低顶标,然后又会增加lx[i]+ly[j] = w[i][j]的边。

zkw费用流就是km思想的挪用+扩展。

在km里面我们更新顶标的时候是找已经匹配的x点,再找未匹配的y点,求出lx[i]+ly[j]-w[i][j]的最小值,再给右边未访问过的点都加上这个最小值。

最短路的满足条件是d[i]+c[i][j]>=d[j],即图中已经没有可更新的东东了,而且至少有一条路是满足d[i]+c[i][j] == d[j]的,现在假设我们的增广路无法扩展了,我们就要尝试着以最小的代价增加最短路且仍旧满足最短路的条件。也就是在已经访问的点与未访问的点中找d[i]+c[i][j]-d[j]的最小值,然后加给d[j];

然后我一开始在写zkw费用流的时候也这么做了,但我只给临界的那层点加上了这个最小值,随后华丽丽的TLE了,仔细想一下,其实求出这个最小值后完全可以给未访问过的点都加上这个值,因为都加一个值不影响他们之间的差值还是不变的,而且有可能这样就可以增广了,如果只给临界点加,只能一层层的修改,不知道修改到什么时候,现在回想一下,只给临界的那一层点加是非常愚蠢的 ,因为d[j]+c[j][k]>=d[k]本来就成立,你给左边加上一个值,右边的路想要走通,迟早都是要加上这个值的。。

待补:KM好题,cdq分治,费用流,三维计算几何基础

https://github.com/becauseofyou/Contests/tree/master/2013regional/HangZhou_Online

你可能感兴趣的:(2013 ACM/ICPC Asia Regional Hangzhou Online(解题报告) 正在更新)