初期:
一.基本算法:
(1)枚举. (poj1753,poj2965)
poj1753 话说我用高斯消元过了这题。。。
poj2965 巧了,用高斯消元01矩阵更快(l o l)。
(2)贪心(poj1328,poj2109,poj2586)(completed)
poj1328 题目可以转化为将以每个岛屿为圆心,半径为d的原与x轴的交点构成的共n个区间,分成尽可能少的块,每个块中的区间有个交集(公共区间至少为一个点)。那这就是经典的贪心了。
poj2109 这似乎用二分+高精就过了好吧。。。
poj2586 先讲讲题意:对于每一个月来说,是盈利如果则盈利s,如果亏空则亏d。 每五个月进行一次统计,共统计八次(1-5月一次,2-6月一次.......) 统计的结果是这八次都亏空。要你判断全年是否能盈利,如果能则求出最大盈利,否则输出Deficit。一个贪心的想法,要使总盈利最大,就要使每五个月都亏损的越少,就让这些亏损的月份在越后面越好。
(3)递归和分治法.
(4)递推.
(5)构造法.(poj3295)(completed)
poj2586 题意就是给你一个逻辑表达式,有10种字母,pqrstKANCE,其中pqrst的值为1(T)或0(F)即逻辑变量,KANCE为逻辑运算符,分别有一个运算规则.现在给你一个这样的逻辑表达式,判断是否为永真式(就是在任一情况下值都为真),输入格式保证是合法的。由于只有5种变量,那么可以2^5枚举一下,然后用栈将这个式子的值计算出来。如果发现只要有一种值为0,那就不是永真式。
(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)(completed)
poj1068 题意就是给你一个合法的括号序列的一种表示方式,让你求出另一种。按照题目意思去模拟就行了,完全可以先求出标准的括号序列,然后在求出第二种表达方式。
poj2632 题目本身并不难,模拟的过程也很清晰,但是由于这个!@¥%#@恶心读入【qwq】,我也是WA+RE了n次了呀。。。
poj1573 直接根据题目模拟,用vis数组记录上一次走到这里是什么时候。题目不难,只是某些细节要注意一下。
poj2993 就是将几个棋子投射到棋盘上,输出整个8*8的棋盘。但是juruo一直没有看懂大小写怎么办,后面才知道white->大写,black->小写。
poj2996 这是2993的翻版,只是input和output换一下。主要恶心的地方就是输出顺序,要非常细心。
二.图算法:
(1)图的深度优先遍历和广度优先遍历.
(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)(completed)
poj1860 就是给你不同货币之间兑换的汇率和损失率,然后你原来有一些量的某种货币,问你能否通过一系列操作使钱变多(当然是同种货币相比)。这一题的本质就是求求正权回路,直接跑spfa就好了。
poj3259 就是给你一些正常的双向边与一些单向虫洞,权值相当于-wi,问你是否存在负权回路。同样,刷spfa就好了。
poj1062 问题可以转化为给你几个点,开始每个点都有一个点权,点权可以被修改(即从另一个点+从那一个点到这个点的边的边权(当然边要存在))。同时,参与这整个过程的所有点的等级差最大不超过m,求点1的最小点权。那么,我们枚举一个等级下界,就确定了等级限制的范围,那些不符合限制的点就被排除在外了。剩下就是一个裸的最短路了。
poj2253 其实DFS+二分就可以水过,因为格式问题WA了好几次。同样可以用MST做。
poj1125 刷一遍floyd就过了,并不想说什么。
poj2240 好不容易搞到1A。转化题意后就是找出一个环,权值的乘积大于1。那么用spfa跑一跑就行了。注意字符串的处理。
(3)最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)(completed)
poj1789 MST模板题,不解释(当然是用prim刷啦)。
poj2485 求MST中的最大边,水题不解释。
poj1258 发现题目一个比一个水,不知道该说什么。。。
poj3026 终于有个能卡一下的题目了。还是一样,不用区分‘S’和‘A’(因为这并不是最短路而是MST),所以,我们直接将S看成A,然后算出每两个A之间的最短距离,然后跑一遍prim。
(4)拓扑排序 (poj1094)(completed)
poj1094 这题我也不知道怎么回事,就1A了。题目就是给出几个大小关系,让你输出,什么时候开始出现矛盾或可以判断所有数关系,或者到最后还不能判断关系。判断矛盾我就直接用spfa判负环(建图我直接建负边),判断是否能判断关系,那就是topo排序了。主要的还是细节,细节!
(5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)(completed)
poj3041 我们可以这样子看问题:将武器看做一个点,行星看做一条边。那么,我们要求的就是最小点覆盖(点覆盖是一个点集,能覆盖所有边),相当于求出最大匹配数。
poj3020 很恼火,一直WA,后面重构才A掉。这一题我们把 一个城市看做一个点,一个无线网看做一条边,那么这题我们要求的就是最小边覆盖(边覆盖是一个边集,能覆盖所有点)。由于这是无向图,所以最小边覆盖数=总点数(单边点数)-最大匹配数/2(无向图最大匹配会被双倍计算)。
(6)最大流的增广路算法(KM算法). (poj1459,poj3436)
poj1459 多源多汇点的最大流应当先建立一个超级源与超级汇,然后,蒟蒻的我跑了跑Dinic,还算可以吧。。。
三.数据结构.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
(3)简单并查集的应用.
(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼树(poj3253)
(6)堆
(7)trie树(静态建树、动态建树) (poj2513)
poj2513 将一种颜色看成一个点,最后我们,如果能形成一个欧拉路径,就是possible。读入当前的木棒,两端颜色为u,v。记录每种颜色上次出现的位置编号u0,v0,相当于我们可以从u0->u->v->v0,相当于间接连通了u0和v0,这相当于并查集的作用。然后,我们记录最终了形成几个块(有可能只是一条链)。我们必须只有1个块。又由于每个块是一个欧拉路径(一笔画问题),所以统计一下每种颜色出现次数的奇偶性即可。
四.简单搜索
(1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.动态规划
(1)背包问题. (poj1837,poj1276)(complete)
poj1837 典型的DP。f[i][j]表示前i个挂钩,绝对重量为j的方案数,方程:f[i][j]+=f[i-1][j-l[i]*w[k]]。作为C党,负数是不存在的,所以要重新取一个基准点(用0的话下标会变负),由于绝对重量范围是-20*15*25~20*15*25,即-7500~7500,所以我们取7500作为基准点,下标范围就变成了0~15000。
poj1276 多重背包二进制优化,也挺好写。
(2)型如下表的简单DP(可参考lrj的书 page149)(completed)
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)(completed)
poj3267 想了一下(DP弱啊),个人认为这样来做简单点:首先假定字符串以1标号,设f[i]为前i个字符中,最少删掉f[i]个能符合要求。f[i]=min(f[i-1]+1,min(f[i-fir[j][i]+1]+calc(j,i))),其中,fir[u][v]表示第u个单词的最后一位与原串的第v位相同时,原串的fir[u][v]~v位顺序包含了第u个单词,当然也有不存在的情况。calc就表示fir[u][v]~v中,不是第u个单词里面的字符数,最后输出f[len]就好了。
poj1836 简单题,两遍lis。
poj1260 依然很水,f[i]=min(f[i],f[j]+(s[i]-s[j]+10)*p[i]))(s数组是前缀和)。
poj2533 模板题,水。
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
(poj3176,poj1080,poj1159)(completed)
poj3176 数塔水。
poj1080 LCS变形题,水。
poj1159 LCS+滚动数组。
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
(2)数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)(complete)
poj2635 就是先把1e6以内质数先搞出来,然后用秦九韶高精模一下,还要压位,不然要TLE。。。
poj3292 xjb乱搞就是了,类似的方法。
poj1845 和之前一道题目差不多,水过。。。具体就是分解质因数,然后用等比数列+逆元。
poj2115 扩展欧几里得第一A。。。不多说,见写的题解。
(3)计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
poj3273 二分裸题。
poj3258 也是二分裸题,只是要注意,坐标为0和len的石头不可搬动。
七.计算几何学.
(1)几何公式.
(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)
(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中级:
一.基本算法:
(1)C++的标准模版库的应用. (poj3096,poj3007)
(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)
二.图算法:
(1)差分约束系统的建立和求解. (poj1201,poj2983)(completed)
poj1201 查分基础题,可以建立这么几个不等式:对于每个区间:Sy-Sx-1>=z,即Sy>=Sx-1+z。对于每个i和i+1间,也要建两条边。由于Si+1>=Si,Si+1-Si>=0,所以要一条从i到i+1边权为0的边。又由于Si+1-Si<=1,Si-Si+1>=-1,所以要一条从i+1到i边权为-1的边。然后跑一遍spfa就好了。
poj2983 查分题,需要绕一点弯,如果是类型P x y z,即fx=fy+z,那么,我们可以建立两个不等式:fx>=fy+z,fy>=fx-z,这是等效的。对于V x y,即fx>=fy+1,我们只需建这么一条边就行了。由于图不一定连通,所以我们要建立一个超级源,然后与每个点再建一条边权为0的边。由于判断差分约束不等式无解的标志是出现正权或负权回路,所以我们以超级源为源点刷一遍spfa就行了。
(2)最小费用最大流(poj2516,poj2516,poj2195)
poj2195 这道题本蒟蒻其实是用KM来A掉的,因为更容易看出来(换句话说,建模不熟练→_→)。那么,跑费用流的话,就相当于多源多汇点的题目了,每队源点汇点之间的边容量都为1,费用就是曼哈顿距离。
(3)双连通分量(poj2942)
(4)强连通分支及其缩点.(poj2186)
(5)图的割边和割点(poj3352)
(6)最小割模型、网络流规约(poj3308, )
三.数据结构.
(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)静态二叉检索树. (poj2482,poj2352)
(3)树状树组(poj1195,poj3321)
poj1195 二维树状数组模板题+容斥。
poj3321 题目还不错。。就是将原来的树形结构转为线性结构,然后要有包含的关系。那么,这可以用欧拉序列(DFS序)来实现,不过稍微有些相异。每个树上的节点都有一个开始访问时间和结束访问的时间。开始访问时间就是这个节点的访问时间,而结束访问时间是以这个节点为根的子树访问结束时间。然后映射到序列上,用树状数组维护就好了。
(4)RMQ. (poj3264,poj3368)
poj3264 模板题,不解释。。。
poj3368 稍微复杂一点,却1A了。。。就是如何转换为RMQ问题。先将原来的离散,如何用cnt[i]表示数i出现多少次,然后做个RMQ。这能干什么呢?比如询问L,R的时候,会出现一段被切开的数,然后几段完整的数,然后又出现一段被切开的数,然后中间那部分,我们就可以O1知道出现最多的数出现了几次(很好的利用了原数列单调的性质)。
(5)并查集的高级应用. (poj1703,2492)
(6)KMP算法. (poj1961,poj2406)
四.搜索
(1)最优化剪枝和可行性剪枝
(2)搜索的技巧和优化 (poj3411,poj1724)
(3)记忆化搜索(poj3373,poj1691)
五.动态规划
(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)
(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
(1)组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
4.递推关系和母函数.
(2)数学.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
poj1222 高斯消元模板题(01矩阵),会具体的写在单独的题解里面。
poj2947 高斯消元的经典问题,也会写在专门的题解里面。
poj2065 同余式+高斯消元,找到了手感,很快就1A了。
poj1487 复杂的操作。。。会写在专门的题解里面。
2.概率问题. (poj3071,poj3440)
3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
(3)计算方法.
1.0/1分数规划. (poj2976)
2.三分法求解单峰(单谷)的极值.
3.矩阵法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)随机化算法(poj3318,poj2454)
(5)杂题.
(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
(1)坐标离散化.
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多边形的内核(半平面交)(poj3130,poj3335)
(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)