摘要: 思路:设sum(cost[i])/sum(dis[i])=r;那么要使r最小,也就是minsum(cost[i]-r*dis[i]);那么就以cost[i]-r*dis[i]为边权重新建边。当求和使得最小生成树的sum(cost[i]-r*dis[i])==0时,这个r就是最优的。这个证明是01分数规划。#include#include#include#include#include#define Maxn 1010#define Maxm Maxn*Maxn#define inf 1e16#define eps 1e-6using namespace std;int vi[Maxn],n;d 阅读全文
posted @ 2013-07-24 20:31 fangguo 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 思路:利用dfs遍历整棵树,找出最长子树与次长子树,两者的和最大就是直径。若k值小于直径就输出k-1,否则输出(k-d-1)*2+d;#include#include#include#include#define Maxn 1000010using namespace std;int vi[Maxn],head[Maxn],ans,e;struct Edge{ int u,v,next,val;}edge[Maxn];void init(){ e=0; memset(head,-1,sizeof(head)); ans=0; memset(vi,0,sizeof(... 阅读全文
posted @ 2013-07-24 17:19 fangguo 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 思路:首先将所有的查询有一个vector保存起来。我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的,同样要记录走右节点的有多少比X小的,多少比X大的。小和大的x,y值题目给了。当要进行左儿子时,建该节点值插入走左的线段树,回退的时候将其删除,进入右儿子时将其插入走右的线段树,同样回退时删除。遍历完一个树,整个查询就做完了,最后输出。#include#include#include#include#include#include#define Maxn 200100#define lson(x) (x>1)#define in 阅读全文
posted @ 2013-07-24 17:13 fangguo 阅读(416) 评论(0) 推荐(0) 编辑