ACM
joy_go
这个作者很懒,什么都没留下…
展开
-
判断一个无向图是否为二分图
怎样判断一个图是否为二分图?很简单,用染色法,即从其中一个顶点开始,将跟它邻接的点染成与其不同的颜色,如果邻接的点有相同颜色的,则说明不是二分图,每次用bfs遍历即可。#include #include #include using namespace std;const int N = 510;int col[N],g[N][N];//0为白色,1为黑色 bool bf原创 2013-02-03 16:18:51 · 10255 阅读 · 2 评论 -
最短路算法(SPFA)
SPFA算法(Shortest Path Faster Algorithm),也是求解单源最短路径问题的一种算法,用来解决:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。 SPFA算法是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算,他的基本算法和Bellman-Ford一样,并且用如下的方法改进: 1、第二步,不是枚举所有节点,而是通过队列来原创 2012-12-03 21:39:28 · 617 阅读 · 0 评论 -
Codeforces 296D/295B(Greg and Graph)
题意:一个有向图,给出每两点间的距离,然后再给出一个删点的序列X,然后求出在删掉Xi前任意两点间的最短路的总和,然后把Xi这个顶点删去,连同和它相连的边;思路:一道floyd的好题,这题可以倒着做,首先一开始是一个空图,然后往里面加删点序列X里面的点,顺序是删点序列X的逆序,然后每次求出加完点后最短路总和即可。#include #include #include #define LL原创 2013-08-24 08:50:24 · 1190 阅读 · 0 评论 -
HDU 4576(Robot)
题意:杭州邀请赛的一道题;有标记着1~n的环,初始时有个机器人在1的位置,有m个操作,每个操作是使机器人随机的顺时针或逆时针的走w步,求所有操作过后机器人停在区间[l,r]内的概率;思路:挺明显的概率dp,首先可以很直观的定义出状态dp[i][j],表示第j次操作后停留在第i位置的概率,转移方程是dp[(i + w) % n][j] = dp[i[j-1] * 0.5;dp[i-w][原创 2013-08-10 18:17:46 · 1319 阅读 · 1 评论 -
强连通分量Tarjan模板
模板对应POJ1236#include #include #include #include #include using namespace std;const int N = 110;int head[N], cnt, sum, visit[N];struct go{ int e, next;}edge[N * N];void addedge(int a, int原创 2013-08-03 21:38:36 · 744 阅读 · 0 评论 -
POJ 2186(Popular Cows)
题意:有n个奶牛,它们之间互相膜拜,并且如果A膜拜B,B膜拜C则,A也膜拜C,求有多少头奶牛被所有奶牛都膜拜;思路:强连通分量+缩点,刚学SCC,这题是书上的例题,顺手敲下熟悉下,用的是Kosaraju算法,这个算法比较明了;对于这个题目,先求出强连通分量的个数,如果强连通分量个数只有一个,就输出n,否则对其进行缩点,然后统计各点缩完点之后的度数,若缩完点后度数为0的点有1个,则答案就原创 2013-04-17 12:31:46 · 492 阅读 · 0 评论 -
线段树求矩形并模板
#include #include #include #include #define lson(i) (idx << 1)#define rson(i) ((idx << 1) ^ 1)using namespace std;const int N = 1010;double y[N];struct segment{ double x, y1, y2; int fla原创 2013-08-03 11:13:13 · 651 阅读 · 0 评论 -
HDU 4614(Vases and Flowers)
题意:今天多校的一道题,给出一排连续的花盆,有两个操作,第一个操作是从x位置开始放d朵花到花盆里,输出放第一朵花和最后一朵花的位置,如果一朵花也不能放另外输出第二个操作是将区间[l,r]里的花扔掉,并输出扔掉多少朵花;思路:简单的线段树加二分,线段树需要实现的功能是区间替换和区间求和,然后对于第一个操作,每次二分出放第一朵花的位置和最后一朵花的位置。就是这么简单的一道题,比赛时思路都已有了原创 2013-07-25 23:47:41 · 1200 阅读 · 8 评论 -
HDU 3008(Warcraft)
题意:有点繁琐,这里不叙述了;思路:题目变量有点多,但是有些是不变的,所以定义状态的时候可以把这些忽略掉,然后很明显可以定义状态了,定义完状态之后发现其实是一个01背包,然后照着01背包的思路写就对了;定义状态dp[magic_value][attack_times],左边下标对应攻击完第k次后,右边下标对应的值为剩下的魔法值,数组的值为boss剩下的血量。状态转移方程dp[mag原创 2013-02-20 16:55:51 · 1284 阅读 · 3 评论 -
HDU 1754(I Hate It)
#include#define size 1000100#define maxNum(a,b) a>b?a:btypedef struct node{ int left,right; int max;};int num[size],id,maxValue;node tree[size];void creat(int left,int right,int no)/**原创 2012-09-03 13:32:19 · 290 阅读 · 0 评论 -
HDU 3308(LCIS)
题意:动态修改查询区间最长连续上升序列,注意:是连续的。思路:线段树区间合并的经典题,做这题最重要的是要写好pushUp函数,写pushUp函数需要递推一下,题目是求连续最长的子序列,所以可以知道每个区间的最长子序列有三种情况:1.最长子序列在左子区间;2.最长子序列在右子区间;3.最长子序列由左子区间和右子区间组成;前面两种情况直接更新到上一层即可,第三种情况则需将左子区间和右子区间合并,每原创 2013-07-17 21:31:04 · 800 阅读 · 0 评论 -
POJ 3368(Frequent values)
题意:给出一串非下降数字,然后给出若干个询问区间,求区间内数字出现最多的次数。思路:lrj白书上的一道不错的RMQ题,看了书的分析然后顺手切了下,解决这道题可以抓住数列非下降这个条件,也就是每个数字都有他的出现区间。我们用数组L[i],R[i]分别记录第i个数字最先出现和最后出现的位置。用数组cnt[i]来记录第i个数字出现的次数,然后对cnt数组(其实是maxArr[i][0])进行RMQ;原创 2013-07-01 20:03:11 · 785 阅读 · 0 评论 -
trie树(字典树)
String setMaintain a set of strings, supporting the following two operations:+s, which inserts string s into the set?s, which queries the number of string starts with the string原创 2013-01-28 14:59:57 · 496 阅读 · 0 评论 -
RMQ模板
模板对应POJ 3264#include #include #include #include #define N 50010using namespace std;int maxArr[N][16], minArr[N][16];int n, q, num[N];void Sparse_Table(){ int l = (int)(log((double)n) /原创 2013-03-18 20:02:16 · 1048 阅读 · 0 评论 -
树状数组
在书上看到了个求逆序数之类的题,之前用归并排序做过求逆序数的,看完书的讲解之后,知道了怎样用树状数组求逆序数,原理和统计求和类似;HDU 2492 统计 ai>aj>ak和ailow[i]表示a[i]前面有多少个数小于a[i],high[i]表示a[i]后面有多少个数个小于a[i]#include #include #define LL __int64using namesp原创 2013-05-08 17:48:19 · 610 阅读 · 0 评论 -
UVA 11991
题意:lrj白书上的一道题,给出一串数字,求第k个v出现时的下标;思路:用STL里的map和vector轻松的解决。。#include #include #include #include #include #include #include #include #include #include #include #include #define LL long l原创 2013-06-29 22:20:37 · 607 阅读 · 0 评论 -
Codeforces 292E(Copying Data)
题意:给出两个数组A,B,每次操作从将从A数组第x个位置开始的k个元素复制到B数组第y个位置(覆盖B数组的k个元素),然后询问B数组的某个下标的值思路:普通的线段树,实现区间修改,单点查询就行了,线段树结点储存A数组在这区间的开始结束位置#include #include #include #include #include #include #include #includ原创 2013-07-12 14:43:01 · 774 阅读 · 0 评论 -
ZOJ 3675(Trim the Nails)
题意:ZOJ 11月月赛,Robert需要剪指甲,但是他的指甲刀有缺陷,有些是剪不到的,他的指甲刀形如是一个字符串,符号'.'代表指甲刀这处有缺陷这处的指甲不能修剪到,符号'*'代表这处是完好的,这处的可以修剪到;如指甲刀**..**,要剪长度为6的指甲,则剪出来的指甲(1代表该处指甲已修剪,0则没有)是110011,这需要再剪一次;指甲刀可以左右移动,还可以翻转;思路原创 2012-12-01 16:20:36 · 765 阅读 · 0 评论 -
Codeforces 208C(Police Station)
题意:给出一个无向图,边权都为1,居民们需要从顶点1走到顶点n,而且只走最短路;然后让你在1~n中选一个顶点放置警察局,如果一个顶点放置了警察局,那么和这个顶点相连的道路都是安全的;求让你选择一个顶点放置警察局,使所有最短路中含有安全道路的平均值最大;其实就是sum(每一条最短路中含有安全边的数量)/ 最短路数;不同最短路的意思是如果两条路径至少含有1条不同的边就是不相同,不懂就去看题目样例吧-原创 2013-09-03 23:17:55 · 1107 阅读 · 0 评论 -
最大流模板(sap+gap+当前弧)
手抄了书上的模板,将它封装在一个结构体里,以后用起来更方便,对应POJ 1273 模板测试题#include #include #include #include const int N = 222;int n, m;struct ISAP{ int head[N], cnt, ans; int gap[N], curedge[N], d[N], pre[N];原创 2013-02-17 14:13:27 · 1550 阅读 · 0 评论 -
HDU 4750(Count The Pairs)
题意:今天南京网选的一道题,题意是给定一个边权都不一样的图,然后给出10W个询问,每个询问有个w,求图中任意两点路径中满足最大边中的最小边(瓶颈边)大于等于w的(s,t)对数,不懂的看下题理解下样例吧。思路:这题数据量有点大1W个点,50W条边,暴力不太可能;首先注意到题目给出的边权都不一样,那么有一个性质可以知道了,就是图的最小生成树是唯一的,然后再按kruskal的顺序合并边,每次合并边,原创 2013-09-21 19:05:26 · 1088 阅读 · 0 评论 -
Codeforces 189A
题意:给出一块长度为n的布,还有将这块布尽量的剪成最多块,但是剪出来的每一块小布的长度都必须是a或b或c这三个固定长度的一种;求最多能剪出多少块布。思路:简单的DP。。。状态转移方程如下dp[j + a] = max(dp[j + a], dp[j] + 1); dp[j + b] = max(dp[j + b], dp[j] + 1);dp[j + c] = max原创 2013-01-24 20:27:27 · 1055 阅读 · 1 评论 -
线段树区间更新
因为线段树的区间更新经常用,所以copy了个大牛的模板,自己美化了下,留着以后用。模板对应POJ 3468#include #include using namespace std;struct e{ int left, right; long long add, sum;};e tree[400011];long long a[100001];long long原创 2013-03-18 13:18:04 · 6427 阅读 · 2 评论 -
Codeforces 276E(Little Girl and Problem on Trees)
题意:给出一颗树,每次对树进行两种操作,第一种操作:给节点v及距离节点v,d个单位长度以内的节点加x 第二种操作:询问节点v当前的值。注意:给出的树中,除了节点1以为,其他节点的度都不会超过2。思路:刚开始逗比没看到上面那个条件,有了上面这个条件后可以发现,这种树肯定是节点1拖着很多直链的。看到别人的做法几乎都是开n颗线段树的,而我是用两颗线段树做的。首先,求出所有节点的深度(根节点深原创 2014-05-05 23:54:41 · 800 阅读 · 0 评论 -
最短路算法(Dijsktra + 优先队列)
模板,对应测试题HDU 2544#include #include #include #include #include #include #define pb push_back#define mp make_pair#define sz(x) ((int)(x).size())using namespace std;const int N = 1010;con原创 2013-09-08 01:35:37 · 1393 阅读 · 0 评论 -
HDU 4893(Wow! Such Sequence!)
题意:略;思路:很水的原创 2014-07-29 22:51:02 · 705 阅读 · 0 评论 -
HDU 4864(Task)
题意:略。思路:原创 2014-07-22 18:46:02 · 1031 阅读 · 0 评论 -
SGU 149(Computer Network)
题意:求树中任意两点的最长距离;思路:树形dp,这个也是入门题,不过稍难一些,因为状态转移时需要从父亲或儿子中转移,YY了很久也没什么思路,主要是不知道怎么从父亲中状态转移,看了下别人的分析。。原来需要用到两次dfs,还要维护儿子中最长距离和次最长距离(用set,或vector然后排序),涨姿势了。。千辛万苦总算A了。。推荐一篇比较好的分析,认真看下就懂了(http://hi.baidu.co原创 2013-03-07 15:42:28 · 1459 阅读 · 0 评论 -
HDU 4034(Graph)
题意:给出一个有向图两两顶点间的最短路,原创 2014-04-21 20:34:11 · 640 阅读 · 0 评论 -
HDU 4403(A very hard Aoshu problem)
唔...好久没写博客了,上大学久了,人也变懒了...不行,以后还是要坚持写。翻了翻OJ上提交了但是没有过的题目,对于我这种有强迫症的人来说,每多一道unsolved都会让我感觉很不舒服,然后随便找了道切了下做这题做之前还是要想清楚,因为这题做起来注意的细节稍微有点多,之前敲的dfs,感觉有点漏洞,然后想了想又换了二进制枚举。这题数据范围小,毫无疑问是枚举;感觉比较好的做法是枚举等号的位原创 2014-04-02 20:10:21 · 884 阅读 · 0 评论 -
BZOJ 1588(营业额统计)
题意:每输入一个数,找出最接近它的一个数。这题是比较裸的平衡树的题,可以用STL轻松解决,但是刚学了平衡树Treap,所以就练习下平衡树。第一次写平衡树,代码从LRJ的白书上和网上拼拼凑凑写出来了,感觉还挺好,真是名不虚传,平衡树太强大了。以前一直觉得平衡树有多难多复杂,多次尝试使劲学之后才发现,其实没有那么复杂-。- 代码封装得不够好,以后慢慢修改吧!#include #in原创 2013-12-21 19:37:52 · 1261 阅读 · 0 评论 -
POJ 1753(Flip Game)
题意:给出一个4x4的棋盘状态,求用最少的次数,将棋盘中的棋子翻成全部白色或黑色(如果要翻动其中一枚棋子,那它的上下左右的棋子也要翻过来);最初还读错题,以为是全部翻成黑色。。。囧啊。。读题真的是太不仔细了。。思路:暴力DFS,枚举所有状态即可,其实一个棋子翻2次就等于没翻,所以结果肯定是少于等于16的。#include#define INF 0xffffffint原创 2012-10-30 22:40:19 · 392 阅读 · 0 评论 -
Codeforces 282E(Sausage Maximization)
题意:给出一段序列,找出一个连续的前缀,一个连续的后缀,使这些数异或出来的值最大。除了前缀或后缀为空以外,前缀和后缀必须包含第一个和最后一个元素。就是序列a1,a2,a3...an,找出前缀[0,l],[r, n + 1],使这些数异或起来最大,其中r > l,a0和an+1假设它为0,就是说[0,0]表示前缀为空,[n+1,n+1]表示为后缀为空。思路:这题有点神,没做过类似的题感觉有点原创 2013-11-08 20:38:06 · 1358 阅读 · 0 评论 -
LCA倍增算法(模板)
LCA在线倍增模板,模板对应HDU 2586#include #include #include #include #include #include #include #define pb push_back#define mp make_pair#define sz(x) ((int)(x).size())using namespace std;const原创 2013-10-23 23:08:45 · 4644 阅读 · 1 评论 -
Codeforces 220B(Little Elephant and Array)
题意:给出一个长度为n的序列,然后给出m个区间询问,求区间内数字出现次数等于该数字的个数;思路:这题有很多种解法,之前用一种nsqrt(n)的暴力解法写过,这次用莫队算法再写一次,复杂度是(n+q)sqrt(n);#include #include #include #include #include using namespace std;const int N = 1原创 2013-10-06 19:34:47 · 1062 阅读 · 0 评论 -
一些常用的短模板
快速幂取模LL pow_mod(LL a, LL b, LL n) { LL res = 1; while(b){ if (b & 1) res = (res * a) % n; a = (a * a) % n; b >>= 1; } return res % n;}素数表原创 2013-10-05 18:59:17 · 558 阅读 · 0 评论 -
HDU 2242(考研路茫茫——空调教室)
题意:有一个教室群,教室之间有空调管相连(原图连通),每个教室都有人,求断开一条空调管使之分开成两个教室群,并且使两个教师群的人数差值最小。思路:这题没什么难度吧。。思路都很明了(可能是看过标签的缘故吧0.0),求边双连通分量,缩点,然后进行树形dp计数求出答案即可,贴个代码,以后拿来当模板用吧。#include #include #include #include #原创 2013-09-16 21:48:24 · 773 阅读 · 0 评论 -
POJ 3177(Redundant Paths)
题意:求最少加多少条边,使这个图不存在桥;思路:很明显的边双连通分量的题,首先求出图中的双连通分量,缩点,然后求出度数为1的点的总数,那么答案就是(sum+1)/2;为什么是(sum+1)/2呢,我的理解是:因为题目说当前图中任意两个顶点最少有一条路相连,那么不同的双连通分量间就只有一条路相连,因为当前u到v有一条路径,所以再给u和v间加多一条边,就可以使这两个点都至少有两条路径到达了。原创 2013-08-29 19:02:55 · 968 阅读 · 0 评论 -
最大流模板(Edmonds-Karp)
最近在看网络流,看了算法导论不是很懂。。不知道书里那个图是不是错了,搞得我有点混乱;然后就从网上查下资料,翻了几个大神的博客,就搞懂了个大概是怎么回事;网络流里有很多算法,因为是入门,所以就写了个EK(Edmonds-Karp)求最大流的算法,顺便做了个模板题;写的时候还行,大概思路没什么问题,就是实现的时候有点小错误,下面是本人学习中的一些理解:Edmonds-Karp求原创 2012-11-24 23:12:32 · 3333 阅读 · 3 评论 -
拓扑排序
拓扑排序:在图论中,由一个有向非循环图(DAG)的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(Topological sorting)。1.每个顶点出现且只出现一次;2.若A在序列中排在B的前面,则在图中不存在从B到A的路径。也可以定义为:拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。原创 2012-11-30 11:08:08 · 429 阅读 · 0 评论