题意:给你一棵n 个节点的树,定义1到n的代价是1到 n节点间的最短路径的长度。

现在给你 m 组询问,让你添加一条边权为 w 的边(不与原图重复),求代价的最大值。询问之间相互独立。

1≤n,m≤3×1e5,1<=c[i]<=1e9,1<=w<=1e9

思路:网上dalao们的写法好像都和我不太一样……

考虑将1-n路径上所有的点取出,则原树变成了一条链和若干条子树

首先判断以链上某一点为根的子树size是否>=3,若是则可以在其内部连边,对最短路没有影响

若没有则考虑在链上的点或者其延伸出的一个点(size<=2)中取某两个点上连边

预处理出mx[u]代表u除链上儿子的子树最大深度

则对于x,y(x在上y在下)两个点来说相对于原方案,新的方案增加了mx[x]+mx[y]-2*dis[y]的长度

对于固定的y只需要维护mx[x]的前缀最大值

需要注意的是不能连原树中有的边,即mx[x]=dis[x]和mx[y]=dis[y]不能同时成立,否则相当于同时取到链上相邻的两点

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 310000
#define M 51
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 3e14 struct node
{
int x,cost;
node(int a,int b)
{
x=a;
cost=b;
}
}; ll d[N],mx[N],dis[N];
int flag[N],size[N],fa[N],b[N],q[N];
vector<node>c[N]; void dfs(int u)
{
flag[u]=;
for(int i=;i<=(int)c[u].size()-;i++)
{
int v=c[u][i].x;
if(!flag[v])
{
fa[v]=u;
dis[v]=dis[u]+c[u][i].cost;
dfs(v);
}
}
} void dfs2(int u)
{
flag[u]=size[u]=;
mx[u]=dis[u];
for(int i=;i<=(int)c[u].size()-;i++)
{
int v=c[u][i].x;
if(flag[v]==&&b[v]==)
{
dfs2(v);
size[u]+=size[v];
mx[u]=max(mx[u],mx[v]);
}
}
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) c[i].clear();
for(int i=;i<=n-;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
c[x].push_back(node(y,z));
c[y].push_back(node(x,z));
}
memset(flag,,sizeof(flag));
dis[]=;
dfs();
memset(b,,sizeof(b));
int num=;
int k=n;
while(k!=)
{
q[++num]=k;
b[k]=;
k=fa[k];
}
q[++num]=; b[]=;
memset(flag,,sizeof(flag));
for(int i=;i<=num;i++) dfs2(q[i]); int p=;
for(int i=;i<=num;i++)
{
int u=q[i];
if(size[u]>=){p=; break;}
} for(int i=;i<=num/;i++) swap(q[i],q[num-i+]);
ll len=-oo;
for(int i=;i<=num;i++)
{
int u=q[i];
if(i>=)
{
int fa=q[i-];
if(mx[u]>dis[u]) len=max(len,mx[u]-dis[u]*+d[i-]);
else
{
if(mx[fa]>dis[fa]) len=max(len,mx[u]-dis[u]*+d[i-]);
else if(i>=)
{
int x=q[i-];
len=max(len,mx[u]-dis[u]*+d[i-]);
}
}
}
if(i==) d[i]=mx[u];
else d[i]=max(d[i-],mx[u]);
} for(int i=;i<=m;i++)
{
int x;
scanf("%d",&x);
if(p){printf("%lld\n",dis[n]); continue;}
printf("%lld\n",min(dis[n],dis[n]+len+x));
}
return ;
}

【CF1016F】Road Projects(贪心)的更多相关文章

  1. CF1016F 【Road Projects】

    思路 可以考虑另一种想法:因为我们发现,答案是肯定不会大于在原来的树上的最短路径的.所以原来的最短路是(有可能的)最大值! 我们把树变成这样,提取出1~n的路径,方便观看撕烤: (它有个我起的名字,叫 ...

  2. [Codeforces 1016F]Road Projects

    Description 题库链接 给你一棵 \(n\) 个节点的树,定义 \(1\) 到 \(n\) 的代价是 \(1\) 到 \(n\) 节点间的最短路径的长度.现在给你 \(m\) 组询问,让你添 ...

  3. Educational Codeforces Round 48

    题目地址 Edu48 A.Death Note 翻译 你有一个无穷页的本子,每一页可以写\(m\)个名字, 你在第\(i\)天要写\(a_i\)个名字,如果这一页恰好写满了,你就会翻页, 问每天的翻页 ...

  4. dp or 贪心 --- hdu : Road Trip

    Road Trip Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 29 ...

  5. HDU 1598 find the most comfortable road 并查集+贪心

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000 ...

  6. CF1203F2 Complete the Projects (hard version)(结论+背包+贪心)

    题目 做法 对于加分的直接贪心 而掉分的用排序后的背包动规 假设有两个物品\((a_1,b_1)(a_2,b_2)\) 选第一个物品后无法选择第二个物品,假设开始值为\(r\):\(r>a_1, ...

  7. Codeforces1203F2. Complete the Projects (hard version) (贪心+贪心+01背包)

    题目链接:传送门 思路: 对于对rating有提升的项目,肯定做越多越好,所以把$b_{i} >= 0$的项目按rating要求从小到大贪心地都做掉,得到最高的rating记为r. 对于剩余的$ ...

  8. Road to Cinema(贪心+二分)

    https://www.cnblogs.com/flipped/p/6083973.html       原博客转载 http://codeforces.com/group/1EzrFFyOc0/co ...

  9. Codeforces Round #579 (Div. 3) Complete the Projects(贪心、DP)

    http://codeforces.com/contest/1203/problem/F1 Examples input 1 - - output 1 YES input 2 - - output 2 ...

随机推荐

  1. 【jQuery】输入框自带清除按钮

    最近一个项目,需要在输入框时右边出现“X”标志,点击X即可清空,主要使用了click和blur事件,难点在于点击‘X’时,input框获得焦点时出现“X”标志,而点击"x"标志时i ...

  2. 关于 PHP 程序员技术职业生涯规划

    原文地址:http://rango.swoole.com/archives/570 看到很多 PHP 程序员职业规划的文章,都是直接上来就提 Linux.PHP.MySQL.Nginx.Redis.M ...

  3. bedtools

  4. dialog BLE SDK 学习(3)

    dialog DA14580 SDK版本:5.0.4. 本文介绍了DA14580 SDK的学习感想和建议,分享给大家. 首先,Dialog官网上的资料挺全的,但是是英文的,如果英文不好,比如笔者,阅读 ...

  5. Bootstrap3适配IE8浏览器的方法

    <!--[if lte IE 8]> <script src="js/respond.min.js"></script> <script ...

  6. MySQL CONCAT()与GROUP_CONCAT()的使用

      1 . MySQL CONCAT(str1,str2, ...)  --返回连接的字符串 mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQ ...

  7. 一、MySQL数据库之简介和安装

    一.基础部分 1.数据库是简介     之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序 ...

  8. 1079: [SCOI2008]着色方案

    链接 思路 首先是dp,如果直接用每个种颜色的剩余个数做状态的话,复杂度为5^15. 由于c<=5,所以用剩余数量的颜色的种类数做状态:f[a][b][c][d][e][last]表示剩余数量为 ...

  9. POJ 3580 SuperMemo 伸展树

    题意: 维护一个序列,支持如下几种操作: ADD x y D:将区间\([x,y]\)的数加上\(D\) REVERSE x y:翻转区间\([x,y]\) REVOLVE x y T:将区间\([x ...

  10. USACO Section1.1 Broken Necklace 解题报告

    beads解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...