problem solving automation

分工一定要明确啊啊啊啊啊
Nero 数据结构  图论   DP   博弈
JayYe  数论   DP   模拟搜索 博弈 
wuyiqi 数论  数据结构   图论 字符串 模拟搜索  几何

 2013 浙江省赛

String of Infinity  zoj 3784

 

 要使得字符串能无穷走,必须是在trie图中存在环才行,但还不能以循环节结尾,那必须要有两个环相交。

 现在就转换成图论问题了,判断图中是否存在两个环相交。现场赛确实比较容易想歪,而且数据中还会有自环的存在

可能平时基础的不扎实也是导致搞不出这道题的原因吧。判两个环相交的话只需要缩点之后判断是否有一个点的邻接点跟自己在同一个连通块里就好了。

 Chessboard and Flowers(zoj 3779)  (待搞)

高精度,dp

Coins Game(zoj 3783)(待搞)

几何 

 

 Unreachable Statement(模拟) (待搞)

 

 2013 Arab

Increasing Shortest Path (UVALIVE 6756)

枚举源点,按照边从小到大作dp[i][j]表示源点到点i经过j条边的最小距离,复杂度为O(nm^2),但是因为经过的边数最多为n,因此优化到O(n^2m),就可以通过全部数据了

by Nero 

 The Stones Game(UVALive 6760)

Super Ants(UVALive 6761)

 

2013 Aizu

Longest Chain(UVALive 6667)
 简单的cdq分治 ,因为注释没去掉导致了wa。比赛时的TLE是系统问题。

by : wuyiqi 

 Directional Resemblance(UVALive 6666)

Don’t Burst the Balloon(UVALive 6668)

Hidden Tree(UVALive 6669)

 C(O|W|A*RD*|S)* CROSSWORD Puzzle(UVALive 6670)

 

 2013 Jakarta(AK,还有个题需要补题解)

Railroad (E)

当然可以用网络流卡过去(前提是板子够犀利)。另一种炫酷的做法是,由于这是一幅平面图,把平面的每个区域当成点,在上下相邻的两个区域间连一条由上到下的边,得到一幅DAG,求这幅DAG的最长路即可。

by Nero 

 Coins on a RingUVALive 6442)

 

 2013 Phuket

 

Teaching Hazard (UVALive6601) wuyiqi

 

由于把答案限制在5*10^18内了,所以就直接暴力点计算答案,求后缀0的个数为x可以用后缀0的个数>=x的减去后缀0的个数>=x+1来表示就可以了。

by JayYe 

Traveling Fool(UVALive 6607)

Safari Park(UVALive 6610)


 2013 central europe

 Rubik's Rectangle(UVALive 6580)

负责人:yehuijie 

一个格子最多只能在四个对称的位置移动,四个对称的位置在不改变其他位置的情况下行列改变偶数次只能得到一半的排列情况, 必须要某行或者某列改变奇数次才可以得到另外一半的排列情况,所以对所有的四个对称位置或者两个对称位置处理出是否需要改变奇数次然后建立异或方程组最后用gauss消元求解即可。

by JayYe 

