HDU 5861

题意

在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放。现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道路进行开放。在满足m天内花费最小的情况下,求出每天的花销。

分析:

我们可以想到用线段树想到记录每一段路的开始时间与结束时间,开始时间很简单,就是一开始的时间,结束的时间求法可以参考区间覆盖,这是类似的;

然后我们在转化哪一天开哪些,哪一天关哪些,那这天的贡献sum = 开-关 ;

这很关键,我在比赛就没有想出来。。

例:如st[1]=3,表示第1段道路的最早开始时间是第3天,那么你可以start[3].push_back(1),表示第3天开启第1段道路,这样扫一遍过去就行了;

这是一种,要不就用d[be[i]]+=w[i] , d[en[i]]-=w[i];  其实差不多

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std ;
  4. #define lson l,m,rt<<1
  5. #define rson m+1,r,rt<<1|1
  6. const int maxn = ;
  7. int Begin[maxn << ], End[maxn << ];
  8. int be[maxn],en[maxn],w[maxn];
  9. long long sum[maxn],d[maxn];
  10. void pushdown(int rt)//向下跟新
  11. {
  12. if(!Begin[rt<<])
  13. Begin[rt<<]=Begin[rt];
  14. if(!Begin[rt<<|])
  15. Begin[rt<<|]=Begin[rt];
  16.  
  17. if(!End[rt])
  18. return ;
  19. End[rt<<]=End[rt<<|]=End[rt];
  20. End[rt]=;///优化用过了就可以不用了
  21.  
  22. }
  23. void build(int l , int r , int rt)
  24. {
  25. Begin[rt]=End[rt]=;
  26. if(l==r)
  27. return ;
  28. int m = (l+r) >> ;
  29. build(lson);
  30. build(rson);
  31. }
  32.  
  33. void update(int L , int R , int k , int l , int r , int rt)
  34. {
  35. if(L<=l && r<=R)
  36. {
  37. if(!Begin[rt])///很简单的道理,我跟新过了就不跟新了;
  38. Begin[rt]=k;
  39. End[rt]=k;
  40. return ;
  41. }
  42. pushdown(rt);
  43. int m=(l+r) >> ;
  44. if(m>=L)
  45. update(L,R,k,lson);
  46. if(m<R)
  47. update(L,R,k,rson);
  48. }
  49. void pushall(int l , int r , int rt)
  50. {
  51. if(l==r)
  52. {
  53. be[l]=Begin[rt],en[l]=End[rt];
  54. return ;
  55. }
  56. pushdown(rt);
  57. int m=(l+r)>>;
  58. pushall(lson);
  59. pushall(rson);
  60. }
  61. int main()
  62. {
  63. int n,m;
  64. while(~scanf("%d%d",&n,&m))
  65. {
  66. n--;
  67. build(,n,);///建树
  68. for(int i= ; i<=n ; i++)
  69. scanf("%d",&w[i]);
  70.  
  71. for(int i= ; i<=m ; i++)
  72. {
  73. int u,v;
  74. scanf("%d%d",&u,&v);
  75. if(u>v)//防止意外
  76. swap(u,v);
  77. update(u,v-,i,,n,);///u到v区间更新为i(天);
  78. }
  79. pushall(,n,);//找到每一段路的开始时间与结束时间
  80. memset(d,,sizeof(d));
  81. for(int i= ; i<=n ; i++)//每一段路的开始费用与结束费用
  82. {
  83. if(be[i])
  84. {
  85. d[be[i]]+=w[i];
  86. d[en[i]+]-=w[i];
  87. }
  88. }
  89. sum[]=;
  90. for(int i= ; i<=m ; i++)///类似与扫描线,一天一天的扫过去
  91. {
  92. sum[i]=sum[i-]+d[i];
  93. printf("%lld\n",sum[i]);
  94. }
  95. }
  96. }

线段树真厉害,以后就不要只是固定与模板,要与线段树的结构与自己需要用的功能结合

2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)的更多相关文章

  1. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  2. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

  3. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  4. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  5. 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple

    CRB and Apple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  7. HDU 5861 Road(线段树 区间修改 单点查询)

    Road Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  8. LCIS HDU - 3308 (线段树区间合并)

    LCIS HDU - 3308 Given n integers. You have two operations: U A B: replace the Ath number by B. (inde ...

  9. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

随机推荐

  1. hive like 模糊匹配

    类似: 在MYSQL里面我们可以这样的执行SQL select a.Community,a.PID,b.spidertime,b.comm,b.showings,b.room from lianjia ...

  2. oracle DDL(create、alter、drop)

    一.创建表1.创建表CREATE TABLE <table_name>( column1 DATATYPE [NOT NULL] [PRIMARY KEY], column2 DATATY ...

  3. 第二部分 实习操作课程 第一节 ArcGIS Online的基本功能

  4. CURD 操作 [1]

    create创建新数据 首先在主目录下创建index.html,与index.php同级,插入以下代码 <meta charset="utf-8"> <form ...

  5. loj10131 暗的连锁

    传送门 分析 首先我们知道如果在一棵树上加一条边一定会构成一个环,而删掉环上任意一条边都不改变连通性.我们把这一性质扩展到这个题上不难发现如果一条树边不在任意一个新边构成的环里则删掉这条边之后可以删掉 ...

  6. Luogu 3402 可持久化并查集

    点开这题纯属无聊……不过既然写掉了,那就丢一个模板好了 不得不说,可持久化并查集实现真的很暴力,就是把并查集的数组弄一个主席树可持久化. 有一点要注意的是不能写路径压缩,这样跳版本的时候会错,所以弄一 ...

  7. 在windows中安装OpenSSH,无密码登录,永远不断线

    到这里下载最新安装包:https://github.com/PowerShell/Win32-OpenSSH/releases下载下来解压,然后用管理员打开服务器自带的PowerShell,运行下列命 ...

  8. 12. git常用语法总结

    git介绍与安装这里不再多说,再说也不如廖雪峰大佬总结的优秀: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67 ...

  9. Elasticsearch suggester搜索建议初步

    环境 Elasticsearch 2.3.5 Elasticsearch-ik-plugin 实现 搜索建议的对象 假设有以下两个json对象,需要对其中tags字段进行搜索建议: //对象Produ ...

  10. 数据库(学习整理)----6--Oracle如何快速备份和多次备份数表数据

    1.说明:  这里假设一种应用场景! 假设,银行系统中有大量的数据需要及时备份,如何才能快速高效呢! 条件需求: (1).不能设置同步锁(设置的会影响银行正常业务进行!使得银行系统处于维护状态,这是不 ...