[Codeforces671D]Roads in Yusland
[Codeforces671D]Roads in Yusland
Tags:题解
题意
luogu
给定以1为根的一棵树,有\(m\)条直上直下的有代价的链,求选一些链把所有边覆盖的最小代价。若无解输出-1
\(n\le 3*10^5\)
题解
这题有一些DP做法,这里不再赘述了。
首先你得知道线性规划的对偶。
式子是这样的\(max\{c^Tx|Ax\le b\}=min\{b^Ty|A^Ty\ge c\}\)
强行往上面套(右式):
- \(c\)为全1列向量,长度为\(m\)
- \(y\)为01列向量,长度为\(m\),表示每条链选或不选
- \(A^T\)为长\(n-1\)、宽\(m\)的01矩阵,\(A[i][j]\)表示\(i\)这条边在不在第\(j\)条链中
- \(b^T\)为长为\(m\)的行向量,表示选每条链的代价
所以现在的问题就是要构造一个\(x\)使得左式最大。
那我们寻找左式的实际意义:给每条边标记一个权值\(x\),使得每条链上的边的权值和不超过其代价。
感觉完全不是一个问题了对吧,但是确实他们答案相同。
为方便表述,这条边标记权值\(x\)记为这条边选了\(x\)次。
然后这是一个较为显然的贪心,从深到浅能选则选,用可并堆维护当前点到父亲这条边能选的最多次数。
代码
#include<iostream>
#include<vector>
#define pb push_back
#define lc t[x].ch[0]
#define rc t[x].ch[1]
using namespace std;
const int N=3e5+10;
int n,m,cf[N],rt[N],dep[N],nod;
long long Ans;
vector<int> E[N],St[N];
struct mmp{int x,y,c;}A[N];
struct Heap{int ch[2],val,id,dis,tag;}t[N];
void Put(int x,int k) {t[x].tag+=k;t[x].val+=k;}
void pushdown(int x) {int &v=t[x].tag;if(v) Put(lc,v),Put(rc,v),v=0;}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
pushdown(x);pushdown(y);
if(t[x].val>t[y].val) swap(x,y);
rc=Merge(rc,y);
if(t[lc].dis<t[rc].dis) swap(lc,rc);
t[x].dis=t[lc].dis+1;
return x;
}
int Del(int x) {return Merge(lc,rc);}
void dfs(int x,int fr)
{
dep[x]=dep[fr]+1;
for(auto R:E[x])
if(R!=fr) dfs(R,x),rt[x]=Merge(rt[x],rt[R]),cf[x]+=cf[R];
if(!cf[x]&&x>1) puts("-1"),exit(0);
for(auto P:St[x])
t[++nod].val=A[P].c,t[nod].id=P,rt[x]=Merge(rt[x],nod);
while(dep[A[t[rt[x]].id].y]>=dep[x]) rt[x]=Del(rt[x]);
if(rt[x]) Ans+=t[rt[x]].val,Put(rt[x],-t[rt[x]].val);
}
int main()
{
cin>>n>>m;
for(int i=1,x,y;i<n;i++)
scanf("%d%d",&x,&y),E[x].pb(y),E[y].pb(x);
for(int i=1,x,y,c;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
St[x].pb(i);cf[x]++;cf[y]--;
A[i]=(mmp){x,y,c};
}
dfs(1,0);
cout<<Ans<<endl;
}
[Codeforces671D]Roads in Yusland的更多相关文章
- 题解-Codeforces671D Roads in Yusland
Problem Codeforces-671D 题意概要:给定一棵 \(n\) 点有根树与 \(m\) 条链,链有费用,保证链端点之间为祖先关系,问至少花费多少费用才能覆盖整棵树(\(n-1\) 条边 ...
- codesforces 671D Roads in Yusland
Mayor of Yusland just won the lottery and decided to spent money on something good for town. For exa ...
- Codeforces 671 D. Roads in Yusland
题目描述 Mayor of Yusland just won the lottery and decided to spent money on something good for town. Fo ...
- 【CF671D】Roads in Yusland(贪心,左偏树)
[CF671D]Roads in Yusland(贪心,左偏树) 题面 洛谷 CF 题解 无解的情况随便怎么搞搞提前处理掉. 通过严密(大雾)地推导后,发现问题可以转化成这个问题: 给定一棵树,每条边 ...
- 【CF617D】Roads in Yusland
[CF617D]Roads in Yusland 题面 蒯的洛谷的 题解 我们现在已经转化好了题目了,戳这里 那么我们考虑怎么求这个东西,我们先判断一下是否所有的边都能被覆盖,不行的话输出\(-1\) ...
- 【CodeForces】671 D. Roads in Yusland
[题目]D. Roads in Yusland [题意]给定n个点的树,m条从下往上的链,每条链代价ci,求最少代价使得链覆盖所有边.n,m<=3*10^5,ci<=10^9,time=4 ...
- Codeforces 671D Roads in Yusland [树形DP,线段树合并]
洛谷 Codeforces 这是一个非正解,被正解暴踩,但它还是过了. 思路 首先很容易想到DP. 设\(dp_{x,i}\)表示\(x\)子树全部被覆盖,而且向上恰好延伸到\(dep=i\)的位置, ...
- codeforces 671D Roads in Yusland & hdu 5293 Tree chain problem
dp dp优化 dfs序 线段树 算是一个套路.可以处理在树上取链的问题.
- Codeforces 671D. Roads in Yusland(树形DP+线段树)
调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果 ...
随机推荐
- VScode 1.13 gocode提示dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected..
在将VScode升级至 1.13后让升级gocode,在升级时报出如下错误 D:\go_work\src>go get -u -v github.com/mdempsky/gocode gith ...
- luogu 2878 贪心
其实这题不难,只是想告诉自己:贪心不全是真的脑残拿最大就AC 此题实际上就是比较x,y优先级利用时间计算得到a[i]t/a[i].d(没错时间在上,并非惯性思维的d在上) t*a[x].d+(t+a[ ...
- Spring Boot 起步
……………………………………………………………………………………………………………… [应用配置]application.yml [port][context-path][datasource][jp ...
- PHP+MySql+Bootstrap实现用户界面数据的删除、修改与批量选择删除——实例操作
第一步:在数据库中建立要操作的信息表 如下图: 第二步:实现对该信息表中数据的删除功能 代码如下:main(主页面) <!DOCTYPE html><html> < ...
- oracle 对现有的表进行列表分区
create tablespace pur120000 datafile 'D:\orcldata\pur120000.dbf' size 1024m reuse autoextend on next ...
- 第25月第18天 vue
1.cnpm sudo chown -R $USER /usr/local npm install -g cnpm --registry=https://registry.npm.taobao.or ...
- steps/train_lda_mllt.sh
LDA+MLLT指的是在计算MFCC后对特征进行的变换:首先对特征进行扩帧,使用LDA降维(默认降低到40),然后经过多次迭代轮数估计一个对角变换(又称为MLLT或CTC) .详见 http://ka ...
- LR-Controller 如何自定义显示虚拟用户状态
我们压测时,如何直观,实时地查看当前运行账号和迭代情况呢. 在运行脚本中添加一行代码就解决了~~~~~~~~~~~
- s9.16作业,员工信息表
转载https://blog.csdn.net/qq_35883464/article/details/83151464 实现员工信息表文件存储格式如下:id,name,age,phone,job1, ...
- MyBatis中---数据库配置的属性名冲突问题
一.db.properties 属性文件中 最好加特殊的标志前缀 jdbc.username ,如果单纯的username有可能影响到 mapper.xml中的 ${username}; 举例 ...