07 2013 档案

摘要:HDU-4622Reincarnation题意:给定一个字符串,有Q次询问,每次询问得出区间[L, R]内有多少个不同的子串。分析:后缀数组搞,不过hash+dp也能够搞定这题,详解见http://www.cnblogs.com/Lyush/p/3233573.html。#include #include #include #include #include #include using namespace std;const int N = 2005;char str[N];int len, seq[N];int sa[N], rank[N], height[N];int wa[N], wb 阅读全文
posted @ 2013-07-31 19:56 沐阳 阅读(668) 评论(0) 推荐(0) 编辑
摘要:Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串。其算法的基本原理就是利用已知回文串的左半部分来推导右半部分。转:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足:s[i-rad[i],i-1]=s[i+1,i+rad[i]]很明显,求出了所有的rad,就求出了所有的长度为奇数的回文子串.至于偶数的怎么求,最后再讲.假设现在求出了rad[1..i-1],现在要求后面的rad值,并且通过前面的操作,得知了当前字符 阅读全文
posted @ 2013-07-28 20:21 沐阳 阅读(12742) 评论(0) 推荐(2) 编辑
摘要:HDU-4611Balls Rearrangement题意:具体题意不大清楚,最后要处理一个这样的表达式:sum{ |i % a - i % b| },0 #include #include #include #include #include using namespace std;priority_queueq1, q2;int main() { int T; scanf("%d", &T); int a, b, n; while (T--) { scanf("%d %d %d", &n, &a, &b); while 阅读全文
posted @ 2013-07-28 14:18 沐阳 阅读(475) 评论(0) 推荐(0) 编辑
摘要:HDU-1402A * B Problem Plus题意:给定两个整数,整数的长度最多能达到50000位,输出两个整数的乘积。分析:题意非常的明了,一个惊世骇俗的想法是使用两个数组将整数保留起来,然后模拟我们平常手算时的乘法,不过这样一来时间复杂度将是O(N^2),由于N过大,因此此题因寻求更加快速的解法。 对于任何一个N位的整数都可以看作是An*10^(n-1) + An-1*10^(n-2) + ... + A2*10^2 + A1*10 + A0。如果把10看作是一个自变量,那么任何一个整数就可以视作为一个多项式,两个整数相乘也便可以看作是两个多项式相乘。对于一个多项式,我们平时所接触. 阅读全文
posted @ 2013-07-27 15:40 沐阳 阅读(6715) 评论(0) 推荐(2) 编辑
摘要:HDU-4605Magic Ball Game题意:给定一颗以1为根的数,每个节点要么有两个孩子节点,要么没有孩子,每个节点有一个重量,现在从节点1往下放置一个小球,根据小球和节点的重量的不同球落下的轨迹是一个概率问题:设球的重量为X,节点的重量为w[i]:X = w[i],那么小球的运动将停止;X w[i],那么小球向左落下概率为1/8,向右落下的概率为7/8。现在有Q组询问,问小球的质量为X,落到v节点的概率为多大?分析:最直接的办法就是直接暴力求解该题,从询问的叶子节点开始向上寻找,进行概率的累加,比赛的时候这样写,超时了。赛后听说是使用的树状数组维护路径状态进行求解。具体过程是在一个. 阅读全文
posted @ 2013-07-24 21:14 沐阳 阅读(619) 评论(0) 推荐(0) 编辑
摘要:对于这几个函数的一些实例以便于理解:#include #include #include #include #include #include using namespace std;int main() { // vector的插入:如果迭代器指向了某一元素,那么插入后将该元素挤到了后面,即插入到该元素之前 vectorv; v.push_back(2), v.push_back(3), v.push_back(4); vector::iterator it; it = v.begin(); it++; v.insert(it, 100); ... 阅读全文
posted @ 2013-07-24 10:47 沐阳 阅读(1352) 评论(0) 推荐(0) 编辑
摘要:题意:现给定一个字符集中一共Z个元素的环境,给出一个Z*Z的数组,表示从i到j之间的距离。给定两组字符串,分别问包含着两个字符串(给定的字符串为所求字符串的子序列不是子串)对应位的距离和值最小为多少?输出这两个字符串。分析:该题的状态还是比较好开设的,设dp[i][j]表示a串的前i个字符和b串的前j个字符被包含后的最小开销,于是动态转移方程:dp[i][j] = min(dp[i][j], dp[i-1][j] + wa[sa[i]]); 其中wa数组表示某个字符与另外一个最小花费的字符匹配,sa[i]表示a串的第i个字符dp[i][j] = min(dp[i][j], dp[i][j-1] 阅读全文
posted @ 2013-07-22 20:07 沐阳 阅读(609) 评论(0) 推荐(0) 编辑
摘要:题意:国王有N个儿子,现在每个儿子结婚都能够获得一定的喜悦值,王子编号为1-N,有N个女孩的编号同样为1-N,每个王子心中都有心仪的女孩,现在问如果安排,能够使得题中给定的式子和最大。分析:其实题目中那个开根号是个烟雾弹,只要关心喜悦值的平方即可。那么对王子和女孩之间构边,边权为喜悦值的平方,对于每一个王子虚拟出一个女孩边权为0,这样是为了所有的王子都能够有女孩可以配对,以便算法能够正确的执行。#include #include #include #include #include using namespace std;const int N = 405;const int inf = 0x 阅读全文
posted @ 2013-07-22 10:07 沐阳 阅读(422) 评论(0) 推荐(0) 编辑
摘要:题意:该题的题意晦涩,勉勉强强听别人说了一遍后再读了一遍题才算懂了题意,题图说的是A国因为B国药进攻自己的国家,于是想办法在联通A-B之间的路径上进行阻击。阻击的舰船停留在一个路径上,舰船上都要放置水晶,相同水晶的舰船可能会被一次性摧毁,于是现在要求给出尽可能多的方案来部署舰船,使得同一水晶的舰船能够阻断所有从B到A的路径,每条路径上只能够部署一部舰船。分析:题意抽象之后就是一个网络求出从源点到汇点的尽可能多的割边集,且每个割边集没有公共边。根据题目的要求,我们设想从A到B的最短路长度为K,那么假设方案数大于K,那么每个割边集至少要包含该最短路上的一条边,否则存在从A到B的通路,那么这个包含的 阅读全文
posted @ 2013-07-22 10:01 沐阳 阅读(399) 评论(0) 推荐(0) 编辑
摘要:题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次。要求输出一个阻塞流。分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLPP)能够直接秒掉这一题。当然还有一种挽救的方式就是首先进行一次贪心预流,然后进行dinic。也是第一次听说还有贪心预流这回事,所以找了一份代码特地学习了一番。具体步骤如下:1.首先将所有节点按照层次进行排序,对每个节点有in[i]和out[i]两个属性,前者表示能够流入到该节点的流量,后者表示能够流出该节点的流量;2.从层次最低的节点(即源点)开始,设in[S] = inf,表示源点能够进入无限的流 阅读全文
posted @ 2013-07-21 18:54 沐阳 阅读(633) 评论(1) 推荐(1) 编辑
摘要:题意:给定一个数N,表示有N个位置,要么放置0,要么放置1,问至少存在一个连续的M个1的放置方式有多少?分析:正面求解可能还要考虑到重复计算带来的影响,该题适应反面求解。设dp[i][j]表示到前 i 为后导 1 个数为 j 的方案数,于是有动态规划方程:dp[i][0] = sum{ dp[i-1][0... min(i-1, M) ] };dp[i][j] = dp[i-1][j-1] 其中 j != 1单单根据这个方程时间度为O(N*M),还是不足以在有限的时间内解出该问题。通过观察我们发现方程可以简化,即后一层的和值是上一层和值的两倍减去上层的最后一个值。于是可以维护一个最后一个值得队 阅读全文
posted @ 2013-07-20 18:19 沐阳 阅读(441) 评论(0) 推荐(0) 编辑
摘要:CF328BSheldon and Ice Pieces题意:给定一个数字序列,问后面的数字元素能够组成最多的组数。分析:把2和5,6和9看作是一个元素,然后求出一个最小的组数就可以了。#include #include #include #include #include #include using namespace std;char obj[10000];char str[10000];int digit[15], rec[15];inline int get(char ch) { if (ch == '5') return 2; else if (ch == ' 阅读全文
posted @ 2013-07-17 18:57 沐阳 阅读(265) 评论(0) 推荐(0) 编辑
摘要:sgu542Gena vs Petyasgu543Cafe题意:有N组人需要被分配到某些固定了人数的桌子上,其中ai表示第i组有多少个人,安排作为需要符合如下安排:某一组的人员不能够单独在一张桌子,每张桌子坐的人数不能够超过其限制,问至少要安排多少张给定了人数限制的桌子。分析:此题是一个贪心题,如果直接求解的话,由于桌子的数量是未知的,因此不太好分配,因此二分桌子的数量,在已知桌子的数量后运用贪心规则来求得最优解。但尽管在二分已知桌子的情况下还是不太好实现这个贪心规则。其思路是这样的:1.如果桌子的限制为奇数,那么想办法把这些的桌子用奇数人数的组分出1个3来填,使得其限制变成偶数,这样是为了更 阅读全文
posted @ 2013-07-17 17:06 沐阳 阅读(532) 评论(0) 推荐(0) 编辑
摘要:题意:有n个球,其中有0、1、2...n个黑球的概率是相等的,现在从中取出L个球,p个黑球q个白球。现在问猜一个黑球的区间,使得落在这个区间的概率大于给定的一个数值。详见代码:#include #include #include #include #include using namespace std;int n, p, q, pri;/* n个球,取出p+q个球,其中黑球p个,白球q个,要求的概率最低值为p 设n个球中有k个黑球的事件为Ak ,设取出p+q个球中有p个黑球为事件B题目所有概率为sum{p(Ak|B)}>=pri的k的取值区间 p(Ak|B)不好求解,通过贝叶斯公式p( 阅读全文
posted @ 2013-07-15 20:56 沐阳 阅读(520) 评论(0) 推荐(0) 编辑
摘要:题意:给定一个最小费用流的模型,根据给定的数据判定是否为最优解,如果不为最优解则给出一个比给定更优的解即可。不需要得出最优解。解法:由给定的数据能够得出一个残图,且这个图满足了最大流的性质,判定一个残图是否满足最小费用最大流的判定依据类比于最大流中的层次图的构建,此时只需要判定图中是否存在负环即可。在写的过程中由于图中的编号和抽象了之后的编号有一个变换关系,所以处理要小心,一开始直接写了个最小费用最大流,通过费用来判定是否为最优TLE。找负环的时候,该题宜从汇点开始遍历,因为源点发出的边肯定全部满流(由于要疏散所有的人),而市政大楼与避难所在内部又分别没有边相连,所以要形成回路就必定会经过汇点 阅读全文
posted @ 2013-07-15 10:36 沐阳 阅读(1240) 评论(0) 推荐(0) 编辑
摘要:二维数组中的查找分析:既然已经给定了每一行从左至右递增,那么对于每一行直接二分查找即可,一开始还想着每一列同样查找一次,后来发现每一行查找一遍就能够遍历所有的元素了。#include #include #include #include #include #define MaxN 1000using namespace std;int N, M, x;int a[MaxN+5][MaxN+5]; bool bisearch(int *base, int delta, int l, int r, int val) { int mid, t; while (l > 1; ... 阅读全文
posted @ 2013-07-07 10:13 沐阳 阅读(303) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示