上一页 1 ··· 154 155 156 157 158 159 160 161 162 ··· 182 下一页
摘要: 简单题,先从大到小排序,然后从两端开始向中间看看能不能把右端的匹配给左端。View Code #include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define maxn 100005int n, m;int f[maxn];int cmp(int a, int b){ return a > b;}int main(){ //freopen("t.t 阅读全文
posted @ 2011-05-14 20:29 金海峰 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题意:有一个长板子,多次操作,有两种操作,第一种是给从a到b那段染一种颜色c,另一种是询问a到b有多少种不同的颜色。分析:线段树,通过这题才真正理解了线段树的基本思想,无论是更新还是查询都要遵循一个原则,当线段恰好覆盖一个节点的区间时就直接对该节操作而不再向下操作。绝对不能把区间内所有节点全部一代到底,到叶子节点。对于这种线段树,要在获得整块区间时停止并把该节点的end改为true。以后其他更新或询问需要向下走时再按照该节点的信息进行子节点的信息进行修改,然后向下再进行。这题还学到一个重要的技巧,当数据范围较小时一定要考虑位操作。颜色最多30种,用位操作,一个整数可以表示一段的颜色状态。Vie 阅读全文
posted @ 2011-05-14 17:54 金海峰 阅读(3039) 评论(2) 推荐(0) 编辑
摘要: 题意:给出两个字符串,求最长公共子串的长度。分析:一道后缀数组的题,构造后缀数组有两种算法,dc3和倍增,效率分别为O(n)和O(nlogn),但前者的实现较困难。后缀数组构造后获得了3个数组,sa[i]表示所有后缀排序后的排在第i位的后缀,rank[i]表示原串从第i位到结尾的那个后缀在sa中的排名是多少。height[i]表示sa[i]和sa[i + 1]所表示的字符串的最长公共前缀的长度。本题可以利用height来做,先把两个串连接,找最大height。但是记得在把两个字符串连接时加一个特殊字符作分隔。并注意判断两个sa起始位置不在一个串的内部。之所以要加这个分隔符,首先是可以保证我们所 阅读全文
posted @ 2011-05-09 11:40 金海峰 阅读(1260) 评论(1) 推荐(0) 编辑
摘要: 简单题,但容易超时,不要每次memset,而是记录b数组那些位被修改过,记录在set中,然后每次把set中在b里的对应位改回0即可。View Code #include <stdio.h>#define maxn 305#define maxx 1000005int n, f[maxn], tot, set[maxn];int b[maxx];void input(){ int i; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &f[i]);}void cov 阅读全文
posted @ 2011-05-01 19:16 金海峰 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 强连通分支+拓扑排序 求强连通分支有两种方法,korasaju和tarjan。 korasaju是进行两次dfs覆盖全图(实际上是两种dfs,覆盖全图需要多次dfs),第一次给结点标起始和结束时间,第二次把图反向并从结束时间最大的结点开始dfs,每次dfs所能到达的结点为一个强连通分支。下面来简单讲 阅读全文
posted @ 2011-05-01 16:40 金海峰 阅读(1353) 评论(1) 推荐(1) 编辑
上一页 1 ··· 154 155 156 157 158 159 160 161 162 ··· 182 下一页