<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[OMRailgun]]></title><description><![CDATA[Fighting~]]></description><link>https://blog.youkuaiyun.com/OMRailgun</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; OMRailgun]]></copyright><item><title><![CDATA[SPOJ_LEXSTR:Lexicographically_Smallest(并查集)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54565179</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54565179</guid><author>OMRailgun</author><pubDate>Sun, 15 Jan 2017 22:25:21 +0800</pubDate><description><![CDATA[题意大致是给定一个字符串和m对数(i,j)，分别表示字符串的第i个字符和第j个字符(字符串从0标号)可以进行无限次的交换，求问由初始字符串可以得到的字典序最小的字符串是什么.
看完题后,做法呼之欲出.直接用并查集将每对(i,j)并入同一个集合,之后对于每个集合，将其中对应位置上的字母按照字典序重排即可,然后这里为了偷懒,直接用了multiset >
#include
#include
#inc]]></description><category></category></item><item><title><![CDATA[Codeforces_488C:Fight_the_Monster(暴力)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54564963</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54564963</guid><author>OMRailgun</author><pubDate>Sun, 15 Jan 2017 21:49:19 +0800</pubDate><description><![CDATA[题意玩家和怪兽对决，玩家有hp1,att1,def1属性分别代表生命值、攻击力和防御值，怪兽也有对应的数值hp2,att2,def2.每次对决玩家会对怪兽造成max(0,att1-def2)的伤害，与此同时怪兽对玩家造成max(0,att2-def1)的伤害，当怪兽hp0时玩家获胜.玩家除了初始属性值外，还可以买买买来增强属性值，可以分别以h,a,d的代价分别增加自己一点生命值、攻击力或防御力,可]]></description><category></category></item><item><title><![CDATA[Codeforces_611D:New_Year_and_Ancient_Prophecy(DP+树状数组)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54430085</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54430085</guid><author>OMRailgun</author><pubDate>Sat, 14 Jan 2017 23:25:27 +0800</pubDate><description><![CDATA[题意是给定一个n位数字,你现在可以将它分隔成若干个长度更短的数字,例如1234567可以拆分成1234和567两个数字,现在规定一个拆分方案合法当且仅当①拆分出的数字按顺序严格递增②拆除的每个数字是正整数③拆分出的每个数字没有前导0.现在给定n和原来的n位数字,问有多少种合法的拆分方案,答案mod 1e9+7.
设原来的n位数字分别存储在a[1..n]中,设c[i][j]表示的是当前分隔到第j位]]></description><category></category></item><item><title><![CDATA[Codeforces_714E:Sonya_and_Problem_Wihtout_a_Legend(DP+想法题)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54428740</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54428740</guid><author>OMRailgun</author><pubDate>Sat, 14 Jan 2017 20:52:05 +0800</pubDate><description><![CDATA[题目大意是给定n个数字和一种操作，该操作允许你将其中某个数字+1或者-1,求使n个数字变更为严格单调递增所需的最小操作数.
基于离散化+DP的题解在度娘上遍地都是,故不再赘述.
这里是在Codeforces上发现了一种十分新奇的做法，但是lz暂时还无法很好的解释它的原理，然后又怕忘记了，所以在这里贴上代码以防忘记，请静待后续更新0.0]]></description><category></category></item><item><title><![CDATA[Codeforces_509E:Pretty_Song(想法题)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54139677</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54139677</guid><author>OMRailgun</author><pubDate>Fri, 06 Jan 2017 16:44:12 +0800</pubDate><description><![CDATA[题目大意是给你一个字符串,要求你统计在它的所有连续子串里字符A、E、I、O、U、Y出现的概率之和.
如果按照题意枚举出每个子串再算规定字符出现概率的话是稳稳的O(n^2)复杂度，一定会TLE,所以不妨反过来思考，单独计算字符串里的每个字符对于最后答案的贡献，然后问题就简单了许多.
下面来考虑针对一个特定位置的字符,它对于最后结果的贡献是如何的,假设它左边有i-1个字符,右侧有j-1个字符
则]]></description><category></category></item><item><title><![CDATA[LightOJ_1265:Island_of_Survival(概率DP/想法题)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54092306</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54092306</guid><author>OMRailgun</author><pubDate>Thu, 05 Jan 2017 13:47:06 +0800</pubDate><description><![CDATA[题目大意是岛上有一个人,t只老虎和d只鹿,每天都会有两个生物随机碰面,有以下几种情况①老虎与人碰面,人被吃掉②老虎与鹿碰面,鹿被吃掉③老虎与老虎,两只老虎同归于尽④鹿与鹿碰面,什么都不会发生⑤鹿与人碰面,人可以选择杀死鹿或不杀鹿(取决于你),问最后人存货下来的最大概率.
经典的概率DP问题,设a[i][j]为岛上剩i只老虎和j只鹿的情况,计算每个a[i][j]时先算出第①②③种情况,随后再按照概]]></description><category></category></item><item><title><![CDATA[Codeforces_607B:Zuma(区间DP)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/54029858</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/54029858</guid><author>OMRailgun</author><pubDate>Thu, 05 Jan 2017 00:13:17 +0800</pubDate><description><![CDATA[题目大意给定长度为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个元素后顺带消除了外层的第]]></description><category></category></item><item><title><![CDATA[Codeforces_484D:Kindergarten(贪心/DP)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/53997817</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/53997817</guid><author>OMRailgun</author><pubDate>Tue, 03 Jan 2017 20:59:43 +0800</pubDate><description><![CDATA[题目大意是说给定n个数字，要求你把它分成若干段连续的数列,每段有个贡献值,为这段数列中最大值与最小值之差,然后整个数列的贡献值为每段的贡献值之和,现在让你求该数列的最大贡献值.
由简单分析,便可得出每个分得的段落,一定满足:这段数字的最大值与最小值一定分别位于该段数字的边缘两侧,于是基于极值点做次贪心或dp就行...然后在调试了半天终于调对,再与好友的程序对比之后,才发现我的程序是辣么的长(害怕]]></description><category></category></item><item><title><![CDATA[SPOJ_TBATTLE:Thor_vs_Frost_Giants(数论+二分)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/53941709</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/53941709</guid><author>OMRailgun</author><pubDate>Fri, 30 Dec 2016 13:23:18 +0800</pubDate><description><![CDATA[题目大意是有n个数字,要求求出最短的区间使得这个区间内的数字之和是n的倍数,若有解,则输出区间两端位置(数字从0标号),若无解则输出一个-1.其中1
由数字的大小只有1e5,很容易想到解法,因为最小的几个质数2*3*5*7*11*13*17>1e5,所以1e5以内的数字至多有6个质因子,且若x是y的倍数,y=a1^b1*a2^b2...*ak^bk,其中ai为素数,x=a1^c1*a2^c2..]]></description><category></category></item><item><title><![CDATA[Codeforces_414C:Mashmokh_and_Reverse_Operation(想法题)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/53939965</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/53939965</guid><author>OMRailgun</author><pubDate>Fri, 30 Dec 2016 10:21:22 +0800</pubDate><description><![CDATA[题意大致是说给定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]]]></description><category></category></item><item><title><![CDATA[SPOJ_MINSUB:Largest_Submatrix(二分+单调栈)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/53932953</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/53932953</guid><author>OMRailgun</author><pubDate>Thu, 29 Dec 2016 23:10:49 +0800</pubDate><description><![CDATA[题目大意是说给定一个R*C的非负矩阵,试求出一个包含数字数>=K的子矩阵,使得这个子矩阵中最小的数字最大.
解题思路主要是二分答案,即二分那个最小的数字,然后针对每次二分的值mid,可以将原矩阵根据是否满足A[i][j]>=mid,而转成一个R*C的01矩阵a[][],然后问题求变成了给定一个二维01矩阵,求最大的满1矩阵,可以用单调栈的思想来处理这个子问题,设b[i][j]表示从a[i][j]]]></description><category></category></item><item><title><![CDATA[SPOJ_STC02:Antisymmetry(Manacher)]]></title><link>https://blog.youkuaiyun.com/OMRailgun/article/details/53931521</link><guid>https://blog.youkuaiyun.com/OMRailgun/article/details/53931521</guid><author>OMRailgun</author><pubDate>Thu, 29 Dec 2016 19:43:10 +0800</pubDate><description><![CDATA[题目大意是给你一个长度为n的01串,问其中有多少个"反对称串",其中一个01串成为"反对称串",当前仅当将它前后倒置再01互换后的字符串等于它本身,例如0101,000111,10是反对称串,而111,110,1011就不是反对称串.
这题可以套用稍稍更改cmp规则的Manacher算法,其中规则更改为沿某两个字符中间位置,左右相应对称位置的字符0=1,0≠0,1≠1,#=#.
然后关于这题,]]></description><category></category></item></channel></rss>