【CF671D】Roads in Yusland(贪心,左偏树)

题面

洛谷

CF

题解

无解的情况随便怎么搞搞提前处理掉。

通过严密(大雾)地推导后,发现问题可以转化成这个问题:

给定一棵树,每条边可以被标记若干次,有若干个限制,每次限制一条链上所有边被覆盖的总次数不能超过一个给定值,现在要最大化边被覆盖的总次数。

不难发现转化出来的问题可以贪心来做,即一条边在满足所有限制的情况下,选择其能够被覆盖的最多次数一定不会更差,所以只要能覆盖就覆盖。

那么拿左偏树进行堆的合并就可以很容易的从下往上维护这个操作。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 300300
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int n,m;ll ans;
int x[MAX],y[MAX],z[MAX],c[MAX],dep[MAX];
void pre(int u,int ff)
{
dep[u]=dep[ff]+1;
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff)
pre(e[i].v,u),c[u]+=c[e[i].v];
}
struct Node{int ls,rs,dep,v,ed,tag;}t[MAX];
int rt[MAX];
void pushdown(int r)
{
if(!t[r].tag)return;int w=t[r].tag;
if(t[r].ls)t[t[r].ls].v+=w,t[t[r].ls].tag+=w;
if(t[r].rs)t[t[r].rs].v+=w,t[t[r].rs].tag+=w;
t[r].tag=0;
}
int Merge(int r1,int r2)
{
if(!r1||!r2)return r1|r2;
pushdown(r1);pushdown(r2);
if(t[r1].v>t[r2].v)swap(r1,r2);
t[r1].rs=Merge(t[r1].rs,r2);
if(t[t[r1].ls].dep<t[t[r1].rs].dep)swap(t[r1].ls,t[r1].rs);
t[r1].dep=t[t[r1].rs].dep+1;
return r1;
}
void Solve(int u,int ff)
{
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff)
Solve(e[i].v,u),
rt[u]=Merge(rt[e[i].v],rt[u]);
if(u==1)return;
while(dep[t[rt[u]].ed]>=dep[u])rt[u]=Merge(t[rt[u]].ls,t[rt[u]].rs);
int w=t[rt[u]].v;
ans+=w;t[rt[u]].v-=w,t[rt[u]].tag-=w;
}
int main()
{
n=read();m=read();
for(int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u);
for(int i=1;i<=m;++i)x[i]=read(),y[i]=read(),z[i]=read();
for(int i=1;i<=m;++i)c[x[i]]+=1,c[y[i]]-=1;
pre(1,0);
for(int i=2;i<=n;++i)if(c[i]<=0){puts("-1");return 0;}
for(int i=1;i<=m;++i)t[i]=(Node){0,0,0,z[i],y[i],0},rt[x[i]]=Merge(rt[x[i]],i);
Solve(1,0);
printf("%I64d\n",ans);
return 0;
}

【CF671D】Roads in Yusland(贪心,左偏树)的更多相关文章

  1. 【左偏树+贪心】BZOJ1367-[Baltic2004]sequence

    [题目大意] 给定一个序列t1,t2,...,tn ,求一个递增序列z1<z2<...<zn , 使得R=|t1−z1|+|t2−z2|+...+|tn−zn| 的值最小.本题中,我 ...

  2. bzoj1367 [Baltic2004]sequence 左偏树+贪心

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1367 题解 先考虑条件为要求不下降序列(不是递增)的情况. 那么考虑一段数值相同的子段,这一段 ...

  3. 黄源河《左偏树的应用》——数字序列(Baltic 2004)

    这道题哪里都找不到. [问题描述] 给定一个整数序列a1, a2, … , an,求一个不下降序列b1 ≤ b2 ≤ … ≤ bn,使得数列{ai}和{bi}的各项之差的绝对值之和 |a1 - b1| ...

  4. 【BZOJ2809】【APIO2012】Dispatching(左偏树)

    题面 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个 ...

  5. bzoj2809 [Apio2012]dispatching(左偏树)

    [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...

  6. 浅谈左偏树在OI中的应用

    Preface 可并堆,一个听起来很NB的数据结构,实际上比一般的堆就多了一个合并的操作. 考虑一般的堆合并时,当我们合并时只能暴力把一个堆里的元素一个一个插入另一个堆里,这样复杂度将达到\(\log ...

  7. 洛谷P3066 [USACO12DEC] 逃跑的Barn [左偏树]

    题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer J ...

  8. bzoj2809 [Apio2012]dispatching——左偏树(可并堆)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...

  9. [APIO2012]派遣 左偏树

    P1552 [APIO2012]派遣 题面 考虑枚举每个节点作为管理者,计算所获得的满意程度以更新答案.对于每个节点的计算,贪心,维护一个大根堆,每次弹出薪水最大的人.这里注意,一旦一个人被弹出,那么 ...

随机推荐

  1. 阿里云服务器使用镜像市场上的环境以后sql不能远程问题

    关于阿里云的服务器,首先要说的就是买了以后是没有环境的,什么都需要自己配置,也是在这个上面栽了很多跟头最后去的镜像市场买的一个IIS8+SQL2016的asp.net环境 怎么说呢,感觉有些问题的本源 ...

  2. (Git 学习)Git SSH Key 创建步骤

    首先感谢segmentfalut上的朋友对我帮助. 首先:查看你是否有../ssh 这个文件:怎么查看:找到你的git安装目录,在安装目录下查看是否./ssh,以我的为例: 在C盘/Users/11/ ...

  3. python中类方法,实例方法,静态方法的作用和区别

      Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么 ...

  4. js中的一些方法

    数组 //map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. 返回值:一个新数组,每个元素都是回调函数的结果. var array1 = [1, 4, 9, ...

  5. Bootstrap 字体图标(Glyphicons)

    http://www.runoob.com/bootstrap/bootstrap-glyphicons.html 什么是字体图标? 字体图标是在 Web 项目中使用的图标字体.虽然,Glyphico ...

  6. css特殊样式

    span{ color: blue; border:1px solid black;}.extra span{ color: inherit;} 清除原有样式 text-decoration: non ...

  7. Spring-Boot Banner

    下载Spring-Boot源码,目录结构spring-boot-2.1.0.M2\spring-boot-2.1.0.M2\spring-boot-project\spring-boot\src\ma ...

  8. Flutter上拉加载下拉刷新---flutter_easyrefresh

    前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...

  9. web项目中的监听器,过滤器以及自定义servlet的执行顺序

    可以看到web容器一启动就会实例化监听器的contextInitialized(ServletContextEvent event)方法,然后是过滤器的init()方法,最后在用户访问web应用的 时 ...

  10. Linux基础学习(11)--Shell编程

    第十一章——Shell编程 一.基础正则表达式 1.正则表达式与通配符(*,?,[ ]): 2.基础正则表达式: 二.字符截取命令 1.cut字段提取命令: 空格分割时,不知道空格有多少个,无法分割行 ...