上一页 1 ··· 34 35 36 37 38 39 40 41 42 ··· 66 下一页
摘要: 对于一个串,我们可以这样考虑,首先我们从串的最后面开始向前遍历。对于一个串是 "XXXXAA",那么对于后面这两个A,我们是不用做任何考虑的,我们甚至可以直接认为这个串没有后面这两位。对于一个串是 "XXXXBB",那么我们是一定要选择反转的,因为单次操作的话将这两个(或者多个)B变成A需要两次操作,而我们通过翻转整个串,再翻转前N-2个串同样可以达到这个效果。但是我们翻转整个串可能为前面的字符串改变作了贡献。对于一个串是 "XXXXAB",那么我们是一定进行单个字符替换的。我们可以这样考虑,如果我们通过一次翻转操作来改变最后面的这一 阅读全文
posted @ 2012-07-24 00:23 沐阳 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 这题数据范围小,就直接暴力了,没什么好讨论的了。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int N, M, seq[150];int main(){ int ret; while (scanf("%d %d", &N, &M) == 2) { ret = 0; for (int i = 1; i <= N; ++i) { scanf("%d& 阅读全文
posted @ 2012-07-24 00:08 沐阳 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 这题是一道非常直接的中国剩余定理的题目,但是这里的不同的给定的几个数不一定是互质的。因此也就不能直接用解中国剩余定理的方法来求了。我们通过迭代法来求解最后的答案。设有 x = 1(mod 5) y = 2(mod 6) z = 3(mod 7)那么根据第一个方程我们设 x = 5t+1, 代入到第二个方程 5t+1 = 2(mod 6) ==> 5t -6u = 2-1 左边这个式子就可以用扩展GCD求出t的解,我们知道t的解由两部分组成,一部分是我们解出来的一般解5(必须保证为最小的正整数),此时u等于4,另外的就是加上 k 个 6 / gcd(5, 6)了,那么我们可以得到 t =. 阅读全文
posted @ 2012-07-21 18:08 沐阳 阅读(340) 评论(0) 推荐(1) 编辑
摘要: 这题就是一个简单扩展GCD,方程为 x*C + y * 2^k = B-A.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef long long int Int64;Int64 A, B, C, K;Int64 _pow(Int64 a, Int64 b){ Int64 ret = 1; while (b) { if (b & 1) { ret *= a; } ... 阅读全文
posted @ 2012-07-21 15:44 沐阳 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;int b[4], D;int ext_gcd(int a, int b, int &x, int &y){ int ret, temp; if (b == 阅读全文
posted @ 2012-07-21 12:24 沐阳 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 该题说的是一个小东西生活在管道内,长度为L,里面有一些蛋糕,现在动态的给定蛋糕的坐标,小东西的坐标初始话为0,当指令为吃蛋糕的时候,小东西将会去吃最临近的蛋糕。现在问你小东西在Q次询问下要走多远的距离。这题用树状数组+二分查找超时了。。 构造出一棵线段树,每个节点保留区间中所有的蛋糕数以及左右蛋糕最近的坐标。维护好线段树即可。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;int L, Q;struct Node{ int num, l, r, lef 阅读全文
posted @ 2012-07-20 21:38 沐阳 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 该题题义是给定一个公司的结构,然后针对每个员工的一系列操作。由于问题牵涉到一个员工以及一个员工所领导的部门,因此用普通线性结构显然效率太低。这里用到了线段树。step1:首先我们要确定题目是要对给定的点或者是区间进行操作,那么我们自然而然会想到线段树,但是这题还不是直接的线段树,需要对题中给定的关系进行离散话,也就是按 照先序或者是后序遍历进行排序,这样某一个员工所领导的部门下的成员就在物理上连续了,并且我们用两个数组分别记录某个成员所领导的部门的左边界和右边界。step2:有了上一步的操作后,我们就可以进行构树了,按照普通的线段树进行构建,线段树仅仅只是我们处理点和区间的一种数据结构,... 阅读全文
posted @ 2012-07-20 18:29 沐阳 阅读(652) 评论(0) 推荐(0) 编辑
摘要: 该题题意是给定一个音乐串,要求最长的主题串满足可以找到两个这样的串,在对方的每一位添加一个数字 两个串互相不能够有重叠有是多项式插值取模的hash的应用代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#define T 99991#define MAXN 20000#define MOD 3001using namespace std;typedef unsigned long long UInt64;struct Node{ UInt64 key; int begin, end, next 阅读全文
posted @ 2012-07-18 23:47 沐阳 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 这题的题意是给定N个串,某个串的子串在超过一半的串存在的话,那么这个串就是可取的,问满足这样的子串的最长长度是多少,如果有多个的话,按字典序输出。这题我是用hash过的。大体步骤是这样的,首先保留最长串的长度,然后二分0-MAXNLEN得到答案,那么这里重点就是如何去写这个判定函数。二分里面只会传递一个参数那就是长度K,根据这个长度我们把所有的串都拆成长度为K的子串,这里有个优化就是使用一种hash规则能够在得到1 - N的hash的时候计算出2 - N+1的hash值,那么这里用到了经典的多项式插值取模的方法:假设有一个字符串a[0],a[1],a[2],a[4],取长度为3的子串的时候,第 阅读全文
posted @ 2012-07-18 21:22 沐阳 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 直接用DP方程直接TLE了,因为数据范围达到了10^9......这题的正解是先用DP方程分别求出在t步走到每一行(列)的可能,再将其相加到一个步数为t的数组中,表示到第t步时,所有行(列)的种数,最后再用一个组合公式,将规定的K步进行分解来求得最后的答案。这题要特别要注意边界条件,还有就是防止溢出。这里用到了一个公式来求组合数 C[i, j] = C[i-1, j] + C[i-1, j-1]。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#define MOD 1000000007us 阅读全文
posted @ 2012-07-17 11:05 沐阳 阅读(232) 评论(0) 推荐(0) 编辑
上一页 1 ··· 34 35 36 37 38 39 40 41 42 ··· 66 下一页