Codeforces
OMRailgun
这个作者很懒,什么都没留下…
展开
-
Codeforces_607B:Zuma(区间DP)
题目大意给定长度为n的一个序列ai,每次操作可以消除一个回文串,问至少需要几次操作可以将整个序列消除.解法为区间dp,设f[i][j]表示消除第i至j项所需的最小操作次数,转移的话f[i][j]可以拆分成f[i][k]和f[k+1][j]两段,即相当于分成两段各自消除,而当a[i]==a[j]时,则f[i][j]除了前面的那种消法外,还可以看作在消除了第i+1至j-1个元素后顺带消除了外层的第原创 2017-01-05 00:13:17 · 439 阅读 · 0 评论 -
Codeforces_414C:Mashmokh_and_Reverse_Operation(想法题)
题意大致是说给定2^n个数字,与m次操作,每次操作包含一个数字q,表示先将原数列每隔2^q个数字分成一组,共分为2^(n-q)组,之后再将每组内的数字取逆序,比如1 2 3取逆序后就变成3 2 1,要求每组操作之后输出整个包含2^n个数字的序列的逆序对个数.解法是先归并排序预处理f[n][]求逆序对和顺序对,其中F[n][0]表示在归并过程中归并两组2^n长度的序列时得到的逆序对个数,f[n]原创 2016-12-30 10:21:22 · 526 阅读 · 0 评论 -
Codeforces_509E:Pretty_Song(想法题)
题目大意是给你一个字符串,要求你统计在它的所有连续子串里字符A、E、I、O、U、Y出现的概率之和.如果按照题意枚举出每个子串再算规定字符出现概率的话是稳稳的O(n^2)复杂度,一定会TLE,所以不妨反过来思考,单独计算字符串里的每个字符对于最后答案的贡献,然后问题就简单了许多.下面来考虑针对一个特定位置的字符,它对于最后结果的贡献是如何的,假设它左边有i-1个字符,右侧有j-1个字符则原创 2017-01-06 16:44:12 · 441 阅读 · 0 评论 -
Codeforces_611D:New_Year_and_Ancient_Prophecy(DP+树状数组)
题意是给定一个n位数字,你现在可以将它分隔成若干个长度更短的数字,例如1234567可以拆分成1234和567两个数字,现在规定一个拆分方案合法当且仅当①拆分出的数字按顺序严格递增②拆除的每个数字是正整数③拆分出的每个数字没有前导0.现在给定n和原来的n位数字,问有多少种合法的拆分方案,答案mod 1e9+7.设原来的n位数字分别存储在a[1..n]中,设c[i][j]表示的是当前分隔到第j位原创 2017-01-14 23:25:27 · 307 阅读 · 0 评论 -
Codeforces_714E:Sonya_and_Problem_Wihtout_a_Legend(DP+想法题)
题目大意是给定n个数字和一种操作,该操作允许你将其中某个数字+1或者-1,求使n个数字变更为严格单调递增所需的最小操作数.基于离散化+DP的题解在度娘上遍地都是,故不再赘述.这里是在Codeforces上发现了一种十分新奇的做法,但是lz暂时还无法很好的解释它的原理,然后又怕忘记了,所以在这里贴上代码以防忘记,请静待后续更新0.0原创 2017-01-14 20:52:05 · 214 阅读 · 0 评论 -
Codeforces_488C:Fight_the_Monster(暴力)
题意玩家和怪兽对决,玩家有hp1,att1,def1属性分别代表生命值、攻击力和防御值,怪兽也有对应的数值hp2,att2,def2.每次对决玩家会对怪兽造成max(0,att1-def2)的伤害,与此同时怪兽对玩家造成max(0,att2-def1)的伤害,当怪兽hp0时玩家获胜.玩家除了初始属性值外,还可以买买买来增强属性值,可以分别以h,a,d的代价分别增加自己一点生命值、攻击力或防御力,可原创 2017-01-15 21:49:19 · 510 阅读 · 0 评论 -
SPOJ_LEXSTR:Lexicographically_Smallest(并查集)
题意大致是给定一个字符串和m对数(i,j),分别表示字符串的第i个字符和第j个字符(字符串从0标号)可以进行无限次的交换,求问由初始字符串可以得到的字典序最小的字符串是什么.看完题后,做法呼之欲出.直接用并查集将每对(i,j)并入同一个集合,之后对于每个集合,将其中对应位置上的字母按照字典序重排即可,然后这里为了偷懒,直接用了multiset >#include#include#inc原创 2017-01-15 22:25:21 · 497 阅读 · 0 评论 -
Codeforces_484D:Kindergarten(贪心/DP)
题目大意是说给定n个数字,要求你把它分成若干段连续的数列,每段有个贡献值,为这段数列中最大值与最小值之差,然后整个数列的贡献值为每段的贡献值之和,现在让你求该数列的最大贡献值.由简单分析,便可得出每个分得的段落,一定满足:这段数字的最大值与最小值一定分别位于该段数字的边缘两侧,于是基于极值点做次贪心或dp就行...然后在调试了半天终于调对,再与好友的程序对比之后,才发现我的程序是辣么的长(害怕原创 2017-01-03 20:59:43 · 500 阅读 · 0 评论