上一页 1 2 3 4 5 6 ··· 23 下一页
摘要: 题意:给一个无向图连通,图中每个结点都有一个权值,问能否割掉图中的一条边,使得图变为2个连通支,若能,使2个连通支中权值和的差最小,输出差的绝对值。N<=10^4分析:dfs时用tarjan判断边是否为割边,若是就更新答案。需注意的是有重边。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 10000#define M 20000#define INF 0x3f3f3f3fint n,m,e,w[N];int 阅读全文
posted @ 2012-09-17 17:24 BeatLJ 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 题意:对树中每个结点求其与能到达的最远结点的距离。N<=10^4分析:先求出树的直径(树中距离最远的2个点之间路径),对每个结点,求到达直径2个端点的距离,较大的即为结果。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 10001int n,e;int first[N],next[N<<1],v[N<<1],w[N<<1];int dx[N],dy[N];void init 阅读全文
posted @ 2012-09-17 17:19 BeatLJ 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题意:求树的最大点独立集中点的数目。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 6001int n,e;int w[N],first[N],next[N],v[N],p[N];int dp[N][2];void init(){ e=0; memset(first,-1,sizeof(first)); memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp));}void add 阅读全文
posted @ 2012-09-17 17:13 BeatLJ 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,边权表示通过此边的代价,给k个机器人,指定从点s出发,求遍历所有结点的最小代价和。分析:设计状态时不难想到用dp[i][j]表示从结点 i 出发遍历以它为根的子树的最小代价,但是转移时就遇到麻烦了,考虑只给你 1 个机器人的时候,这时要遍历所有结点就必然要走回头路,如果我们对每个结点再增加一个信息,表示从 i 出发遍历以 i 为根的子树且最后回到 i 的最小代价,这样转移就好办了,对于每个结点,将 j 个机器人分配给它的所有子结点,若分配 0 个机器人,则表明要派一个机器人去,遍历完了又回到 i 。方便起见,就以dp[i][0]表示从 i 出发遍历完子树 i 又回到i的最小代 阅读全文
posted @ 2012-09-17 17:07 BeatLJ 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题意:给一棵带权有根树,边权表示切断此边的代价,现有一台切边的机器,但它有一个上限值up limited power,只能切断边权不超过up limited power的边,现要切断根节点与所有叶子结点的联系,总代价即为所切边的边权和,给定最大代价m,求最小的up limited power。数据范围:n<=1000,m<=1000000,1<=边权wi<=1000分析:二分答案,然后树DP判断。复杂度为O(NlogW)View Code #include <stdio.h>#include <string.h>#include <algo 阅读全文
posted @ 2012-09-16 11:45 BeatLJ 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题意:给n个病毒字符串和一个程序字符串,若程序字符串包含某个病毒字符串或者它的反串,则包含这个病毒,问所给程序字符串包含多少个病毒?分析:用病毒串和反串建立AC自动机,然后求包含多少病毒,但同一个病毒可能会被计算2次(如果病毒和它的反串都出现在程序中),对于每个病毒,它在自动机中都有2个结点代表自身结尾和反串结尾,我们对每个病毒都记录这2个结点,在统计的过程中可以把走过的结点打上标记,最后再统计哪些病毒的2个结点都被标记,说明被统计了2次,需要减去一次,这样就没问题了。但是题中说了程序串是压缩的,所以需要先需处理,而且还要考虑嵌套压缩的情况,当时就没考虑到……View Code #includ 阅读全文
posted @ 2012-09-14 23:17 BeatLJ 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 分析:只需枚举4个起始时间即可,确定起始时间后,后面的时间就都确定了,求最大值时,利用贪心策略,每次都选结束时间最早的。题中说的时间不会超过1000,貌似数据中有大于1000的,被坑了……View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 300struct node{ int x,y; bool operator<(const node &t) const { return y<t.y; }};i 阅读全文
posted @ 2012-09-14 23:04 BeatLJ 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 题意:求区间(P , Q]中第K个恰含x个4和y个7的数。P,Q<2^63分析:以前看到的数位DP的题都是求某个区间内满足给定条件的数的个数,看到这题我们一下可能没什么想法,也可能想到先求区间内的个数,然后二分答案,初看起来可以,但仔细想想就会发现有问题,因为即使知道(P , Q]内恰好有K个,你还是不知道第K个是哪个,所以二分貌似做不了。后来搜了下别人的解法,看过之后才恍然大悟,求解的过程非常巧妙,简而言之就是从高到低依次确定各个位的数字。不解释太多,看代码就明白了……View Code #include <stdio.h>#include <string.h> 阅读全文
posted @ 2012-09-14 22:57 BeatLJ 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 题意:维护一个整数序列,支持2种操作:1 a b k c将区间[a b]中满足(i-a)%k==0的数加上c;2 x查询第x个数的值。数据范围:整数个数N<=50000,操作次数Q<=50000,1<=k<=10分析:此题关键在于处理修改操作,我们发现修改是等间隔的,所以可以将数组拆开如下:k=1时,间隔为0:1 2 34 5 6 7 8 9 10……k=2时,间隔为1:1 3 5 7 9 ……2 4 6 8 10……k=3时,间隔为2:1 4 7 10……2 5 8 ……3 6 9 ……按以上拆法,可以得到55个整数序列,每次修改都是对其中一个序列进行的连续修改,由于 阅读全文
posted @ 2012-09-11 16:07 BeatLJ 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 题意:给n个正整数,代表n条边,现将n条边拼成一个三角形(每条边都要用到),问能组成多少个不同的三角形。View Code #include <stdio.h>#include <algorithm>#include <set>using namespace std;#define MP make_pairint l[15],n;int x[3];struct pro{ int ans,sum; set<pair<int,pair<int,int> > > Set; void init() { ans=sum=0; Set 阅读全文
posted @ 2012-09-11 15:45 BeatLJ 阅读(201) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 ··· 23 下一页