09 2013 档案

摘要:#include "iostream"#include "cstdio"#include "cstring"#include "queue"#include "algorithm"using namespace std;#define mem(a,y) memset(a,y,sizeof(a))#define inf 0x7f7f7f7fconst int maxn = 1100;const int maxm = 30000;struct node{ int v,len,next;}edge[m 阅读全文
posted @ 2013-09-30 19:43 一生挚爱 阅读(173) 评论(0) 推荐(0)
摘要:问题:n个点,对于每个点i,都有一条连向i+1的有向边,另外有m条其他的有向边,有q个询问(u,v)求u到v的最短路将m条有向边和q个询问对所表示的点对一起排序,(u,v)u大的排前,u一样的v小的排前,u和v一样大的先处理插入的再处理询问的;边插入边询问;树状数组里存的是右端点在v之后的询问的结果的差值(1)对于(u,v)uv) 的那些还没插入,树状数组存mat[u1][v1]-(d[v1]-d[u1])的最小值,查询时在加上(d[v]-d[u])(2)对于(u,v)u>v的这种边,保证在查询到(u,v)之前,所有(u2,v2) v2#include #include #include 阅读全文
posted @ 2013-09-13 20:47 一生挚爱 阅读(226) 评论(0) 推荐(0)
摘要:/*** 日期: 2013-9-12** 题目大意:有n个数,划分为多个部分,假设M份,每份不能多于L个。每个数有一个h[i],** 每份最右边的那个数要大于前一份最右边的那个数。设每份最右边的数为b[i],** 求最大的sum{b[i]² - b[i - 1]},1≤i≤M,其中b[0] = 0。** 思路:朴素DP为,dp[i]表示以i为结尾的最大划分。那么dp[i] = max{dp[j] - h[j] + h[i]²},** 1≤i-j≤L,h[j]<h[i]。这种会超时,采取线段树优化。因为有两个限制,考虑到若h[j]≥h[i],** 那么求i的时候一定不会用到j 阅读全文
posted @ 2013-09-12 15:26 一生挚爱 阅读(321) 评论(0) 推荐(0)
摘要:给定一个有向图,问最少增加多少条边后变成强连通图 tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0, 否则为缩点后点入度和出度的最大值, 证明:当入度或者出度不为0时,则可以通过传递性使其相同,所以只需要考虑入度或者出度为0的点 即可。因为要求增加尽量少的边,所以将入度和出度都为0的点相连,边的方向为出度为0的指向入度为0的顶点。 当入度为0或者出度为0的点有剩余时,则任意取一个点进行连边。 所以当有向图为强连通图时答案为0,否则最小值为入度和入度的最大值#include #include #include #include using names... 阅读全文
posted @ 2013-09-04 20:42 一生挚爱 阅读(711) 评论(0) 推荐(0)