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];  其实差不多

#include<bits/stdc++.h>using namespace std ;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn = 200020;
int Begin[maxn << 2], End[maxn << 2];
int be[maxn],en[maxn],w[maxn];
long long sum[maxn],d[maxn];
void pushdown(int rt)//向下跟新
{if(!Begin[rt<<1])Begin[rt<<1]=Begin[rt];if(!Begin[rt<<1|1])Begin[rt<<1|1]=Begin[rt];if(!End[rt])return ;End[rt<<1]=End[rt<<1|1]=End[rt];End[rt]=0;///优化用过了就可以不用了

}
void build(int l , int r , int rt)
{Begin[rt]=End[rt]=0;if(l==r)return ;int m = (l+r) >> 1 ;build(lson);build(rson);
}void update(int L , int R , int k , int l , int r , int rt)
{if(L<=l && r<=R){if(!Begin[rt])///很简单的道理,我跟新过了就不跟新了;Begin[rt]=k;End[rt]=k;return ;}pushdown(rt);int m=(l+r) >> 1;if(m>=L)update(L,R,k,lson);if(m<R)update(L,R,k,rson);
}
void pushall(int l , int r , int rt)
{if(l==r){be[l]=Begin[rt],en[l]=End[rt];return ;}pushdown(rt);int m=(l+r)>>1;pushall(lson);pushall(rson);
}
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){n--;build(1,n,1);///建树for(int i=1 ; i<=n ; i++)scanf("%d",&w[i]);for(int i=1 ; i<=m ; i++){int u,v;scanf("%d%d",&u,&v);if(u>v)//防止意外
            swap(u,v);update(u,v-1,i,1,n,1);///u到v区间更新为i(天);
        }pushall(1,n,1);//找到每一段路的开始时间与结束时间memset(d,0,sizeof(d));for(int i=1 ; i<=n ; i++)//每一段路的开始费用与结束费用
        {if(be[i]){d[be[i]]+=w[i];d[en[i]+1]-=w[i];}}sum[0]=0;for(int i=1 ; i<=m ; i++)///类似与扫描线,一天一天的扫过去
        {sum[i]=sum[i-1]+d[i];printf("%lld\n",sum[i]);}}
}

View Code

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

转载于:https://www.cnblogs.com/shuaihui520/p/9795013.html

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.3308 LCIS(线段树,区间合并+单点更新)

    按照傻崽大神的线段树修炼路线,自己做的第二道区间合并的题. 问题比较简单明了,区间求最长连续上升子序列,但是是需要单点更新的 n个数, m组操作 Q A B 询问[A,B]区间的最长连续上升子序列: ...

  3. hdu 3308 LCIS 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...

  4. Assign the task HDU - 3974(线段树+dfs建树+单点查询+区间修改)

    题意: 染色问题:给一个固定结构的树,现在有两个操作: (1) y 将结点x及其所有后代结点染成颜色y: (2)查询结点x当前的颜色. 其实就是区间染色问题,不过需要dfs预处理, 题目: There ...

  5. HDU 1556【线段树区间更新】

    这篇lazy讲的很棒: https://www.douban.com/note/273509745/ if(tree[rt].l == l && r == tree[rt].r) 这里 ...

  6. hdu 3577(线段树区间更新)

     题意:输入一个t,表示有t组测试数据: 接下来一行,输入两个数,k,m,其中k表示这个辆车最多可以坐这么多人,m表示有m次询问能否上车: 每一次询问,输入两个数a,b,表示该乘客能否在a站台上车 ...

  7. HDU - 5316 Magician(线段树区间合并)

    题目链接:点击查看 题目大意:给出长度为 n 的数列 a ,接下来进行 m 次操作,每次操作分为两种类型: 0 l r:询问区间 [ l , r ] 内的最长子序列之和,要求相邻两个位置的下标奇偶性不 ...

  8. HDU - 3667 Hotel(线段树+区间合并)

    题目链接:点击查看 题目大意:给出n个连续的空房间,依次进行m个操作,操作一是查询操作,查询在总区间内的一段连续的长度为x的空房间,并 且该位置要靠左,如果查询到返回最左边的端点,并将其占用,找不到返 ...

  9. 2016 Multi-University Training Contest 10

    solved 7/11 2016 Multi-University Training Contest 10 题解链接 分类讨论 1001 Median(BH) 题意: 有长度为n排好序的序列,给两段子 ...

最新文章

  1. “脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑
  2. 基于MATLAB的面对对象编程(3)——事件和响应
  3. 权益证明协议中的拜占庭容错
  4. 利用union判断系统的大小端
  5. confirm修改按钮文字_条码设计软件如何调整条形码与条码文字之间的距离
  6. 消控中心人员配置_电气火灾监控系统在石药集团新药制剂配套特色原料药FDA生产中心项目...
  7. zabbix分布式监控部署proxy安装
  8. MFC编码注意(2)
  9. windows 服务的安装与卸载之bat脚本命令
  10. 盒马-在路上的服务设计品牌
  11. 日程安排工具Calendso
  12. c语言百分号-5.2f什么意思,c语言中的%d跟%5.2f有什么区别
  13. 自制网站服务器主机,自制服务器主机迷你
  14. mac+python3+selenium做pc的界面自动化测试
  15. 亲手打造自己的 Linux 桌面环境
  16. “互联网+工业”下的大数据应用场景分析
  17. 《需求工程——软件建模与分析》阅读笔记03
  18. html中可以打钩的小方块,Word文档怎么实现在小方块里打钩? | 我爱分享网
  19. 求职路艰辛,深圳天瑞地安助力求职人对工作感到无忧
  20. 区块链三加一 “成才”路上提个醒:区块链培训机构鱼龙混杂

热门文章

  1. 《python3网络爬虫开发实战》--基本库的使用
  2. hadoop部署单机
  3. Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
  4. 使用C语言来实现模块化
  5. 关于服务器返回信息的Unicode转码的方法
  6. poj2478 Farey Sequence (欧拉函数)
  7. C++ 画星号图形——空心矩形(核心代码记录)
  8. Linux查看进程和终止进程的技巧
  9. “theform._eventtarget 为空或者不是对象”,解决办法
  10. 使用消息队列实现分布式事务-公认较为理想的分布式事务解决方案(转)