Magical GCD(UVALive 6582

因为gcd(a[j], a[j+1]..., a[i]) <= gcd(a[k], a[k+1]...a[i]) (j <= k <= i) ,所以对于i来说,前面不同gcd的块最多只有log(a[i])个,用nxt数组维护好这些块即可。

by JayYe 

 

Subway(UVALive 6583)

负责人:zhangmingming

 首先考虑处理最少换乘,那么就是对于每条线路,加一个大点,线路内的每个小点均向大点连双向边,然后从起点广搜一遍,最少换乘次数就是终点的dis/2。

然后考虑处理最长乘坐时间, 令线路为a1,a2,a3....an,那么从ai到aj的距离为j-i,考虑将这个距离式子分配到前面建好的图的边权中去,那么就是小点向大点连权重为-i的边,大点向小点连权重为i的边,这样处理之后,从ai走到aj就变成从ai走到大点,再从大点走到aj,距离恰好为j-i。因为线路可以反过来走,因此一个大点是不够的,因此为每个线路分配两个大点,第一个大点按照上述连边,然后把a1,a2,a3....an反过来变成an,an-1,...a3,a2,a1,再按照上述同第二个大点连边。

这样建好图以后,只保留广搜树中的边,然后找dag最长路即可

by Nero 

Escape(UVALive 6584)

 

History course(UVALive 6586)


 Chain & Co.(UVALive 6587)

http://vjudge.net/contest/view.action?cid=45672#problem/H

负责人:wuyiqi 

需要精心设计来节省代码的模拟题,考虑到了对称性之后就有了一个很简单的写法。

by : wuyiqi 

 

 Captain Obvious and the Rabbit-Man(UVALive 6589)

 

 


 2013 Tehran

 SMS PollUVALive 6744)    

 Intelligent Traffic Surveillance ( UVALive 6746)  jayye

 2D-Solar System(UVALive 6748

Bowling Ball(UVALive 6749)   nero

 

Wedding Hall(UVALive 6753) wuyiqi   nero

Mixed Flight Plans (UVAlive 6751)

 

路径要么从A到B,从C到D,要么在路上相交一次后变成从A到D,从C到B。那么就dp出以i为第一个交点的A到D最小值,和以i为第一个交点的C到B最小值,合并一下答案即可。

by Nero 

  2013 Dhaka

 Game of Throne (UVA 12711)

 首先能够看出,其实就是求前k个点的一般图最小权匹配。。。

 嘛,这个东西当然没有成型算法(我读书少)。。。

但是呢,k最大为50,并且是完全图,巨大的恶搞空间。。

 首先先为每个点随便匹配一个点(当然要合法),然后就while(1) {找负环} 吧,每找到一个负环,就将环上的匹配像km算法的增广路那样去交换,以获得更优的答案。直到某一刻图上再没有负环为止。

容易证明没有负环时是最优解:

设当前不是最优解,那么就有一些最优解中的匹配不存在当前的解中,设为虚边,也有一些当前解的匹配不存在最优解中,设为实边。设当前一对匹配(x,y)不是最优解中的匹配,那么必然存在一条虚边连向x,一条虚边连向y。设一对最优解中的匹配(x,y)不在当前的解中,那么必然存在一条实边连向x,一条实边连向y。则虚边和实边交替出现,成环,而此环能够使得代价变小,即这个环是个负环,也即图论意义上的增广路。

复杂度分析: 最坏时找每个负环需要n^3,最多找n^2次负环(每次去掉一条负边),因此复杂度上界为O(n^5),但是这不是严格的上界,ed...

 by Nero

Pearl Chains (UVA 12713)  wuyiqi

题意很简单,很容易写出公式 sigma( C(A+B-i , A-i)*C(B, B-i)*X^(A-i)*Y^(B-i)*Z^(i) ) (0 <= i <= min(A, B))

首先解决下这样的问题 sigma( C(B, i) ) (0<=i<=B),把B和i都拆成P进制 B1B2B3,i1i2i3,根据lucas定理,结果就成了sigma(C(B1, i1) * C(B2, i2) * C(B3, i3)),lucas的一个重要性质,对于某一位上组合数为0的话,整个组合数为0。所以把零项去掉后就成了sigma(C(B1, i1) * C(B2, i2) * C(B3, i3)) (i1<=B1, i2<=B2, i3<=B3) ,很显然C(B1, i1)*E,这里的E表示后面的连乘东西,对于所有的C(B1, i1),E的集合是相同的,所以式子满足分配率,答案就成了sigma(B1,i1)(i1<=B1) * sigma(B2, i2)(i2<=B2) *sigma(B3, i3)(i3<=B3) 。

其实对于C(A+B-i , A -i)也是差不多的,不过不同的是上下的数都在变,但是可以发现下面减去上面是不变的,是恒等于B的,同样我把C(A+B-i , A-i)写成 C(a, b),写成P进制就是C(a1a2a3, b1b2b3) ,因为a-b = B, 所以把零项去掉后a1 - b1 = B1, a2 - b2 = B2, a3 - b3 = B3,也就是说对于所有的项都是满足这个的,对于每一位差值都是不变的,总共有P种形态,乘起来同样是满足分配率的,只需要配合C(B, B-i)一起求就可以了。

 by JayYe

 Fill the Cuboid(UVA 12719)(待搞) wuyiqi

 




 



 2013 North America - East Central 

BattleshipsUVALive 6553

 爆搜 + 剪枝就好了,很锻炼基本功,这种题应该尽量能在比赛中敲出来,应对比较乱的比赛的时候非常需要做大模拟,大搜索的能力。

这题的剪枝是关键,我的剪枝是23s过的,static里面有人3s就过了,说明有更好的剪枝。,有待挖掘。

by : wuyiqi 

Stampede!UVALive 6557

网络流。按照(时间,地点) 的方式拆点,从小到大枚举时间,在之前的残余网络上添加当前时间对应的点,直到汇点满流为止。

这样的话,由于残余网络增广路径不多的原因,运行时间比二分要小。

by Nero 

Rent-A-Pixel(UVALive 6556)

首先把每个10*10格子拆成他的4个角格子。 

考虑为右上角画一条凸线,包围整个右上角,那么这个可以把x从小到大排序,线性扫描一遍得到。

那么一个角搞定了,通过旋转4次坐标,可以把四个角都用上面的方法搞定。

最后注意一下输出的顺序,就可以了。

by Nero 

Tree Lighting (UVALive 6559) (几何,待搞) wuyiqi

 XenospeakUVALive 6561 

对于一个长度为len的字符串,字典序从小到大的话第一个字典序肯定是a开头的,由于可添加的是"a", "ab", "bb",可以得到接着的len-1个字符任何情况都是可行的,如果第一个字符是b开头的话,必须是bb开头,然后又回到了len-2的字符串的情况了,如此就可以构造了。这里用了高精度,因为我试了下各种姿势,都是会超long long甚至unsigned long long的。 

 by JayYe

 

  2011 FuzhouOnline

 

Abalone (HDU 4062)

 big模拟,搞清楚题意后一个一个写清楚就好了

  by Nero 

 

 Aircraft(hdu 4063)

有若干个圆,问你从第一个圆心走到最后一个圆心的最短路径,圆的个数n <= 20 

处理出所有的关键点(包括圆与圆交点,圆心)之后对于每对点都判断一下他们连线的线段是否在圆的区域内,只需要求出在此线段上的所有点然后对于相邻的小线段判断此小段是否在园内。

建好图后跑个最短路就ok了。 

 by : wuyiqi

Carcassonne(hdu 4064)

暴力状态压缩dp ,dfs转移,注意对于某一块全部都一样的地图直接乘4就好了,因为是重复的搜索。

去掉那个剪枝后TLE了,说明还是挺重要的。 

by : wuyiqi 

Random SequenceHDU 4066

 CatanHDU 4065

模拟,对于块和相应的点之间建好边后暴力搞下。

by JayYe 

 SanguoSHA(hdu 4068)

DLX, 搜出每个格子属于哪一块之后就可以转换成精确覆盖问题。 

by : wuyiqi 

 

 

 

Attack on Titans

 

dp[i][2][3]:

dp[i][是否产生>=M个连续的0][结尾的数字]

还有一维信息(不能有超过K个连续的1)在转移的时候减掉

由于情况比较多,只能手写全部转移了,比较锻炼思维的完整性

by becauseofyou

Code Geass -- Lelouch's Plan

树DP,状态为dp[n][m][父亲链中是否有被Geass的点],然后做每组必选一个的分组背包即可

by Nero

Chameleon

分块,对于询问(a,b),若a和b的size都小于等于Sqrt,则暴力合并求解,单次复杂度O(sqrt(n)),总计O(nsqrt(n))

若a(或b)的size大于Sqrt,则把关于a(或b)的所有询问放在一起处理,单次复杂度O(n),总计O(nsqrt(n))

by Nero

Dot Dot Dot

搜索,由于开关总数不超过5,对于踩开关的先后不同得到的情况是不一样的,所以可以处理出所有情况的地图来计算答案,

最多情况是tot = (A(5,5) + A(5,4) + A(5,3) + A(5,2) + A(5,1))种,总计复杂度为O(40*40*tot)

by JayYe

 Snowflake

Miko Miko Suika 

最大权闭合图,选择a的前提是必须要选择b,选择出一个闭合图要求所有的出边指向的点都在图内,求点权的最大和。

如果ab之间有边  a -> b   inf

如果a点权大于零  s->a  val[a]

否则a->t   -val[a]

所有正的点权之和减去最大流就是答案

 SRM 615 550p:

假设dp[i][j]表示走到i点,距离为j的情况是否存在,然而j过大 ,闭着眼睛想想,应该是要找个东西将第二维降下来,我本来的想法是在最短路上找一条边反复走多次来搞,但有时候合法的路径不会经过最短路

然后从起点出发的边却有着很好的特点,我们可以对着某一条出边来回走很多次,然后再继续出发,

假设这条边边权为c,设dp[i][j]表示到达i,对2*c取余为j的状态下的最短路, 那么现在到达终点时能否为T,就看dp[n][T%2*c] <= T是否成立了

这题相当于用2*c将所有的距离分成了2*c类,然后T的类别是T%(2*c),如果到达n的距离可达这个类别,而且最短的方法是<=T,显然,答案是possible,有多的我们可以用2*c来调节

 by becauseofyou

SRM 615 950p:

题目只对R和G给出了限制,限制可以规约成这样:对于串的任意前缀都满足 cnt[R] >= cnt[G] >= cnt[R]-M, 且整个串中R的数量是M的倍数

因此开状态dp[s.length()][cnt[R]%M][cnt[R]-cnt[G]],初状态为dp[0][0][0] = 1,最终答案为dp[s.length()][0][0]

by Nero

Alice Madness Return

设状态vis[pos(A)][pos(B)][memory][pos(K)][dir(K)]表示A的位置,B的位置,memory的收集状态(二进制压缩),Knight的位置和方向。由于Knight只会南北移动或者东西移动,所以位置只有10个,方向即为南北或者东西。复杂度O(100*100*32*10*2)。

要注意坑的的地方,A先移动然后是B然后是K,A不能移动到B和K,B如果要移动到A或者K那么保持不动,AB移动后要先判断是否到了出口,如果到了状态就不会转移了不管有没收集完。

by JayYe

Gao the String I(zoj 3533)

平衡树维护串的hash值,求lcp就二分长度判断hash值是否相等,单次复杂度O(log(n)^2),求回文串就把平衡树打印到数组里,然后直接manacher算法O(n)求回文串,单次复杂度O(nlog(n)),但是因为这个操作数量较少,所以随便怎么暴力都行

by Nero

 Gao the String II(zoj 3535)

ac自动机+暴力。。预处理出所有可以解在某个串之后的子串,dp[len][node][end]:长度 , 停留在自动机的哪个节点,以哪个串结尾,转移的时候在自动机上暴力走一个子串,然后算算代价转移就好

长度加着加着忘了判越界了,造了组大数据随手测出来了。。

Move the Mouse I(zoj3534)

Move the Mouse II(zoj 3536)

Easy 2048 (zoj 3771)

搜索。3*3个格子,每个格子只有6种情况,所以状态总数为6^9 空间刚好够。每次要判断下往该方向滑动是否成功,可以的话处理空格子,第一次操作不用处理,所以是R1而不是R2用来处理第一次滑动的空格子。

by JayYe

Paint the Grid (zoj 3773)

Power of Fibonacci (zoj 3774)

斐波那契的通项为 Fn = [(1+√5)/2]^n /√5 - [(1-√5)/2]^n /√5, 设A = (1+√5)/2,B = (1-√5)/2,Fn = (A^n - B^n) / √5

ans = sigma( ( (A^i - B^i)√5)^k ), 1<= i <= n,二项次定理展开后得到k+1个等比数列,注意首项和公比是不一样的,差一个符号。根据欧拉准则可知5是1000000009的二次剩余,所以可以暴力找一下X使得X^2 = 5 (mod 1000000009),用X来代替√5即可解决问题,复杂度为O(k logn)。

by JayYe

codeforces414C

建立归并树,求一下每一层新产生顺序对和逆序对

然后注意到,进行操作x时,只会影响归并树中第[x,n]层的逆序关系,那么就把对应层的逆序对和顺序对数量交换一下就好了,最后再O(n)统计一下当前的逆序对数,就是答案了

by Nero

codeforces414D

容易知道答案只与树节点的层次分布有关,和树的形状无关,因此先预处理出dep[i]表示在dfs树中深度为i的节点有多少

然后这样得到答案:枚举每一层,考虑让最后这一层的水滴数最大,那么就是通过硬币让位于前面层的水滴延迟到这一层,代价为两层深度差,这里用线段树维护一下就好了

by Nero

codeforces414E

Tunnel Network zoj3604

Signal Detection zoj3608

http://paste.ubuntu.com/7243250/ 

 

posted on 2014-03-30 12:03  shenshanlaoyao  阅读(1339)  评论(0编辑  收藏  举报

导航