上一页 1 ··· 7 8 9 10 11 12 13 14 15 16 下一页
摘要: 做这题主要是为了学习一下tarjan的强连通分量,因为包括桥,双连通分量,强连通分量很多的求法其实都可以源于tarjan的这种方法,通过一个low,pre数组求出来。题意:给你许多的A->B ,B->C这样的喜欢的关系,A->B ,B->C也意味着A->C,最后问你被全部别的人喜欢的cow有多少个。如果不告诉你用强连通分量,感觉可能会绕的远一些,但是如果知道了这个思路其实是很显然的。首先是跑出每个强连通分量,在这种情况下,原来的图就变成了一棵树,一棵有有向边的树,然后不难发现,如果这棵树存在一个出度为0的点,那么它就很有可能是答案,为什么是可能呢?因为我们不知道是 阅读全文
posted @ 2014-02-24 20:17 chanme 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 题目的意思很简单,给你一个已经连通的无向图,我们知道,图上不同的边连通分量之间有一定数量的桥,题目要求的就是要你再在这个图上加一条边,使得图的桥数目减到最少。首先要做的就是找出桥,以及每个点所各自代表的连通分量。 找桥的方法就是经典的low[u],pre[v]的判断,这个在大白书上也有比较详尽的介绍。当我们找到桥之后我们当然要把桥边存起来,存的时候就有很多姿势了,因为题目给的点达到200000的级别,所以肯定不能开一个邻接矩阵,所以存的时候要么就开个vector存下所有的桥边,但是遍历索引的时候就会很蛋疼。要么就采用另外一种方法,vector P[i],其中P[i]这个vector里存下了所有 阅读全文
posted @ 2014-02-24 19:01 chanme 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 现在打算重新学习图论的一些基础算法,包括像桥,割顶,双连通分量,强连通分量这些基础算法我都打算重敲一次,因为这些量都是可以用tarjan的算法求得的,这次的割顶算是对tarjan的那一类算法的理解的再次实现吧,后面打算做一下桥的判断和边双连通的关系,边双连通处理的时候如果又重边的话会很不一样,割顶也会相应的不一样,这里的代码是没有考虑重边的,后面再写一个考虑重边的吧。#pragma warning(disable:4996)#include#include#include#include#include#include#include#define maxn 150using namespac 阅读全文
posted @ 2014-02-23 23:38 chanme 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有多少个被划分到了左子树,知道区间有多少个被分到左子树,就可以一路递归下去,不需要像函数式线段数一样,二分再加query,所以每次询问的复杂度也只是O(nlogn),空间复杂度的话就是O(nlogn),具体的介绍很多个链接都有,具体看下面给出的两个链接,它们对我起到非常大的帮助。http://blog.csdn.net/famousdt/article/details/7064866http://w 阅读全文
posted @ 2014-02-23 17:28 chanme 阅读(177) 评论(0) 推荐(0) 编辑
摘要: Manacher算法是O(n)求最长回文子串的算法,其原理很多别的博客都有介绍,代码用的是clj模板里的,写的确实是异常的简洁,现在的我只能理解个大概,下面这个网址的介绍比较接近于这个模板,以后再好好理解,我现在先放一放http://www.starvae.com/?p=212#pragma warning(disable:4996)#include#include#include#include#include#include#includeusing namespace std;void palindrome(char cs[], int len[], int n) { //len[i] 阅读全文
posted @ 2014-02-23 13:36 chanme 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 跟上面那篇轮廓线dp是一样的,但是多了两个条件,一个是在原图上可能有些点是不能放的(即障碍),所以转移的时候要多一个判断color[i][j]是不是等于1什么的,另外一个是我们可以有多的1*1的骨牌,1*1的骨牌使用数量一定要在[c,d]之间,所以状态加多一维,转移的时候多一种情况(放1的)。那么怎么初始化呢?有两种方法,一种是dp[0][0][d]=1,最后的答案的因为一定要用[c,d]之间,所以答案是dp[(t+1)&1][0][0~d-c].另外一种是dp[0][0][c~d]=1,最后答案是dp[(t+1)&1][0][0]学了就觉得很简单,60行不到的代码让我们和银奖 阅读全文
posted @ 2014-02-22 21:55 chanme 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 第一道轮廓线dp,因为不会轮廓线dp我们在南京区域赛的时候没有拿到银,可见知识点的欠缺是我薄弱的环节。题目就是要你用1*2的多米诺骨排填充一个大小n*m(n,m#include#include#include#include#include#include#define ll long longusing namespace std;int n, m;ll dp[2][1 > n >> m &&(n||m)) { memset(dp, 0, sizeof(dp)); ll *cur, *next; cur = dp[0]; next = dp[1]; cur[ 阅读全文
posted @ 2014-02-22 21:04 chanme 阅读(1432) 评论(0) 推荐(1) 编辑
摘要: 今天学了很多关于树状数组的技巧。一个是利用树状数组可以简单的实现段更新,点询问(二维的段更新点询问也可以),每次修改只需要修改2个角或者4个角就可以了,另外一个技巧就是这题,原本用线段树做,现在可以用树状数组做的题,只需多维护一个bit即可。具体的思路见下面的链接:http://hi.baidu.com/billdu/item/053f6a15ca301b0a8ebde400要理解里面的橙色块求的时候是打竖看的,不是打横看的。#pragma warning(disable:4996)#include#include#include#include#include#include#include 阅读全文
posted @ 2014-02-18 23:30 chanme 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 神一般的二维区间更新,运用二维树状数组会有神奇的效果。更改四个角实现区间更改的效果实在是太神奇了。。#pragma warning(disable:4996)#include#include#include#include#include#include#define maxn 1000using namespace std;int bit[maxn + 50][maxn + 50];int n;void inc(int i, int j,int m){ for (; i 0; i -= i&-i){ for (int tmpj = j; tmpj > 0; tmpj -= tm 阅读全文
posted @ 2014-02-18 17:08 chanme 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 给你一个字符串,然后询问它第k小的factor,坑的地方在于spoj实在是太慢了,要加各种常数优化,字符集如果不压缩一下必t。。#pragma warning(disable:4996)#include#include#include#include#include#include#define maxn 90050using namespace std;struct State{ State *suf, *go[26]; int val, cnt; char transch; State() :suf(0), val(0){ memset(go, 0, sizeof(go)); }}*ro. 阅读全文
posted @ 2014-02-16 23:38 chanme 阅读(155) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 16 下一页