01 2013 档案

摘要:题意:有N个顶点的树,节点间有权值, 节点分为黑点和白点。 找一条最长路径使得 路径上黑点数量不超过K个。题解:此题是qzc的论文里的题,没看懂qzc写的,后来看的别人的代码才理解了。先引用一下这位神犇的题解:http://hi.baidu.com/fuqbppvrgcbactd/item/14a81a1bdbd9f98888a956b9在以ROOT为根的树上,我们可以这样表示状态:F[ i , j ] 表示它的第 I 个子树中经过的不超过J 个黑点的路径中,最长的一条的长度是多少,这样可以保证 F[ I , J ] 的递增性。要求出F[ I , J ] ,我们只要对所有子树进行一次DFS即可 阅读全文
posted @ 2013-01-21 00:19 proverbs 阅读(3239) 评论(0) 推荐(0)
摘要:题意:求树上的距离小于等于K的点对个数题解:树分治论文题。需要者请移步qzc论文~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cstdlib> 6 7 #define N 200000 8 #define M 400000 9 #define INF 0x3f3f3f3f 10 11 using namespace std; 12 13 int head[N],ne 阅读全文
posted @ 2013-01-20 17:27 proverbs 阅读(926) 评论(0) 推荐(0)
摘要:这题真是神题!当然我不是说这题有多神,而是你数组开小了和开大了得分不同,用不同版本的编译器得分不同。。。(数组没有越界的情况下)呜呜。。。至今没有ac。一直83分。。。抑郁了。。。跪求神犇指明错误。。。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstdio> 6 7 #define N 151000 8 #define M 251000 9 #define IN 阅读全文
posted @ 2013-01-20 11:29 proverbs 阅读(321) 评论(0) 推荐(0)
摘要:对于询问dist,树链剖分搞之,把边权转化到点上,然后注意细节就好(我在代码里标出来了,为了这个细节,wa了一屏)对于询问kth,可以先求出两点(x和y)的lca,然后判断第k个数字是在x到lca的路径上还是y到lca的路径上,确定之后,倍增的寻找就好了~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstdio> 6 7 #define N 50000 8 #de 阅读全文
posted @ 2013-01-20 09:53 proverbs 阅读(349) 评论(0) 推荐(0)
摘要:以前动态树写过这个题,今天尝试树链剖分解决~模板题,就声明一点,线段树维护的是点权View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 50000 8 #define M 100000 9 #define INF 1e9 10 11 using namespace std; 12 13 int head[N],to[M],next 阅读全文
posted @ 2013-01-18 23:11 proverbs 阅读(880) 评论(0) 推荐(0)
摘要:以前做过poj的一个判断图是否为弱连通的题,然后,这个题和poj那个差不多。先强连通缩点,然后重新构图,然后找出包含点数最多的链,统计个数即可,可以用拓扑排序搞~pS:重新构图时有重边,然后导致统计方案数的重复。。wa了好久。。还是wzc神犇告诉我这个蒟蒻的。。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 7 #define N 200000 8 阅读全文
posted @ 2013-01-18 23:09 proverbs 阅读(1087) 评论(0) 推荐(0)
摘要:这个经典的设问形式你难道没有心动么?这不是在提示你二分么?二分边权,然后并查集判定连通性,因为连通了一定会有最小生成树奥,第一问的答案是n-1应该没问题吧,View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstdio> 6 7 #define N 1000 8 #define M 100000 9 10 using namespace std;11 12 struct 阅读全文
posted @ 2013-01-18 23:03 proverbs 阅读(676) 评论(0) 推荐(0)
摘要:贪心。和田忌赛马差不多。但是更简单一些。最强的能赢就赢,最弱的能赢就赢,其他情况用最弱的拼对方最强的,感性想是这样的。。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 200000 8 9 using namespace std;10 11 int n;12 long long a[N],b[N];13 14 inline 阅读全文
posted @ 2013-01-18 23:01 proverbs 阅读(807) 评论(0) 推荐(0)
摘要:转移特别显然是n^2的,tle~然后由于转移没有区间限制,所以应该不是单调队列,然后想斜率优化吧。推了两张纸,证明了决策的单调性(我以前都是默认的单调。。。第一次证明。),嘿嘿。其实就是维护的一个下凸的函数。View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 7 #define N 1100000 8 9 using namespace std;10 阅读全文
posted @ 2013-01-18 22:59 proverbs 阅读(1040) 评论(0) 推荐(0)
摘要:费用流。。一开始以为是贪心,后来看见数据范围,就想别的了。。。这题又是考构图的,省选的构图都好难啊。。。有没有想到。。关键就是把每个技术员拆成n个点,表示这个技术员倒数第几个修的车子。。考虑第i个工人,他修第j辆车只对后面要修的车有影响,而前面修过的车已经对当前没有影响了。而这个影响就是后面每个将要修理的车都多等待了time的时间。太绝了!View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cstdio> 5 #include 阅读全文
posted @ 2013-01-18 22:54 proverbs 阅读(1540) 评论(0) 推荐(1)
摘要:没居前两个格,然后剩下的所有格子情况就确定了~View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 7 #define N 11000 8 9 using namespace std;10 11 int gs[N],bh[N];12 int n,ans;13 14 inline void read()15 {16 scanf("%d" 阅读全文
posted @ 2013-01-18 22:50 proverbs 阅读(764) 评论(0) 推荐(1)
摘要:内向树dp~就是先找环,任取环上有边相连两点,u和v,以u为根,断开u和v之间的边,做两次树形dp,dp[i][0]表示i不选,dp[i][1]表示i选①强制u不选,v随意②u随意,v不选两种情况取最大值即可~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 2000000 8 #define M 4000000 9 10 u 阅读全文
posted @ 2013-01-18 22:49 proverbs 阅读(1369) 评论(0) 推荐(0)
摘要:暴力状压dp。。。好久不写状压dp,先水一个~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 1000 8 9 using namespace std;10 11 int num,n,m;12 int zt[N],gs[N];13 long long dp[11][1<<11][90];14 bool map[N 阅读全文
posted @ 2013-01-18 22:45 proverbs 阅读(905) 评论(0) 推荐(0)
摘要:按照t2从小到大排列之后贪心。若当前任务可以插入,则插入。若当前任务不可以插入,分两种情况:①当前任务的耗时大于等于之前插入的任务的最大耗时:跳过当前任务②当前任务的耗时小于之前插入的任务的耗时:将最前插入的耗时最大的那个任务删除,插入当前任务此过程用堆维护~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 1000000 8 阅读全文
posted @ 2013-01-18 22:44 proverbs 阅读(1362) 评论(0) 推荐(0)
摘要:传说中的主席树可以做!ym zxr神犇~此题目同:http://www.cnblogs.com/proverbs/archive/2013/01/17/2865123.htmlView Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <cmath> 7 #include <ctime> 8 9 #define N 1 阅读全文
posted @ 2013-01-17 20:09 proverbs 阅读(442) 评论(0) 推荐(0)
摘要:区间众数先离散化,学到了lagoon的lower_bound+unique的离散化,比我写的简单多了预处理分成sqrt(n)块,记录d[i][j]和p[i][j]分别表示从i块起始位置到j块终止位置的众数出现次数和这个数是谁开一个数组,记录每个数的位置,使得同类的相邻,同类数的坐标升序排列。对于询问:对于同一块内或者相邻块内的,直接暴力。对于不同块内的,统计出非整块的区间内的所有出现过的数字,然后对这些数字在二分存储位置的数组,统计块内这个数出现的次数。然后结合d[i][j]和p[i][j]就可以得出答案了View Code 1 #include <iostream> 2 #inc 阅读全文
posted @ 2013-01-17 20:08 proverbs 阅读(1054) 评论(0) 推荐(0)
摘要:能够支持动态插入的东西很容易想到splay。然后就是树上的hash了。。悲剧的我没找到哪里错了。。。果断70分wa。。。错误代码(思想是正确的):View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 1000000 8 9 using namespace std; 10 11 char str[N]; 12 int sz[N],s 阅读全文
posted @ 2013-01-17 19:58 proverbs 阅读(841) 评论(1) 推荐(1)
摘要:单调队列是递减的,储存的是递减的元素的位置。然后询问的时候就在单调队列里面二分地寻找合适的最大值所在的位置最近二分总是写不对。不知道怎么了。。。以前从来没出过错。。。View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 7 #define N 1000000 8 #define INF 0x3f3f3f3f 9 10 using namespace st 阅读全文
posted @ 2013-01-17 19:55 proverbs 阅读(611) 评论(0) 推荐(0)
摘要:这题其实不是很难,就是我没写对。。把情况想全了:有很多个连通块(单向边看作双向边),对于每个连通块有这样几类情况:1、2、3、应该就是这几类吧~现在先讨论最大值第1类:对答案没有影响第2类:环上的点数一定是答案的倍数第3类:两个链的长度的差一定是答案的倍数所以答案就是2、3的最大公约数(有2、3存在的情况下)综上所述,先计算第1类,再就算2、3类。。ps:我是一起做的,然后长跪不起了,最后抄的lyd神犇的。。。有个技巧,就是把边权设为1和-1~View Code 1 #include <iostream> 2 #include <cstdio> 3 #include & 阅读全文
posted @ 2013-01-17 19:52 proverbs 阅读(1658) 评论(0) 推荐(0)
摘要:暴力递推,转化成通项公式,利用补集法求解~注意负数情况。。。好久不写快速幂了,竟然没写错~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #include <cstdlib> 6 7 #define mod 100003 8 9 using namespace std;10 11 long long n,m;12 13 inline long long pow(long long a,lo 阅读全文
posted @ 2013-01-17 19:35 proverbs 阅读(392) 评论(0) 推荐(0)
摘要:环形均分纸牌,数学推导不是很难。只给提示:设p[i]表示第i个人给第i+1个人的纸牌数,若p[i]<0表示,第i+1个人给第i个人的纸牌数然后自己推吧~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cmath> 7 8 #define N 2000000 9 10 using namespace std;11 阅读全文
posted @ 2013-01-17 19:32 proverbs 阅读(1178) 评论(0) 推荐(0)
摘要:看数据范围特别小,然后就暴力dp就好了~还要想清楚,选择的路径,一定是某一天的最短路!View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 200 8 #define M 100000 9 10 using namespace std;11 12 int head[N],next[M],to[M],len[M];13 int ca 阅读全文
posted @ 2013-01-17 19:29 proverbs 阅读(1146) 评论(0) 推荐(0)
摘要:这题简直太神了,我才知道网络流还可以这样做!这题想了近一个小时构图,没搞出来。。最后看了BYvoid大神的题解搞得。。http://www.byvoid.com/blog/noi-2008-employee/无限仰慕!View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 2000 8 #define M 200000 9 #def 阅读全文
posted @ 2013-01-15 13:36 proverbs 阅读(821) 评论(0) 推荐(0)
摘要:时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排序,外部排序)数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理)指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示)按位运算(and,or,xor,shl,shr,一些应用)图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图 阅读全文
posted @ 2013-01-15 10:43 proverbs 阅读(2523) 评论(0) 推荐(0)
摘要:Splay写的真是抑郁,各种被坑。。。被题坑,被自己坑。一直在调程序。。。Splay模板:View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cstdio> 6 7 #define N 170000 8 #define INF 2e9 9 10 using namespace std; 11 12 int son[N][2],fa[N],val[N],sum[N]; 13 阅读全文
posted @ 2013-01-15 10:29 proverbs 阅读(2834) 评论(0) 推荐(0)
摘要:先上模板,应该每个人都写得差不多的:基本上包含了sbt的所有基本操作。View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 #define N 100010 8 9 using namespace std; 10 11 int key[N],lt[N],rt[N],sz[N]; 12 int root,cnt; 13 14 void rotate_l 阅读全文
posted @ 2013-01-13 15:36 proverbs 阅读(2833) 评论(2) 推荐(0)
摘要:题意:题解:今天又遇到这个类型的建图题,有没有做出来。于是今天总结一下这个题的模型——顶点覆盖(每个顶点恰好覆盖一次)。先不考虑赋初值的费用:考虑赋初值:具体做法请参考:http://www.cnblogs.com/proverbs/archive/2013/01/06/2848043.html尽管不是一道题目,但是其实思想是一样的,赋初值=瞬移View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 6 #def 阅读全文
posted @ 2013-01-12 18:08 proverbs 阅读(266) 评论(0) 推荐(0)
摘要:以:BZOJ1927: [Sdoi2010]星际竞速 为例以前我写的:注意updata()函数View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cstdlib> 6 7 #define N 10000 8 #define M 1000000 9 10 using namespace std;11 12 int head[N],next[M],to[M],pr[M],len 阅读全文
posted @ 2013-01-12 15:46 proverbs 阅读(199) 评论(0) 推荐(0)
摘要:题解:http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html吐槽这题数据,本地测全wa,就一直对拍,最后毛了,交了一发,ac了。。。难道这个题是spj?View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <ctime> 7 8 #define N 20000 9 阅读全文
posted @ 2013-01-11 22:22 proverbs 阅读(658) 评论(0) 推荐(0)
摘要:题意:有N 颗糖果和M 个小孩,老师现在要把这N 颗糖分给这M 个小孩。每个小孩i对每颗糖j 都有一个偏爱度Aij,如果他喜欢这颗糖,Aij = 2,否则 Aij = 1。小孩 i觉得高兴当且仅当∑Cij×Aij >= Bi,j=1,2, …,N ,若他分得了糖 j ,Cij = 1,否则 Cij =0。问能否合理分配这 N 颗糖,使得每个小孩都觉得高兴。(1 <= N <= 100,000, 1 <=M <= 10, 0 <= Bi <= 1,000,000,000)题解:真心给这个题跪了。。。官方题解见Edelweiss的网络流建模总结 阅读全文
posted @ 2013-01-11 20:54 proverbs 阅读(639) 评论(2) 推荐(0)
摘要:题意:判断线段是否与矩形相交。ps:矩形坐标不是按顺序给出的,需要自行判断友情提示,线段在矩形内部也输出T题解:叉积判断是否规范相交,再用点积判断部分重合的情况~计算几何一定要严谨啊!!!!PS:此代码不算严谨,严谨的请移步:http://www.cnblogs.com/proverbs/archive/2013/02/23/2923776.html这个代码就不做修改了View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorith 阅读全文
posted @ 2013-01-10 23:40 proverbs 阅读(407) 评论(0) 推荐(0)
摘要:题意:求从目标点走矩形框至少要穿越多少条边。题解:从矩形框上穿出等价于从直线与矩形框的顶点穿出。矩形框四个角特判!View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 10000 8 #define EPS 1e-8 9 10 using namespace std;11 12 struct LI13 {14 double x,y 阅读全文
posted @ 2013-01-10 22:40 proverbs 阅读(261) 评论(0) 推荐(0)
摘要:题意:给出n条线段,判断是否存在有一条直线,满足所有的线段在直线上投影后至少有一个公共点等价于:给出n条线段,问你是否存在一条直线,使得每个线段与该直线至少有一个交点。题解:嗯,猜测直线一定过至少两个端点。若不过某线段端点,则可以通过平应找到过一个端点的位置若过一个端点,则可以旋转使其通过两个端点暴力枚举端点,判线段直线相交即可~细节好多,被坑了。。。View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #i 阅读全文
posted @ 2013-01-10 21:24 proverbs 阅读(465) 评论(0) 推荐(0)
摘要:题意:此题给出N组直线,每组2条直线。如果共线则输出LINE,相交则输入点坐标,否则输出NONE(平行)。题解:点积判断平行和相交,有向面积(分点公式)求交点(不知道写的对不对,至少能过这个题,貌似数据很弱的样子)。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <cmath> 7 8 #define EPS 1e-7 阅读全文
posted @ 2013-01-10 21:17 proverbs 阅读(778) 评论(0) 推荐(0)
摘要:题意:按顺序给出一些木棍,输出在最上面的木棍标号题解:一开始看到n=100000还在想怎么优化,没想出来,最后看讨论,原来暴力可以水过~嘿嘿~用了下并查集压缩路径,在刷数组的时候会快一些~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 110000 8 #define EPS 1e-8 9 10 using namespac 阅读全文
posted @ 2013-01-10 21:13 proverbs 阅读(197) 评论(0) 推荐(0)
摘要:题意:房间里有n堵墙,每面墙上有两扇门,求从房间最左端中点到最右端中点的最短路径题解:这题就是考验耐心和仔细的。。。纯暴力判断,单源最短路都懒得写了,直接floyd搞定。。和平衡树写得一样长了。。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cmath> 7 8 #define N 1000 9 #define E 阅读全文
posted @ 2013-01-10 21:09 proverbs 阅读(335) 评论(0) 推荐(0)
摘要:POJ 2318题意:有一个大箱子,由n个板分为n+1块,标号为0~n已知盒子左上角和右下角的坐标及每个板上下两端的横坐标(板不会交错,且按顺序给出)然后给出玩具的坐标,统计每块空间内玩具个数(保证玩具一定落在空间内,且没有落在隔板上的点)题解:二分位置,叉积判断在左侧还是右侧View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 阅读全文
posted @ 2013-01-10 21:05 proverbs 阅读(223) 评论(0) 推荐(0)
摘要:1.这份列表当然不是我原创的,网上遍地流传,放到自己空间里主要是为了方便浏览。2.还是那句话——红色的是我已经AC的。一。点,线,面,形基本关系,点积叉积的理解POJ2318TOYS(推荐)http://acm.pku.edu.cn/JudgeOnline/problem?id=2318POJ2398 Storage(推荐)http://acm.pku.edu.cn/JudgeOnline/problem?id=2398一个矩形,有被若干直线分成N个格子,给出一个点的坐标,问你该点位于哪个点中。知识点:其实就是点在凸四边形内的判断,若利用叉积的性质,可以二分求解。POJ3304Segments 阅读全文
posted @ 2013-01-10 00:29 proverbs 阅读(227) 评论(0) 推荐(0)
摘要:题意:一个无向图,选一个子图,使这个子图的密度(边数/点数)最大,输出这个子图的每个点。题解:amber的论文题~巧妙的构造!~最大权闭合图还是比较基础的构造,不过我还是没想到。。就是这题太坑爹了,被精度卡死了。。今天真是抑郁,,各种被卡。。。http://kanboxshare.com/link/v0yHI2oUoSNMCo8mAmj1Bxy0mqMIH6tZNUsbGxG4mvu3FNl9FfiODWiEmdvTHKBRNUbpNxELmvNwA2rCFwu1DeAXb0I7HoBFNmIvNVIXmNYmFNl43dPYfIaGnVeFDB5XszPnT5jttcdCQ推荐一份题解:ht 阅读全文
posted @ 2013-01-10 00:08 proverbs 阅读(915) 评论(0) 推荐(0)
摘要:题意:最优比率生成树,要求生成树中的所有边的花费与所有边的长度的比值最小题解:01分数规划,详见http://www.cnblogs.com/proverbs/archive/2013/01/09/2853725.html网上都是写的最小生成树,其实最大生成树也可以,其实写什么都一样,关键是根据公式的不等号方向判断~最小生成树:View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cstdio> 5 #include <al 阅读全文
posted @ 2013-01-09 22:12 proverbs 阅读(229) 评论(0) 推荐(0)
摘要:题意:给出一个有向图,问求一个回路,使得回路上的点权之和/边权之和最大。题解:01分数规划,简单构造,将点权转移到边权上~因为一个环上的点和边的数量是相等的~设i,j之间初始边权为w[i][j],修改后的边权为g[i][j],则g[i][j]=w[i][j]*mid+val[i]spfa判负环即可~01分数规划详见:http://www.cnblogs.com/proverbs/archive/2013/01/09/2853725.html代码包含bfs版spfa和dfs版spfa两种版本dfs版spfa真是快,16ms,在c++里耗时排第一,嘿嘿~View Code 1 #include.. 阅读全文
posted @ 2013-01-09 22:07 proverbs 阅读(679) 评论(0) 推荐(0)
摘要:题意:给定n个二元组(a,b),删除k个二元组,使得剩下的a元素之和与b元素之和的比率最大(比率最后乘100输出)题解:最裸的01分数规划,以此题为例讲述如何构造。设:xi∈{0,1},表示第i个二元组是否留下,p为比率,P为p的最大值,即比例的最大值(注意区分大P于小p)则:p=sigma(ai*xi)/sigma(bi*xi) 其中sigma(xi)=n-k显然:对于所有可能的取得的 p 的值,p<=P即:对于所有可能的xi的组合,sigma(ai*xi)/sigma(bi*xi)<=P即:sigma(ai*xi)/sigma(bi*xi)的最大值等于P即:sigma(ai*x 阅读全文
posted @ 2013-01-09 21:59 proverbs 阅读(844) 评论(0) 推荐(0)
摘要:题意:求无向网珞中边集不相交的两条最短路(两最短路要求等长)。题解:显然的费用流,然后显然mle或者tle~然后先最短路与处理一下,建网络流的图的时候只建最短路就行了,边一下就少了很多,跑最大流就行了~不知道我的代码为什么在第22个点tle了,觉得我写的挺对的。。哎,抑郁了一上午。。。不过我就得想到最短路预处理这个题的目的就达到了 ~ 阅读全文
posted @ 2013-01-09 21:16 proverbs 阅读(262) 评论(0) 推荐(0)
摘要:题意:一个城市有n座建筑物,每个建筑物里面有一些人,为了在战争爆发时这些人都可以避难,城市里面建了m座避难所。每座避难所只能容纳有限人数。给出每个建筑物和避难所的坐标(题目要求距离为曼哈顿距离+1)。现在给你一种避难方案,问这种方案是否为最优方案,如果不是,请输出一种比当前更优的方案(不一定最优)。答案给出的方案不是最优的,当且仅当存在另一种方案的所有人移动的总路程比答案少。。题解:建图,费用流超时。。然后看了下费用流的消圈算法,就是用来验证当前的费用流是否是最小的。消圈定理:残留网络里如果存在负费用圈,那么当前流不是最小费用流。负圈有必要解释一下:费用总和是负数,且每条边的剩余流量大于0网上 阅读全文
posted @ 2013-01-09 01:25 proverbs 阅读(1337) 评论(2) 推荐(0)
摘要:题意:有n个商店m个供应商k种商品给各商店的各种商品的需求量和各供应商的供应量以及供应商和商店之间的运输费用,求满足需求的最小费用题解:很裸。很裸。。每个商品做一次最大流,就是读入我看了半天才看懂。。英语弱啊。。。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 130 8 #define M 100100 9 10 usin 阅读全文
posted @ 2013-01-08 22:52 proverbs 阅读(189) 评论(0) 推荐(0)
摘要:题意:http://www.nocow.cn/index.php/Translate:Sgu/326题解:抑郁,机房的“学长”上课吵死了,心烦意乱的写了这个题,一直wa,最后发现忘了特判,网络流出现负权边了。。。明确思想,1这个人剩下的比赛都赢(包括和组外的人比的比赛,简称组外赛),与1同小组的其他人,组外赛全输,小组内部的比赛就是网络流需要分配的结果~思路见:http://www.cnblogs.com/proverbs/archive/2013/01/07/2850366.htmlView Code 1 #include <iostream> 2 #include <al 阅读全文
posted @ 2013-01-08 22:49 proverbs 阅读(314) 评论(0) 推荐(0)
摘要:题意:FJ有n个农场,要从1号农场走到n号,再从n号走到1号(回来的路不能重复,不一定走完所有景点,只要求从1到n即可),给你一些景点之间的路的长度(双向),问你最短需要走多少路才能回来?题解:不同于双调旅行商问题(dp),因为距离不符合单调性。用最小费用流,还是很裸的~View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 6 #define N 1010 7 #define M 100100 8 9 usin 阅读全文
posted @ 2013-01-08 22:41 proverbs 阅读(178) 评论(0) 推荐(0)
摘要:题意:给出一些权已知的点(剩下的点的权未知),以及所有点之间的边的关系,每条边的权是其两端点的点权值的异或值,求未知点的权是什么的时候所有边权的和最小题解:amber的论文题,简直太绝了!http://kanboxshare.com/link/v0yHI2oUoSNMCo8mAmj1Bxy0mqMIH6tZNUsbGxG4mvu3FNl9FfiODWiEmdvTHKBRNUbpNxELmvNwA2rCFwu1DeAXb0I7HoBFNmIvNVIXmNYmFNl43dPYfIaGnVeFDB5XszPnT5jttcdCQ思想就是按位做32遍最小割。View Code 1 #include .. 阅读全文
posted @ 2013-01-08 22:36 proverbs 阅读(264) 评论(0) 推荐(0)
摘要:题意:给出一个带权无向图,给出图中a,b两个点,已知切断一每条边都会产生与这条边权值相同的消耗,切断某些边可以使得a,b之间不连通,在已知一个切边方法消耗最小的方法,判断是否存在与此切割方法消耗相同的方法。题解:判断最小割的唯一性!就是老样子从S沿着非满流的正向边遍历点的总数k1,从T沿着非满流的正向边遍历的点的总数k2,若k1+k2=n(总点数)时最小割唯一。哎,成了结论了,不会证明。。后来又想怎么求最小割的总方案数,也不会。。求大神解释!View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include & 阅读全文
posted @ 2013-01-08 22:27 proverbs 阅读(363) 评论(0) 推荐(0)
摘要:题意:二维平面上有n个浮冰(用坐标表示浮冰位置),开始时每个浮冰上有一些企鹅,现在企鹅需要聚到某一个浮冰上,因此需要从一个浮冰跳到另一个浮冰上。浮冰比较特殊,每次企鹅跳离该浮冰时,由于反弹作用,浮冰会消融一部分,现在告诉,每块浮冰的坐标(xi,yi),每块浮冰最多可以被企鹅跳的次数(ni),每块浮冰上初始的企鹅数量(mi)以及企鹅可以跳跃的最大距离D。求这些企鹅最后可以在哪些浮冰上汇聚。输出可以汇聚的浮冰序号,下标从0..n-1,如果不能汇聚,输出-1。题解:枚举汇聚的那块浮冰为T,最大流求解。关键是怎样限制点的出度数(浮冰会融化!),以前好像谈到过,就是拆点。拆成2n个点(i和(i+n)对应 阅读全文
posted @ 2013-01-08 22:20 proverbs 阅读(308) 评论(0) 推荐(0)
摘要:题意:N个点M条边的有向图,给出如下两种操作。删除点i的所有出边,代价是Ai。删除点j的所有入边,代价是Bj。求最后删除图中所有的边的最小代价。其实就是二分图最小点权覆盖。定义:从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。题解:拆点。n个点拆成2n个点(左右各n个,i与(i+n)对应,之间连容量INF的边),S和i连容量为Ai的边,(i+n)与T之间连容量为Bi的边,求最小割即可这样做为什么对呢?当一条边存在的条件就是网络中还存在从S到T的非满流边!方案输出不多说。。View Code 1 #include <cstdio> 2 #include 阅读全文
posted @ 2013-01-08 22:09 proverbs 阅读(274) 评论(0) 推荐(0)
摘要:题意:有一些模块(modules)和一个双核处理器,一个模块可以在任意一个核上处理,每个核对应每个模块有个开销。现在有一些模块间需要数据交换,如果需要数据交换的模块在一个核上处理,则不需要额外开销,否则需要加上一个开销。现在需要完成所有模块,问最小需要多少开销。如果没有这个额外的开销,那么每个模块只要选择开销小的那个核就行了。额外的开销给选择加上了限制。题解:最小割模型。S和T分别表示两个核,每个模块和S,T连边求最小割就是了~View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstrin 阅读全文
posted @ 2013-01-08 21:54 proverbs 阅读(466) 评论(0) 推荐(0)
摘要:题意:火星人侵略地球,他们意图登陆破坏某个地区的兵器工厂。据探子回报,火星人登陆的地区为n*m大小的地域,而且每一个火星人的着陆点坐标已知。火星人很强悍,只要有一个火星人着陆后能够幸存,他必定能毁坏这片区域的全部兵工厂。为了防止这种情况发生,必须保证在火星人着陆的一瞬间把他们全部同时杀死。现在防卫队有一个激光枪,开一枪就能把 在同一行(或同一列)着陆的火星人全部杀死。但是这种激光枪的使用是有代价的,把这种激光枪安装到不同行的行首、或者不同列的列首,费用都不同。现在已知把激光枪安装到任意位置的费用,总的花费为这些安装了激光枪的行列花费的乘积。问怎样安装激光枪才能在杀死所有火星人的前提下费用最少? 阅读全文
posted @ 2013-01-08 21:46 proverbs 阅读(383) 评论(0) 推荐(0)
摘要:题意:在一个网络里面,问增大哪条边的容量可以使整个网络的流量增大,输出这种边个数。题解:显然这些边是最小割边集的子集。对于边u-->v,当且仅当能从S沿着非满流的正向边遍历到u,从T沿着非满流的正向边遍历到v时,边u-->v是满足题意的边两遍dfs求解~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 1000 8 阅读全文
posted @ 2013-01-08 21:44 proverbs 阅读(306) 评论(0) 推荐(0)
摘要:题意:有n个房间,要确保一个特定房间不能进坏人(初始有若干房间有坏人)。相邻的房间可能会有门,但是门上的锁是单向的(只能从一个房间打开进入另一个房间,a b ,只能从a进入b 不能从b 进入a),初始所有的锁都是开着的,问至少关上几个锁,才能不让坏人进入那个房间。题解:人不就相当于流么?!最小割~不想说建图了,唯一要注意的就是锁是单向的。对于a和b之间的门,若a有锁,b没有锁,那么连接a-->b容量INF(这个门锁了白锁,坏人自己能打开),b-->a容量1困了,今天不想写题了。。就只想了想怎么建图。。代码参考:http://blog.sina.com.cn/s/blog_6af66 阅读全文
posted @ 2013-01-08 00:12 proverbs 阅读(199) 评论(0) 推荐(0)
摘要:以前总结过无向图最小割的最大流算法,n^2的枚举起点和终点,这个题必然tle于是又学习了专门的算法:Stoer-Wagner算法就是利用prim求最大生成树,将最后扫到的两点合并,执行n-1次,最终合并成一个点参考资料:http://kanboxshare.com/link/gCrQIYPJvdwCxGlOUwU5U3yxNNIiW2cUxIhddx7T60uYmiiO2heSC1rULa5tjEbf3MLRsM8QRKYGzoZhd8abNaUkeView Code 1 #include <cstdio> 2 #include <cstring> 3 #include 阅读全文
posted @ 2013-01-08 00:01 proverbs 阅读(589) 评论(0) 推荐(0)
摘要:题意:有N块田,每块田下雨时可以容纳a[i]头牛,每块田现在有b[i]头牛,给出一些田与田之间的无向路径及距离,问下雨时最少多少时间后所有牛都能到避雨的地方。题解:明显又是二分答案。floyd求取两点间最短路PS:要用long long!!!一开始我想的是三层的图:①n个点表示n块田 ②和③各n个点(灭个点i和i',拆点限制容量)S连①中的点容量a[i],表示一开始有a[i]头奶牛在i点①中的点连②中的i,当且仅当两块田之间的距离小于二分值时②和③对应点相连,限制流量③中的点和T连INF的边这样果断tle了。后来发现③中的点没有用,直接在②和T之间限流即可,优化后就ac了~View C 阅读全文
posted @ 2013-01-07 23:56 proverbs 阅读(267) 评论(0) 推荐(0)
摘要:题意:问从起点到终点有T条不相交路径的最大边的最小值。题解:典型的二分答案!最大流还真爱和二分一起出啊~View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 1000 8 #define M 1000000 9 #define INF 1e9 10 11 using namespace std; 12 13 int head[N] 阅读全文
posted @ 2013-01-07 23:45 proverbs 阅读(148) 评论(0) 推荐(0)
摘要:题意:有n(n<=10)个竞赛者,进行了n*(n-1)/2次的比赛。已知每一个竞赛者在比赛中胜利的次数a1、a2、a3........an。(次序列是从小到大排序的),问你这n个人中最强的竞赛者最多有几个。(如果这个竞赛者胜利的次数最多或这个竞赛者打败了所有胜利次数比他多的竞赛者,那么这个竞赛者就是最强的。其中每两个人有且仅进行一场比赛。)题解:这个题简直太绝了!我只想对了一半,最后还是看了题解。。。做法大概就是二分枚举最强者的个数(数量比较少,就直接枚举了。),越胜场多的成为强者的几率越高。所以枚举最强的k个人就是胜场最多的k个人若a,b(a,b都属于枚举的最强者的集合)之间的比赛为c 阅读全文
posted @ 2013-01-07 23:42 proverbs 阅读(733) 评论(0) 推荐(0)
摘要:题意:一个公司打算解雇一些员工,已知解雇每个人的收益值(可能为负)。解雇某一个人后,他的下属也将被解雇,求最大收益是多少,在取得最大收益时需要解雇多少人。题解:建图不多啰嗦,挺裸的~求最少的割边数目,可以从源点对残量网络进行一次DFS,每个割都会将源点和汇点隔开,所以从源点DFS下去一定会碰到某个割dfs停止,这时遍历过的点数最少的裁员数目。那种直接找满流边的做法是显然不对的奥~ps:总是wa盛怒之下,把所有int替换了ac了。。。View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstd 阅读全文
posted @ 2013-01-07 23:27 proverbs 阅读(191) 评论(0) 推荐(0)
摘要:题意:有m个订单,每个订单都能获取一定的收益,但是完成每个订单都需要购买不同的机器,求最多能挣多少钱,需要完成哪些订单,购买哪些机器。题解:最大权闭合图建图,S连所有的订单,边容量为利润,订单连所有的机器,边容量为INF,机器连T,边容量为成本。关键是求方案。我想的是dfs图找割边。。和网上的做法效果上应该是一样的。。网上大多都是分两次bfs找的~代码请参考:http://blog.sina.com.cn/s/blog_68629c770100z2v9.html写了一天网络流,实在不想写了。。。偷懒了~ 阅读全文
posted @ 2013-01-07 23:15 proverbs 阅读(158) 评论(0) 推荐(0)
摘要:题解:边由被限制节点指向限制节点View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cstdio> 6 7 #define N 120000 8 #define M 2000100 9 #define INF 1e910 11 using namespace std;12 13 int head[N],next[M],to[M],len[M];14 int layer[N 阅读全文
posted @ 2013-01-07 23:00 proverbs 阅读(353) 评论(0) 推荐(0)
摘要:题意:有k个牛奶机跟c头牛。他们之间有路相连,农民想让每个牛能到其中一个牛奶机,又想让走路最远的牛走得最小。题解:求最大值最小,不出意外就是二分了由于要限制总的路径长度,就不能对每条边限制了,于是先floyd求最短路,再二分最长路即可~不连大于二分值的路径,连小于等于二分值的路径,做最大流就好了~View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 阅读全文
posted @ 2013-01-07 00:38 proverbs 阅读(184) 评论(0) 推荐(0)
摘要:题意:给定一个无向图,求最少去掉多少个点后使得原图不连通(即存在两点不连通)。题解:暴力枚举起点终点,做最小割~取最小的即可特判一些极端情况,比如m=0等等~连通度总结(复习用~,转自 : http://blog.csdn.net/zhuyingqingfen/article/details/6386268):图的连通度问题是指:在图中删去部分元素(点或边),使得图中指定的两个点s和t不连通 (不存在从s到t的路径),求至少要删去几个元素。 图的连通度分为点连通度和边连通度: (1)点连通度:只许删点,求至少要删掉几个点(当然,s和t不能删去,这里保证原图中至少有三个点); (2)边连通度:只 阅读全文
posted @ 2013-01-07 00:21 proverbs 阅读(499) 评论(0) 推荐(0)
摘要:题意:n个人的两两关系矩阵,如果a认识b,则b认识a,且认识有传递性。给出一个s和一个t,问想让s不认识t,最少需要去掉多少人。如果有解,输出字典序最小的解。题解:请特别注意0与NO ANSWER!的区别!具体做法是:拆点限流,先求一次最小割为ans,然后从小到大枚举删除的点,重新建图再做最小割,如果当前结果比ans小,则更新ans,并把这个节点打上vis标记。ps:已经打上vis标记的点不再参与之后重建图时View Code 1 #include <cstring> 2 #include <cstdio> 3 #include <cstdlib> 4 #i 阅读全文
posted @ 2013-01-06 22:14 proverbs 阅读(188) 评论(0) 推荐(0)
摘要:1 定义欧拉通路 (Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。欧拉回路 (Euler circuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。欧拉图——存在欧拉回路的图。2 无向图是否具有欧拉通路或回路的判定G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点。3 有向图是否具有欧拉通路或回路的判定D有欧拉通路:D连通,除两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1。D有欧拉回路(D为欧拉 阅读全文
posted @ 2013-01-06 20:04 proverbs 阅读(343) 评论(0) 推荐(0)
摘要:题意:有N个整数区间,每个区间有一个权值,从中取一些区间,使得任意整数点的重叠数不大于K,并且这些区间的总权值最大。ps:区间不能重复选择!题解:经典的建图,表示自己想了好多都没有想到,最后还是lyd给我讲的。。。先离散化,建立边(i,i+1,k,0),i到i+1容量k费用0的边;边(i,j,1,w),i和j为给定区间的左右端点,容量1费用0,最大费用流即可~View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdlib> 4 #include <cstdio> 阅读全文
posted @ 2013-01-06 19:28 proverbs 阅读(197) 评论(0) 推荐(0)
摘要:这个题联系的时候没有做出来。最后还是lyd神犇教的。。。我还是太弱了。。每个点拆成一个入点(右边一排)和一个出点(左边一排),源点S向每个出点连容量1费用0的边,每个入点向汇点连容量1费用0的边,如果有高速航道(x,y),注意x<y,那么从x的出点到y的入点连容量1费用为读入权值的边。这样就能够处理所有高速航道了……空间跳跃处理:从S向所有入点连容量1费用为定位费用的边就行了。流过一个点对应的出点不代表经过了这个点,只有流过了这个点对应的的入点才算真正流过了这个点!View Code 1 #include <iostream> 2 #include <algorithm 阅读全文
posted @ 2013-01-06 17:26 proverbs 阅读(411) 评论(0) 推荐(0)
摘要:若有向图G的子图V满足【V中顶点的所有出边均指向V内部顶点】,则称V是G的一个闭合子图。其中点权和最大的闭合子图称为有向图G的最大权闭合子图,简称最大权闭合图。最大权闭合图的构图方法如下:建立源点S和汇点T,源点S连所有点权为正的点,容量为该点点权;其余点连汇点T,容量为点权绝对值,对于原图中的边<u,v>,连边<u,v>,容量+∞。定理1:最大权闭合图的点权和 = 所有正权点权值和 - 最小割(最大流)。定理2:上述网络的最小割包含:S到“不在最大权闭合图内的正权节点”的边 以及 “在最大权闭合图内的负权节点”到T的边。定理2的推论:在残余网络中由源点S能够访问到的点 阅读全文
posted @ 2013-01-06 17:19 proverbs 阅读(747) 评论(3) 推荐(0)
摘要:题意:有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件:每一行的数字的和每一列的数字的和某些格子有特殊的大小约束,用大于号,小于号和等于号表示问:是否存在用正数填充这个方阵的方案,满足所有的约束,若有,输出之,否则输出IMPOSSIBLE。题解:参考的别人(darksword)的。总结一下建图,忘了的时候还可以回顾~求解一个有上下界的网络流的步骤:1.首先进行构图,对于那么对流量没有限制的边,我们直接将容量赋值为原始的容量,而对于有流量要求的边,我们将容量减去下界并将其等价与无下界的边。最后就是添加一个附加汇点和一个附加源点,从附加源点连向每个顶点的容量为以该点所有流入的下界流量总 阅读全文
posted @ 2013-01-05 23:32 proverbs 阅读(1297) 评论(0) 推荐(0)
摘要:动态树讲解:http://www.cnblogs.com/proverbs/archive/2013/01/04/2845053.html贴代码混数~View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 7 #define N 420000 8 9 using namespace std; 10 11 int son[N][2],sum[N],fa[N] 阅读全文
posted @ 2013-01-05 00:00 proverbs 阅读(242) 评论(0) 推荐(0)
摘要:这是一个比较经典的动态树模型,对于理解动态树还是很管用的~动态树就是很多splay组成的,每颗splay维护的是一条树链,splay之间用fa[]相连,如fa[x]=y表示以x为根的splay树的父亲是y,但是y的两个儿子(son[y][0]和son[y][1])中没有一个是x相对的,splay之间的父子关系也是通过fa[]和son[][]来维护的,不同的是,如果fa[x]=y,则必有son[y][0]或者son[y][1]等于x,这个一定要想明白!对于无向图,就是先bfs建树,此时每一个点都是一颗splay,因为对于任意fa[x]=y,son[y][0]和son[y][1]一定不是xisro 阅读全文
posted @ 2013-01-04 23:58 proverbs 阅读(1271) 评论(0) 推荐(0)
摘要:题意:给一棵树型数据结构①支持修改边的权值 ②支持成段边权最值查询树链剖分入门题、树链剖分+线段树用的notonlysuccess的线段树——不开结构体事先预处理的那种我以前写的都是结构体的那种~View Code 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 7 //notonlysuccess版线段树-树链剖分 8 9 #define N 20010 10 11 阅读全文
posted @ 2013-01-02 23:52 proverbs 阅读(316) 评论(0) 推荐(0)
摘要:2012,注定是孤独的,消极的。但还是要感谢那些给予我温暖的人,谢谢你们。2012,曾经想过很多,但都没有实践,既然已经2013了,也应该有一个良好的开端。2013,奋斗将是不变的主旨!2013:我宣布我来了!从细节做起,时间将为我见证。1、为什么你起床就那么不自觉呢?2、为什么睡觉前胡思乱想就不能背会儿英语单词么?3、为什么学习的时候总是喜欢发呆呢?4、为什么自习课上总要断断续续地问同桌问题呢?5、为什么你总是那么“虚伪”?6、为什么你总是犹豫不决,受政策左右,而放弃自己的追求?生命不就是一次次赌命么?7、为什么总是赞叹别人sb而自己不去努力,难道这就是你放弃的理由么?8、为什么在你嘴里总是 阅读全文
posted @ 2013-01-02 21:33 proverbs 阅读(483) 评论(4) 推荐(0)