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 = ;
int Begin[maxn << ], End[maxn << ];
int be[maxn],en[maxn],w[maxn];
long long sum[maxn],d[maxn];
void pushdown(int rt)//向下跟新
{
if(!Begin[rt<<])
Begin[rt<<]=Begin[rt];
if(!Begin[rt<<|])
Begin[rt<<|]=Begin[rt]; if(!End[rt])
return ;
End[rt<<]=End[rt<<|]=End[rt];
End[rt]=;///优化用过了就可以不用了 }
void build(int l , int r , int rt)
{
Begin[rt]=End[rt]=;
if(l==r)
return ;
int m = (l+r) >> ;
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) >> ;
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)>>;
pushall(lson);
pushall(rson);
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
n--;
build(,n,);///建树
for(int i= ; i<=n ; i++)
scanf("%d",&w[i]); for(int i= ; i<=m ; i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(u>v)//防止意外
swap(u,v);
update(u,v-,i,,n,);///u到v区间更新为i(天);
}
pushall(,n,);//找到每一段路的开始时间与结束时间
memset(d,,sizeof(d));
for(int i= ; i<=n ; i++)//每一段路的开始费用与结束费用
{
if(be[i])
{
d[be[i]]+=w[i];
d[en[i]+]-=w[i];
}
}
sum[]=;
for(int i= ; i<=m ; i++)///类似与扫描线,一天一天的扫过去
{
sum[i]=sum[i-]+d[i];
printf("%lld\n",sum[i]);
}
}
}

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

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. adb pull 和 adb push

    1. 操作单个文件 通过adb push,则可将文件添加到SD卡中.如果想在push的时候修改文件名称的话,只需要修改push的第二个参数改成完整路径(目录+文件名),如/sdcard/test-0. ...

  2. POJ 1151 扫描线 线段树

    题意:给定平面直角坐标系中的N个矩形,求它们的面积并. 题解:建立一个四元组(x,y1,y2,k).(假设y1<y2)用来储存每一条线,将每一条线按x坐标排序.记录所有的y坐标以后排序离散化.离 ...

  3. Windows系统 为 QT5软件 搭建 OpenCV2 开发环境

    Windows系统 为 QT5软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Qt5 软件:Qt 5. 7. 0 OpenCV2 版本:OpenCV2.4.10 1 ...

  4. ZBar在Windows上的使用 -- ImageMagick and OpenCV

    博客转载自:https://blog.csdn.net/sunflower_boy/article/details/49095265 1. 下载ZBar v0.10 http://zbar.sourc ...

  5. 说说excel

    今天遇到一个实际问题. 我有一组数据: 0.0.0.1 activate.adobe.com 0.0.0.1 practivate.adobe.com 0.0.0.1 ereg.adobe.com 0 ...

  6. 3、PACBIO下机数据如何看

    转载:http://www.cnblogs.com/jinhh/p/8328818.html 三代测序的下机数据都有哪些,以及他们具体的格式是怎么样的(以sequel 平台为主). 测序过程 SMRT ...

  7. JLink间接烧写【转自armobbs】

    1. 简要说明 JLink的调试功能.烧写Flash的功能都很强大,但是对于S3C2410.S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢:烧写Nan ...

  8. MediaRecorder录像那些事

    最近在做一个项目需要运用到MediaRecorder的API,之前都没接触过这部分,开始着手弄的时候各种各样的问题,真是让人崩溃呀! 最后通过网上的资料和大神的指点,当然也有自己几天坚持不懈的努力,终 ...

  9. 20169219 《Linux内核原理与分析》 第十周作业

    进程地址空间 1.进程地址空间由进程可寻址的虚拟内存组成.Linux系统中的所有进程之间以虚拟方式共享内存. 2.进程只能访问有效内存区域内的内存地址. 内存区域可以包含各种内存对象: (1) 代码段 ...

  10. MODI中的OCR模块

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.07.02更新:2012.07.09补充非简体中文版内容 自从基于MODI的DjVuToy.FreePic2Pdf. ...