自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JIBANCANYANG

并非所有流浪者都迷失了自我。

  • 博客(33)
  • 收藏
  • 关注

原创 Codeforces 598D Igor In the Museum(概率DP)

@(K ACMer) 题意: 在x轴上有n颗高度为h的树,现在你将有12\frac{1}{2}的概率,砍最左边的树,同样的概率砍最右边的树.然后对于每个树它有pp的概率会向左边倒,(1−p)(1-p)的概率会向右边倒.值得注意的是树的倒会引起类似多米诺骨牌效应,也就是如果一个树和它相邻的树和它的距离小于h,它往这颗树倒的时候,该树也会向同样的方向倒.为你这些树全部倒下的期望覆盖地面长度是多

2015-11-29 10:03:39 660

原创 hdu 5564 Clarke and digits (数位dp + 矩阵快速幂优化)

@(K ACMer) 题意: 求长度在[l,r][l, r] 之间,且相邻数和不为kk的能被7整除的数的个数? 知识补充: 大数取模:对一个大数取k模,有这样的性质:(k∗10+a) % mod = (k % mod∗10+a) % mod(k * 10 + a)\ \%\ mod\ = \ (k \ \%\ mod * 10+ a)\ \%\ mod所以对大数只需要

2015-11-27 17:36:09 707 1

原创 Codeforces 596E Wilbur and Strings(序列自动机)

