已经做过一个类似的题目了,只是这道题目求的是最长的长度,那个题目求的是总的这样的序列的个数,都是用线段树或者树状数组来优化求和操作,使之降为log(n)View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn = 100010;int sum[maxn<<2];int num[maxn];int Read More
posted @ 2012-04-08 19:47 Because Of You Views(383) Comments(0) Diggs(0) Edit
要求去掉树中的一个点,使得分开的连通块中不存在总点数大于n/2的块直接dfs记录u节点下总共有几个儿子即可,水View Code #include<cstdio>#include<vector>#include<cstring>using namespace std;const int maxn = 10010;vector<int> edge[maxn];int sum[maxn],ans[maxn],n;void dfs(int u,int fa){ sum[u]=1; int i,j; bool flag=true; for(i=0;i&l Read More
posted @ 2012-04-08 19:44 Because Of You Views(224) Comments(0) Diggs(0) Edit
在某个点派出两个点去遍历所有的边,花费为边的权值,求最少的花费仔细分析后发现从哪个点出发是无所谓的如果从某个点出发要回到这个点,那么它走过的边肯定都被他遍历了两遍,画个图模拟一下就知道了但是如果不回来,则所走路径中有一条简单路径是可以只走一遍的,派出了两个点去遍历,也就是说有两条简单路径是可以直走一边的,我们要使这两条简单路径的总和尽可能的长,就转换为了树的最长路径问题了所以答案就为总的边权和的两倍减去树的最长路View Code #include<cstdio>#include<cstring>#include<vector>#include<que Read More
posted @ 2012-04-08 11:05 Because Of You Views(529) Comments(0) Diggs(0) Edit
主要是利用了反证法:假设 s-t这条路径为树的直径,或者称为树上的最长路现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路证明:1 设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则dis(u,T) >dis(u,s) 且 dis(u,T)>dis(u,t) 则最长路不是s-t了,与假设矛盾2 设u不为s-t路径上的点 首先明确,假如u走到了s-t路径上的一点,那么接下来的路径肯定都在s-t上了,而且终点为s或t,在1中已经证明过了 所以现在又有两种情况了: 1:u.. Read More
posted @ 2012-04-08 11:02 Because Of You Views(12364) Comments(2) Diggs(4) Edit