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

题面

洛谷

CF

题解

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

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

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

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

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

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define ll long long
  5. #define MAX 300300
  6. inline int read()
  7. {
  8. int x=0;bool t=false;char ch=getchar();
  9. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  10. if(ch=='-')t=true,ch=getchar();
  11. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  12. return t?-x:x;
  13. }
  14. struct Line{int v,next;}e[MAX<<1];
  15. int h[MAX],cnt=1;
  16. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  17. int n,m;ll ans;
  18. int x[MAX],y[MAX],z[MAX],c[MAX],dep[MAX];
  19. void pre(int u,int ff)
  20. {
  21. dep[u]=dep[ff]+1;
  22. for(int i=h[u];i;i=e[i].next)
  23. if(e[i].v!=ff)
  24. pre(e[i].v,u),c[u]+=c[e[i].v];
  25. }
  26. struct Node{int ls,rs,dep,v,ed,tag;}t[MAX];
  27. int rt[MAX];
  28. void pushdown(int r)
  29. {
  30. if(!t[r].tag)return;int w=t[r].tag;
  31. if(t[r].ls)t[t[r].ls].v+=w,t[t[r].ls].tag+=w;
  32. if(t[r].rs)t[t[r].rs].v+=w,t[t[r].rs].tag+=w;
  33. t[r].tag=0;
  34. }
  35. int Merge(int r1,int r2)
  36. {
  37. if(!r1||!r2)return r1|r2;
  38. pushdown(r1);pushdown(r2);
  39. if(t[r1].v>t[r2].v)swap(r1,r2);
  40. t[r1].rs=Merge(t[r1].rs,r2);
  41. if(t[t[r1].ls].dep<t[t[r1].rs].dep)swap(t[r1].ls,t[r1].rs);
  42. t[r1].dep=t[t[r1].rs].dep+1;
  43. return r1;
  44. }
  45. void Solve(int u,int ff)
  46. {
  47. for(int i=h[u];i;i=e[i].next)
  48. if(e[i].v!=ff)
  49. Solve(e[i].v,u),
  50. rt[u]=Merge(rt[e[i].v],rt[u]);
  51. if(u==1)return;
  52. while(dep[t[rt[u]].ed]>=dep[u])rt[u]=Merge(t[rt[u]].ls,t[rt[u]].rs);
  53. int w=t[rt[u]].v;
  54. ans+=w;t[rt[u]].v-=w,t[rt[u]].tag-=w;
  55. }
  56. int main()
  57. {
  58. n=read();m=read();
  59. for(int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u);
  60. for(int i=1;i<=m;++i)x[i]=read(),y[i]=read(),z[i]=read();
  61. for(int i=1;i<=m;++i)c[x[i]]+=1,c[y[i]]-=1;
  62. pre(1,0);
  63. for(int i=2;i<=n;++i)if(c[i]<=0){puts("-1");return 0;}
  64. 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);
  65. Solve(1,0);
  66. printf("%I64d\n",ans);
  67. return 0;
  68. }

【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. win64位安装python-mysqldb1.2.3

    在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:“Cannot open include file: 'config-win.h': No ...

  2. 在Git中添加一个项目

    首先保证Git服务器正确配置,管理员机器可正常连接并使用Git. 第一步:在服务器上新建一个项目仓库 切换到git用户: a@ubuntu:/home/git$ su - git $ cd /home ...

  3. Django异常问题之Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

    一般情况下,我们启动Django项目时默认设置的端口为8000,当你听着酷狗音乐敲着代码,启动Django项目时忽然翻车了. 不要慌,那是酷狗抢先一步占用了8000端口,解决这个问题的方式就是修改端口 ...

  4. mac下的快捷键

    功能 快捷键 通用 打开新窗口 command + n 打开新标签 command + t 关闭标签 command + w 缩小 command - 放大 command + 全屏.取消全屏 com ...

  5. Bootstrap知识记录:表单和图片

    一.表单Bootstrap 提供了一些丰富的表单样式供开发者使用.1.基本格式//实现基本的表单样式<form><div class="form-group"&g ...

  6. MySQL 日期类型函数及使用

    1 MySQL 数据库中有五种与日期时间有关的数据类型,各种日期数据类型所占空间如下图所示: 2 datetime 与 date datetime 占用8字节,是占用空间最多的一种日期格式.它显示日期 ...

  7. Docker操作删除所有容器镜像

    借鉴博客:https://www.cnblogs.com/yanyouqiang/p/8301856.html https://blog.csdn.net/wy_97/article/details/ ...

  8. idea打包springboot+maven项目并发布在linux上

    2018年11月13日我亲测有效的,很简单的,借鉴博客:https://blog.csdn.net/smilecall/article/details/56288972 第一步:随便建一个maven类 ...

  9. ES6/ES2015的一些特性的简单使

    1.一些常用的ES6的特性: let, const, class, extends, super, arrow functions, template string, destructuring, d ...

  10. Failed to bind properties under 'spring.datasource' to javax.sql.DataSource

    这是我的配置文件 # 国际化配置文件(包名.基础名) spring.messages.basename=i18n.login server.tomcat.uri-encoding=UTF- sprin ...