@(K ACMer)题意: 在一个n∗mn*m的图上,每个空格写着0−90-910个数字中的一个.有两个长度为10的数组a1,a2...ana_1,a_2...a_nb1,b2,b3,...bnb_1,b_2,b_3,...b_n,表示转移向量.当走到一个格子(x,y)(x,y)上时,如果它上面的数字为t,他必须走到(at+x,y+bt)(a_t + x, y + b_t)格子去(除了,加上偏移量

2015-11-25 17:45:38 1973 2

原创 Codeforces 598E Chocolate Bar (dp)

@(K ACMer) 题意: 给你一个n∗mn*m的矩形,你每次可以横着或者竖着切割,每次切割的消耗是切割长度的平方,要得到总共面积为k的一个矩形集合,需要的最少切割消耗是多少? 分析: 很容易定义一个dp[x][y][num]dp[x][y][num],表示切割一个x∗yx *y的矩阵 来得到面积为k的矩形集合所需要对最小消耗. 也很容易设置转移,分为对切水平切和竖直切两种情况来转移.

2015-11-24 16:17:22 656

原创 Codeforces 599D Spongebob and Squares(枚举 + 数学)

@(K ACMer)题意:给你一个数k,(k<1e18),表示矩形不同的正方形的个数,求满足k的所有矩形.分析:求出公式,枚举实现即可. 这个题,比赛的时候错误的认知了复杂度,以为1e18必须要logn的算法才行,其实开次3根号也好的.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <

2015-11-21 18:56:25 749

原创 Codeforces 597C(树状数组 + dp)

@(K ACMer)题意: 由1到n,共n个数构成的序列中长为k + 1的上升子序列有多少个? 分析: 注意到题中数字是1到n,且子序列最长只有11.我们可以这样定义状态:dp[i][j]dp[i][j]为长度为i的子序列中,末尾数以j结尾的个数. 那么容易有转移方程:dp[i][j]=∑t=1...j−xdp[i−1][t]dp[i][j] = \sum_{t = 1...j -x}dp

2015-11-20 12:24:54 1068 2

原创 hdu2196 Computer (数的直径的性质)

@(K ACMer)题意: 给你一颗树,问你树上的每一个点和它距离最远的点的长度. 分析: 根据树的直径证明过程的中间引理:距离树上任意节点最远的点,一定是树点直径的两个端点之一. 这样只需要两次dfs,找到树的两个端点,取每个节点距离这个两个端点的距离中较大的一个作为距离这个节点最远的距离即可. ps:开始因为邻接表没有初始化debug了半天….. 另一种想法:树形dp:距离每个节点最

2015-11-20 08:51:55 809

原创 poj 1985 Cow Marathon

@(K ACMer)题意: 求树的最长路径 分析: 两次dfs求树的直径,无它.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#

2015-11-19 14:17:20 340

原创 Codeforces596C Wilbur and Points(贪心)

@(K ACMer)题意: 给你一个点集,每个点的weight为(y−x)(y - x),你需要给出这些点的一个排列,这些点满足:如果y2>=y1且x2>=x1y2 >= y1 且x2 >= x1,就必须让,就必须让(x2,y2)排在排在(x1,y1)后面.显然满足这个点集可能有多个排列满足这个条件.然后给你一个weight的排列:后面.显然满足这个点集可能有多个排列满足这个条件. 然后给你一

2015-11-16 17:25:51 618

原创 soj 2307 String Matching(KMP)

@(K ACMer)KMP裸题一道…#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#include <cstdlib>#includ

2015-11-15 20:50:05 271

原创 soj 3296: Windy's S

@(K ACMer)题意: 求所给字符串的循环表示的最小字典序. 分析: 循环字符串的最小表示集裸题. 最朴素的方法是O(n2)O(n ^2)的复杂度,显然超时.这里用了一个很巧妙的性质来剪枝,使复杂度降到O(n)O(n).字符串循环的最小独立集这里引入同构的知识,我们有树的同构,图的同构,和字符串的同构.其所为同构是指他们在进行一些可取的等效操作(比如树和图的旋转,字符串的移位)后是相同的

2015-11-13 22:54:17 393

原创 soj 1679 Gangsters(dp)

@(K ACMer)题意: 有一个店铺,他的门的宽度在[0,k][0, k]可调剂,每个单位时间可以调节一位或者不变.有n个枪手会走来,每个枪手有直接的身体宽度,荣耀度和来的时间.只有当门的宽度恰好等于枪手的宽度的时候他们才会进来.问在[0,T][0, T]的时间内店铺可以进来的最大荣耀度是多少?(门的宽度由你调节) 分析: 这个其实类似一个背包,每来一个人我们要满足或者不满足他,这些人来的顺

2015-11-13 14:18:12 511

原创 soj 3014: Seek the Name, Seek the Fame (字符串hash)

@(K ACMer)题意: 对于一个字符串s,找出所有相同的前缀后缀长度. 分析: 一看就可以用字符串hash来搞,首位两端维护一个hash值,如果该hash值相等就说明字符串相同.字符串hash代码#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#inc

2015-11-12 13:29:10 310

原创 soj 2652: Oulipo

@(K ACMer)题意: 寻找第一个字符串在第二个字符串中出现的次数. 分析: 裸跑kmp,模式串后面加一个奇怪字符.#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#include <vector>#include <set>#include <m

2015-11-11 21:40:37 338

原创 soj 2142: Cow Exhibition(01背包的变形)

@(K ACMer)题意: 有n个物品,他们有两个属性,聪明值和有趣值,选择他们中的一些物品让聪明值和有趣值的和最大且聪明值或者有趣值的和不能为负数. 分析: 这个问题的精华在于讲原问题,转化为等价问题:dp[i]dp[i]表示聪明值为i时有趣值的最大值.最后再来扫描整个数组,求满足条件的即可. 转移方程如下: dp[i]=max(dp[i],dp[i−s[j]]+f[j])dp[i] =

2015-11-11 17:43:31 455

原创 soj 2111: littleken bg

@(K ACMer)水得一发的01背包.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#include <cstdlib>#incl

2015-11-08 20:57:04 772

原创 soj 3336 Diary(trie树)

@(K ACMer)题意: 给你一个大字符串,是日记的编码.每个女生的名字对应一个长度为10的编码.求在日记中出现次数最多的编码所对应的名字分析: 典型的trie树的应用,字符串计数.先把日记建立trie树,然后去查,每个字符串出现多少次即可.#include <iostream>#include <cstdio>#include <cstring>#include <set>#incl

2015-11-08 20:23:38 382

原创 soj 3596 Article Decryption(trie树 + dp)

@(K ACMer)题意: 给你一些单词,和一个长字符串s,s是由这些单词组成的,总共有多少种组成的可能? 分析: 问有多少种可能显然的dp,很容易的想到定义dp[i]dp[i]为s前i个字符形成的字符串最多有多少种可能,则有转移方程:dp[i]=∑j=0i−1isword(j+1,i) ? dp[j] : 0dp[i] = \sum _{j = 0}^{i - 1} isword(j +

2015-11-08 16:29:07 408

原创 #soj 3076 相同字符串(tire树)

@(K ACMer)题意: 依次给 n 个全部由小写字母构成且长度不超过 300 的非空字符串求每个字符串之前的字符串中与当前字符串完全相同的个数. 分析: 一种思路: 很直接的可以用map来查,但是map节点之间比较的时候时间比较长,就把字符串hash一下,开始裸的hash wa了,优化了hash函数加了个长度相关也就过了. 这里主要学习trie树实现的思路: 树节点维护的是当前节点为

2015-11-08 03:16:47 349

原创 soj 1162: I-Keyboard(dp + 记忆化搜索)

@(K ACMer)题意: 手机有k个按键,你有l个字符需要印在这些按键上,每个字符被使用的平均频率已知.要求设计出一个最佳的按键分块方案,使期望的按次数最小. 分析: 就是把l个字符划分为k分,让每一份的按键次数加起来最小,典型的划分dp. 定义dp[i][j]dp[i][j]为把前i个数划分为j个部分的最小期望按的次数总和.那么有转移方程: dp[i][j]=min(dp[k][j−1

2015-11-07 20:15:41 514

原创 soj 2505: The County Fair(离散化 + 记忆化搜索)

@(K ACMer) 题意 有n个展台,你初始时刻在1号展台,时间为0.然后每个展台都会在一个固定的时间p(i)(0<p(i)<1e9)p(i)(0 < p(i) < 1e9)发奖品,从起点出发,你能前往任何展台,但是必须在该点等到p(i)时间拿到奖品,然后再离开,从每两个展台相互之间的转移需要时间T(i,j)T(i,j).问你最多可以得到多少个奖品. (注:这里除了没有必要在第一个展台待到它

2015-11-06 14:31:10 355

原创 soj 1685: Chopsticks(线性dp)

@(K ACMer)题意: 给你n个人,你需要给(n+8)(n + 8)个人,每个人发三只筷子.这三只筷子中较小两个长度的差值的平方就是这三只筷子的差异值.要求把k根筷子分发给(n+8)(n + 8)个人,让总的差异值最小. 分析: 首先拿到这个问题,会发现要选一定选择相邻的两个作为筷子的性质.因为只有它们的差值最小. 那我们先不考虑第三根筷子,可以很直观的想到一个dp,定义dp[i][j]

2015-11-06 02:49:49 504

原创 soj 2113 数字游戏(环形DP)

@(K ACMer)题意: 给你一个长度为n的环,你要把它划分为m个部分,让每个部分内部元素的和取余10再相乘得到的字尽可能大(小). 分析: 如果题中是把一个链划分为m部分,显然可以用dp的方法,定义dp[i][j]dp[i][j]为前i个数划分为j个部分的最大(小)值,那么可以有转移方程:dp[i][j]=max(dp[i][j],dp[k][j−1]∗((sum[i]−sum[k])dp

2015-11-05 20:43:46 541

原创 soj 2978 Tasks

@(K ACMer) 题意 数组a全部为0,给你一个和数组a同样大小的数组b,你可以选择把任意一个a[i]a[i]变成b[i]b[i].但是保证必须保证a中所有元素的和小于t. 定义f(a)为a数组中最长的连续0的个数,求f(a)的最小值. 分析: 看起来这个题,要直接求出来最优结果似乎是不可能的,最暴力的枚举是2的指数次的显然不可行. 我们可以二分的来枚举这个最长区间的长度k.然后去判

2015-11-04 14:25:46 373

原创 soj 2249 Mayor's posters(带相邻处理的离散化 + 线段树)

@(K ACMer) 题意: 一堵墙,海报覆盖于其上,问可以看到的海报有多少个? 分析: 非常典型的线段树的应用,但是此题空间过大,需要离散化,而且不是一般的离散化,因为每个坐标点代表的是一个格子,而不再是一个刻度. 普通离散化的思路是,把数据中出现的数通通由小到大的排序后去重,它对应的数组下标就是其离散化后的值,每次要用二分去数组中差这个值对应的离散化后的坐标值. 比如有这样两张海报[

2015-11-03 21:27:24 585 2

原创 soj 1862 Choice Pears(优先队列)

@(K ACMer) 题意: 每次取n个堆上最小的一个的贪心策略. 分析 最小堆即可.STL里面的优先队列可过,自己写了仿函数.code#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#includ

2015-11-03 11:50:32 626

原创 2057 The manager's worry(树状数组)

@(K ACMer) 题意: 单点更新,区间查寻素数个数. 分析: 构造一个树状数组就可以了,定义sum[i]为[1,i][1, i]的素数个数.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#i

2015-11-03 11:03:24 352

原创 soj 3329: Maximum Submatrix II(单调栈)

@(K ACMer) 题意: 给你一个n *m的01矩阵,求其中元素全为0的最大子矩阵的最大面积. 分析: 最暴力的方法是枚举每一个点为子矩阵左上顶点,然后来暴力判断以它为顶点的最大0子矩阵的最大大小.这样重的复杂度是O(n4)O(n^4),TLEEEEEEEE 也可以DP一下,复杂度是O(n3)O(n ^3),还是TLEEEE.. 无法可解… 看了别人的做法: 维护一个前缀,然后对

2015-11-02 22:06:12 482

原创 soj 3085: windy's cake V

@(K ACMer)题意: 给你n个数,对于一个连续的数串,它的美味度是,他其中的最小值乘以它这个数串中所有数的和,问能得到的美味度最大的数串是多少? 分析: 首先只要我们去枚举区间的开头和结尾就必须承受O(n2)O(n ^2)的复杂度,就意味着要TLE,这里是行不通的. 我们可以换一个思路,不枚举区间而是枚举区间的最小值,再去找到这个区间.如果把当前数当做最小值,那么它的区间可以到,其左边

2015-11-01 19:52:07 447

原创 soj 3139 Sliding Window(单调队列)

@(K ACMer) 题意 维护固定长度子区间的最大最小值. 分析 最经典的单调队列的应用,其实究其根本是用了记忆化和剪枝的思想,使整个效率很高.剪枝的思想,就是对于下标小于当前数,且值大于当前数的数,永远没有用(维护最小值的时候).code#include <iostream>#include <cstdio>#include <cstring>#include <set>#inc

2015-11-01 16:37:25 250

原创 soj 3636 理想的正方形(二维单调队列)

@(K ACMer)题意: 求大矩阵中,所有n∗nn * n子矩阵中最大数和最小数差的最小值. 分析: 查连续的固定长度的区间的最值是单调队列的经典应用.这里只需要按行求出所有固定区间的最值,在把这些最值来按列用单调队列求出最值即可.#include <iostream>#include <cstdio>#include <cstring>#include <set>#include

2015-11-01 16:34:59 318

原创 soj 2309: In the Army Now (树状数组求逆序数)

@(K ACMer)题意: 可以发现就是求逆序数最大的哪一行 分析: 树状数组,求逆序数是非常经典的用法,当然归并排序的思想也可以来求. 每次新来一个数x我们就add(x , 1);这样维护数组数组sum[i]就表示在该数左边小于等于它的数的个数.j - sum[i]就是大于它的个数了.#include <iostream>#include <cstdio>#include <cstri

2015-11-01 16:27:40 280

原创 soj 2511: Moooo (单调栈)

@(K ACMer)题意: 有一群奶牛排成一排,他们有各自的身高和叫声,且每个奶牛的叫声只能被它左右两边的第一个比它身高高的奶牛听到,问所有奶牛中,能听到声音最大的奶牛是多大的声音? 分析: 既然每个奶牛只能把自己的叫声传给它左右两边第一个比它高的,我们就可以一次来把每个奶牛遍历一遍,把他们发出的声音的接受者找到,这样最后找找出最大的即可.这是最直接的想法,复杂度是O(n2)O(n ^ 2),

2015-11-01 16:04:54 405

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除