随笔分类 -  acm训练

上一页 1 2 3 4 5 6 ··· 8 下一页
摘要:先说一下割点跟割边吧。割桥就是如果一个连通图里删除这条边之后,这个图会变成两个连通图,那么这条边就称之为割桥。这是割桥的代码,里面呆着lca求法。割点和割桥的就是用一个时间戳和回到祖先确定。用dfs的时间戳可以看出。割点为low[v] >= dfn[u]割边为low[v] > dfn[u]。但是要注意的是割点的条件对于搜索树的根节点是要特殊处理的,当根节点的孩子大于1的时候就一定是割点。 1 void tarjan(int u,int pre) 2 { 3 int v,i,j; 4 dfn[u] = low[u] = ++dfsclock; 5 loop(0,i,g[u... 阅读全文
posted @ 2013-08-11 17:14 某某。 阅读(148) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=3592题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队#外,每个点只能向右走或向下走,并且可以反复经过一个点。如今请求得最多可以获得多大好处。一开始看到这个题,会以为是费用流。但是计划上是在tarjan上的。我觉得如果比赛的时候有这道题估计我也就挂了。因为这个图大部分的点只有两个后续节点, 但是*会有更多的节点,所以说这样会产生环,因此可以吧整个图求强连通进行缩点,因为每个强连通分量重的点你是可以得到她所有的值。不管走几次,就是那么多,缩完点之后就可以构 阅读全文
posted @ 2013-08-07 15:41 某某。 阅读(678) 评论(0) 推荐(0)
摘要:题意: 有N个点,M条边。 点有权值, 边有权值。 Alice, Bob 分别选点。 如果一条边的两个顶点被同一个人选了, 那么能获得该权值。问 Alice - Bob?链接:http://acm.hdu.edu.cn/showproblem.php?pid=4647思路: 贪心。对于一条边来说, 如果拿了一个点, 说明已经拿了该边的一半权值。如果某边的两个的顶点分别是不同的人。 那么差值还是不变的。如果某边的两个顶点分别是同一个人。 那么和值也不变。所以我们可以把一个边分解到两个顶点上。然后依次Alice 取最大,Bob 取次大。 因为 他们都是绝顶聪明的。当时也想过,但是觉着不可能这么简单 阅读全文
posted @ 2013-08-07 09:30 某某。 阅读(304) 评论(0) 推荐(0)
摘要:连接:http://acm.hdu.edu.cn/showproblem.php?pid=4638题意:就给给你n个数(大小在1-n里),然后给你连续的可以构成一个块,再给你N个询问,每个询问一个l,一个r问你l-r里面有多少个连续的段其实每一个数都是一个独立的段,当有连续的时候连续段数就会-1,因为连续的段中,位置最靠前的哪一个只会影响以这个位置为l的询问,不会影响后面的,所以,我们可以对询问从后向前去找,离线话去找。这样的话就可以用树状数组去解决问题、 1 #include 2 #include 3 #include 4 #include 5 #include 6 #... 阅读全文
posted @ 2013-08-05 16:11 某某。 阅读(469) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4630题意:给你N个数,然后给你M个询问,每个询问包含一个l 一个r,问你lr 这个区间中任意两个数最大的公约数。思路:以为是l,r所以,只跟l后面的有关,所以把询问排序,数组a[]从后往前枚举约数,标记下这个约数最早出现的位置,如果这个约数出现了,那就让这个数更新一下最大的保存在树状数组中,如果没出现,那么就标记一下位置就好~这样的后面的答案会影响前面的但是前面的不会影响后面的。 1 #include 2 #include 3 #include 4 #include 5 #inc... 阅读全文
posted @ 2013-08-04 14:40 某某。 阅读(158) 评论(0) 推荐(0)
摘要:题意:告诉你一些骨牌,然后骨牌的位置与横竖,这样求最多保留多少无覆盖的方格。这样的话有人用二分匹配,因为两个必定去掉一个,我用的是最小割,因为保证横着和竖着不连通即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define loop(s,i,n) for(i = s;i edges; 14 vectorg[maxn],G[maxn]; 15 void addedge(int u,int v,int cap,int flow) 16 { 17 //printf("********u %d *... 阅读全文
posted @ 2013-08-03 11:03 某某。 阅读(227) 评论(0) 推荐(0)
摘要:题意:给你一个连通图,问你最多加多少条边,还能保证该图不是强连通图。对整个图求强连通分量,然后对图缩点,记录一下缩点之后每隔点包含的原来的点的个数,找出最少的那个点,然后对这个点建成完全图,对另外的所有点建成完全图。然后+两个点建边-所有原来的遍就好了。链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 c... 阅读全文
posted @ 2013-08-03 10:54 某某。 阅读(204) 评论(0) 推荐(0)
摘要:题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串。连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622网上也有用后缀数组搞得、思路(虎哥):用字典树把每一个字符串对应成一个整数 相同的字符串对应到相同的整数上把所用的串对应的整数放在一个数组里 比如书字符串s[l...r]对应的整数是 k那么二维数组 [l][r] 就等于k假设一个对应好的二维数组左下角是原点3 4 5 22 3 4 01 6 0 02 0 0 0这样求解 从l到r的不同字符串的个数 其实就是求 从[l][r] 到右下角所在的矩阵所包含不同整数的个数(不包括0)这里 阅读全文
posted @ 2013-08-03 09:58 某某。 阅读(610) 评论(0) 推荐(0)
摘要:题意:给你一个字符串,问你整个字符串有多少个回文字串。(可以不连续)状态方程 dp[i][j] = dp[i+1][j]+dp[i][j-1]+dp[i+1][j-1]+(a[i] == a[j]? 0:1;)对于长度为1 2 3 的时候特判一下就可以了。当然状态方程在些的时候会有改动,详细的还是看代码吧。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define loop(s,i,n) for(i = s;i 2)38 dp[i]... 阅读全文
posted @ 2013-08-02 14:28 某某。 阅读(353) 评论(0) 推荐(0)
摘要:题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数。状态+dpdp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串);连接:http://acm.hdu.edu.cn/showproblem.php?pid=4628代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define loop(s,i,n) for(i = s;i < n;i++) 9 10 using namespace std;11 i... 阅读全文
posted @ 2013-07-31 16:09 某某。 阅读(232) 评论(0) 推荐(0)
摘要:Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html基本概念:1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。3.点连通度:最小割点集合中的顶点数。4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图。5.割边集合:如 阅读全文
posted @ 2013-07-31 14:23 某某。 阅读(2379) 评论(0) 推荐(0)
摘要:题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥。一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时。那么就可以缩点,因为如果一条边不是桥那么无论怎么加边他肯定都不会变成桥,这样我吧不是桥的点缩成一个点。这样全图就都是桥,这样的话,我们就在加的遍里面去找如果加的边是同一个点,那么,肯定不会减少桥,但是如果不是同一个,那么桥肯定减少~。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #defin... 阅读全文
posted @ 2013-07-31 14:21 某某。 阅读(579) 评论(0) 推荐(0)
摘要:题解:http://blog.csdn.net/lyy289065406/article/details/6756821讲的很详细我就不多说了。题目连接:http://poj.org/problem?id=2942代码(完全白书上的) 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i = s;i g[maxn],bcc[maxn]; 15 struct edge 16 { 17 ... 阅读全文
posted @ 2013-07-30 18:50 某某。 阅读(481) 评论(0) 推荐(0)
摘要:题意:给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止;如果w>x,那么它往左、右儿子的概率都是1、2;如果w 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define cl(a,b) memset(a,b,sizeof(a)) 9 #define loop(s,i,n) for(i = s;i q[maxn]; 27 int ans[maxn][2]; 28 int cnt; 29 int lowbit(int x)... 阅读全文
posted @ 2013-07-30 09:45 某某。 阅读(475) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=2186题意:给你N个点,然后在给你N条有向边,然后让你找出这样的点S,S满足条件图上任意一点都能到达S。要想满足任意一点都能到达,首先满足图连通,然后满足将图缩点后形成一个棵树,树的特征是可以有且只有一个点的出度为0。然后代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 const int maxn = 50050; 11 12 ... 阅读全文
posted @ 2013-07-29 21:39 某某。 阅读(208) 评论(0) 推荐(0)
摘要:题意就是找一个 左右上下对称的正方形矩阵。连接:http://acm.hdu.edu.cn/showproblem.php?pid=4618没想到记忆+dp和暴力就能水过。。。//记忆话搜索+dp#include #include #include #include using namespace std;int a[301][301];char dp[301][301][301];int n,m;int judge(int i,int j,int len){ int k; if(i+len-1 >= n) return 0; if(j+len-1 >= m) return ... 阅读全文
posted @ 2013-07-29 14:16 某某。 阅读(265) 评论(0) 推荐(0)
摘要:题意:有一群小朋友围成一个环,编号1,2,3…N。每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此。并设i为小于等于N的最大反素数,问第i个出列的人得编号,i的约数个数。(设g(i)为i的约数的个数,若任意j#include #include using namespace std;#define maxn 100005int maxsub[maxn>1; build(l, m, rt>1; if (m >= target) update(target, val, l, m, rt<<1); els 阅读全文
posted @ 2013-07-25 17:17 某某。 阅读(204) 评论(0) 推荐(0)
摘要:问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列。算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。动态规划解决过静态的序列最大连续子序列和问题,时间复杂度可以达到 n(环形序列可能复杂度更高)。但是这里涉及到动态更新,更新频度很大,如果计算子序列和复杂度仍然是n,就会非常耗时。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;否则,答案是:max{根结点的非空最大子列, 环上数的总和-根结点的非空最小子列}一开始想到,如果将环从一点断开,那么最大和如果包括断点的最后一个 阅读全文
posted @ 2013-07-25 17:14 某某。 阅读(267) 评论(0) 推荐(0)
摘要:题目连接:题意:要求设计这样一个数据结构,支持下列操作1.add(x,y,a).对二维数组的第x行,第y列加上a.2.sum(l,b,r,t).求所有满足l 2 #include 3 #include 4 #include 5 #define loop(s,i,n) for(i = s;i 0;i -= lowbit(i))25 {26 for(j = b;j > 0;j -= lowbit(j))27 res+=c[i][j];28 }29 return res;30 }31 int main()32 {33 int t... 阅读全文
posted @ 2013-07-25 12:00 某某。 阅读(150) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4604思路:就是模拟一下,求每一个开始的非上升和非下降序列。然后求重复的数,由于求出来可能不会是我们想要的序列如22221122233这样的话求出来的会是2222222 222222233,而我们想要的到的是112222,所以不能用普通的,而是用N*logN(当然也是因为数列太长),而我们得到的是1122222多处一个2这个2是11之前留下的,但是因为2比1大才留下,那么2一定会留在最长上升里面,所以2是会被算作重复的减掉。代码: 1 #include 2 #include 3 #incl... 阅读全文
posted @ 2013-07-25 11:54 某某。 阅读(357) 评论(0) 推荐(0)

上一页 1 2 3 4 5 6 ··· 8 下一页