上一页 1 2 3 4 5 6 7 ··· 20 下一页
摘要: A Simple Problem with Integers每次将区间向下更新,或是用之前的方法,统计当前节点到父节点处的覆盖数目。#include #include using namespace std;const int MAXN = 100005;typedef long long int64;int d[MAXN];class SegNode {public: int L, R; int64 c, sum; int64 get_c() { return c * (R - L + 1); } void log(const char *info) { ... 阅读全文
posted @ 2013-09-03 23:06 litstrong 阅读(149) 评论(0) 推荐(0)
摘要: 哈哈,原来题意看错了,但有多个解的时候,输出起点靠前的,如果起点一样,则输出终点靠前的,修改后AC的代码如下:#include #include #include using namespace std;const int MAXN = 500005;typedef long long int64;int dish[MAXN];int64 dish_sum[MAXN];int64 get_sum(int L, int R) { return dish_sum[R] - dish_sum[L - 1];}class SegNode {public: int L, R; int ... 阅读全文
posted @ 2013-08-31 14:05 litstrong 阅读(280) 评论(0) 推荐(0)
摘要: 今天无意间找到了训练指南的网上代码,都是刘汝佳写的,在这。今天在做这题1400-"Ray, Pass me the dishes!",我写的线段树的思路跟上次的Frequent Sequence的思路类似,维护区间上从左端点开始、从右端点开始,中间部分的最优序列,查了半天,没查到问题,先把代码备份上来。#include #include #include using namespace std;const int MAXN = 500005;typedef long long int64;int dish[MAXN];int64 dish_sum[MAXN];int64 g 阅读全文
posted @ 2013-08-29 15:50 litstrong 阅读(209) 评论(0) 推荐(0)
摘要: 250:给一个串S,可以做这样的操作,可以将串中的一种字母变成另一种字母,代价是该种字母的数量。求解的问题是,最小的代价将串S变成回文串。根据回文关系,我们可以形成等价对应关系,a与b等价对应说明a和b必须是同种字母,根据这个关系,我们可以得到一个图,每个连通块表示要变成一种相同的字母,而这个操作的最小代价就是将连通块中除出现次数最多的字母全部都转变成出现次数最多的字母。#include #include #include #include using namespace std;bool mm[256][256];int cnt[256];bool used[256];class Goose 阅读全文
posted @ 2013-08-28 20:33 litstrong 阅读(356) 评论(0) 推荐(0)
摘要: 250:有n首歌每首歌有duration和tone,连续唱m首歌会消耗每首歌的duration以及相邻两首歌的tone的差的绝对值的和,给个T,问说在T时间内最对能唱多少歌。将歌按tone排序后发现,只要枚举连续歌的最左和最右,这样产生的收尾的tone的绝对值的差的和是不变的,然后将中间的歌按duration从小到大唱,知道时间T消耗完毕。500:要发现访问若干room后获取到的钥匙的数量与访问的顺序是无关的,用dp(i, j)表示访问过i(i表示访问过的room的二进制状态压缩)后,手里拥有j把红钥匙的白钥匙最多的数量。#include #include #include #include 阅读全文
posted @ 2013-08-28 20:22 litstrong 阅读(218) 评论(0) 推荐(0)
摘要: 12232-Exclusive-OR题目大意是可以设定一个点Xp=v,或者Xp^Xq=v,然后查询Xa^Xb^Xc...等于多少。由于异或操作跟判连通性很类似,这里可以使用并查集来解决,对于Xp^Xq=v先判断Xp和Xq是否来自一颗树,若是来自一个棵树,则判相容性,否则连接这两棵树,而Xp=v是用来lock一棵树的,当一棵树未被lock时,这颗树中的所有值都不确定,当lock之后,就可以确定这颗树的所有值了。而最后求Xa^Xb^Xc...时,先按树进行分类,对于lock的树的X直接求解,都与非lock的树,若有偶数个则可以求解,否则得不到固定的值,算法应该没有问题,可是AC不了,不好debug 阅读全文
posted @ 2013-08-27 16:04 litstrong 阅读(361) 评论(0) 推荐(0)
摘要: 11988-Broken Keyboard (a.k.a. Beiju Text)可以用deque来模拟。#include #include #include #include #include using namespace std;const int MAX = 100005;char ch[MAX];int main() { while (scanf("%s", ch) != EOF) { deque Q; string buffer = ""; int toward = 1; int n = strlen(ch); ... 阅读全文
posted @ 2013-08-27 15:57 litstrong 阅读(313) 评论(0) 推荐(0)
摘要: C. Xenia and Weights有1...10k的砝码,在天枰上,左右轮流放置砝码,要求之后左右轮流比另一侧重量要大,要求相邻两次砝码不能相同。解题报告给出(i,j,k)表示balance,j表示最后一次的砝码重量,k表示第几步,然后表示从点(0,0,0)->(x,y,m)的图论问题,跟动态规划是等价的,复杂度是O(w^3*m)。我给出了一个比上述算法更优的一个算法,做法是用dp[i][j]表示第i步balance达到j时的所有可能的砝码情况的二进制mask,复杂度是O(w^2*m),但要求w#include #include #include using namespace s 阅读全文
posted @ 2013-08-27 15:43 litstrong 阅读(4368) 评论(0) 推荐(0)
摘要: 早早得就学了线段树的一些基础应用,当时急于应用,对它的好多认识都比较肤浅,最近拿起来复习了下,加深了些对它的理解。我觉得重要的就是要理解,对于一条线段[L R]在线段树中插入或是更新或是查询,它的复杂度为什么是log级别的,我想了两个方法来证明:1. 对于线段[L R]对node[r].L及node[r].R的覆盖情况,可以分成三种情况,一种是node[r].L及node[r].R被线段[L R]覆盖;一种是node[r].L及node[r].R其中一个端点被[L R]覆盖;最后一种是两个端点都不被覆盖。第一种就直接返回了,第二种到下一层节点的时候,又转变成了第二种的问题,因此复杂度最高是树高 阅读全文
posted @ 2013-08-27 15:25 litstrong 阅读(203) 评论(0) 推荐(0)
摘要: 在抽取MinHeap的时候,涉及到重载,覆盖,虚函数等,有几点之前没注意到的问题在这里总结下:1. 覆盖(override)只要是函数同名就会被覆盖,子类指针若调用父类的同名不同参数的函数的话,会在编译时期报编译错误;2. 成员函数在编译时就确定该函数的所属类,同一个类的不同对象共享一份成员函数地址,根据指针的类型调用指定的成员函数,属于early bind;3. 虚函数采用late bind,就是在运行时才能确定具体调用的函数,根据this指向的内存空间类型,去对应的虚表中取对应的函数,通过同一个slot位置抽象;4. 成员函数的实现跟全局函数类似,找到该函数对应的逻辑代码段后,将this指 阅读全文
posted @ 2013-08-26 18:40 litstrong 阅读(157) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 ··· 20 下一页