题目链接:

http://acm.split.hdu.edu.cn/showproblem.php?pid=5861

Road

Time Limit: 12000/6000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)

问题描述

There are n villages along a high way, and divided the high way into n-1 segments. Each segment would charge a certain amount of money for being open for one day, and you can open or close an arbitrary segment in an arbitrary day, but you can open or close the segment for just one time, because the workers would be angry if you told them to work multiple period.

We know the transport plan in the next m days, each day there is one cargo need to transport from village ai to village bi, and you need to guarantee that the segments between ai and bi are open in the i-th day. Your boss wants to minimize the total cost of the next m days, and you need to tell him the charge for each day.

(At the beginning, all the segments are closed.)

输入

Multiple test case. For each test case, begins with two integers n, m(1<=n,m<=200000), next line contains n-1 integers. The i-th integer wi(1<=wi<=1000) indicates the charge for the segment between village i and village i+1 being open for one day. Next m lines, each line contains two integers ai,bi(1≤ai,bi<=n,ai!=bi).

输出

For each test case, output m lines, each line contains the charge for the i-th day.

样例

sample input

4 3

1 2 3

1 3

3 4

2 4

sample output

3

5

5

题意

有n个村庄排成一行,中间n-1条路,每条路开启的花费是a[i]每天,你可以选择每条路的开启时间和关闭时间,但是路关闭之后就不能再开启。现在告诉你接下来的m天的行程,每天会有一辆货车从u到v,你需要保证货车经过的道路必须是开启的。问每天的最小花费。

题解

用线段树求出使用到每条道路的最早时间和最晚时间(这就是我们需要设置的开启时间和关闭时间了)。然后以天数作为数组,再建一颗线段树,根据没条道路的开放时间[mi,ma]去区间更新,然后单点查询求每一天的花费是多少。

代码

这里用的是一种不需要打懒惰标记的方法,并且由于是单点查询,所以只需要往下更新,不用回溯回来。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++) typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=2e5+10; int road[maxn]; //这里maxv,minv是一颗线段树,sumv是另一颗线段树,偷懒写在一起了
int maxv[maxn<<2],minv[maxn<<2];
int sumv[maxn<<2]; int ql,qr,_v,_v2;
void update(int o,int l,int r,int type) {
if(ql<=l&&r<=qr) {
if(type==-1) {
maxv[o]=max(maxv[o],_v);
minv[o]=min(minv[o],_v);
} else {
sumv[o]+=_v2;
}
} else {
if(ql<=mid) update(lson,l,mid,type);
if(qr>mid) update(rson,mid+1,r,type);
} } int _p,_ma,_mi,_sum;
void query(int o,int l,int r,int add,int ma,int mi) {
if(l==r) {
_ma=max(ma,maxv[o]);
_mi=min(mi,minv[o]);
_sum=add+sumv[o];
} else {
if(_p<=mid) query(lson,l,mid,add+sumv[o],max(ma,maxv[o]),min(mi,minv[o]));
else query(rson,mid+1,r,add+sumv[o],max(ma,maxv[o]),min(mi,minv[o]));
}
} void init() {
clr(sumv,0);
clr(maxv,-1);
clr(minv,0x3f);
} int main() {
int n,m;
while(scanf("%d%d",&n,&m)==2&&n) {
init();
for(int i=1; i<=n-1; i++) scanf("%d",&road[i]); ///求每条路开放的最早和最迟时间
for(int i=1; i<=m; i++) {
int u,v;
scanf("%d%d",&u,&v);
if(u>v) swap(u,v);
v--;
ql=u,qr=v,_v=i;
update(1,1,n-1,-1);
}
for(int i=1; i<=n-1; i++) {
_p=i,_ma=-1,_mi=INF;
query(1,1,n-1,0,_ma,_mi);
// printf("%d,%d\n",_mi,_ma);
if(_mi>_ma) continue;
ql=_mi,qr=_ma,_v2=road[i];
update(1,1,m,1);
} ///求每天的花费是多少
for(int i=1; i<=m; i++) {
_p=i,_sum=0;
query(1,1,m,0,_ma,_mi);
printf("%d\n",_sum);
}
}
return 0;
} //end-----------------------------------------------------------------------

HDU 5861 Road 线段树区间更新单点查询的更多相关文章

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

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

  2. ZOJ 1610 Count the Colors【题意+线段树区间更新&&单点查询】

    任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Count the Colors Time Limit: 2 ...

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

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

  4. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

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

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

  6. HDU 3308 LCIS 线段树区间更新

    最近开始线段树一段时间了,也发现了不少大牛的博客比如HH大牛  ,小媛姐.这个题目是我在看HH大牛的线段树专题是给出的习题,(可以去他博客找找,真心推荐)原本例题是POJ3667 Hotel 这个题目 ...

  7. hdu 1698(线段树区间更新)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询

    题意 贴海报 最后可以看到多少海报 思路 :离散化大区间  其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时  把y+1点也加入 ...

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

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

随机推荐

  1. svg路径动画心得

    svg动画,随着路线运动,项目中需要用到,接触的时候感觉很高级,但是不会-无从下手呀!于是在网上找相关资料,先借鉴再修改成自己的. <svg width="500" heig ...

  2. elasticsearch简单的安装以及集群配置详解

    首先要确保有java8的环境,安装方法如下(centos) wget --no-check-certificate --no-cookies --header "Cookie: oracle ...

  3. hadoop运维笔记

    一. 故障处理部分 1.1. spark提交任务报错java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSON   报错原因: 在运行环境没有找 ...

  4. mybatsi中文乱码问题

    乱码问题:待总结,这里先贴出网友的博客: http://blog.csdn.net/zht666/article/details/8955952

  5. 201552-53 《Java程序设计》第三周问题汇总

    201552-53 <Java程序设计>第三周问题汇总 1. 4.2 基本类型打包器理解不是很好,希望老师讲解一下. 2.vim中怎么用"yyp"复制上一行代码 在按E ...

  6. 2016-2017-2 《Java程序设计》第1周学习问题汇总

    201552-53 <Java程序设计>第一周问题汇总 关于软件安装以及配置中出现的问题,附上教程及讨论组网址: JDK/intelljIDEA安装及配置: http://www.cnbl ...

  7. 20155320 《Java程序设计》实验五网络编程与安全实验报告

    20155320 <Java程序设计>实验五网络编程与安全实验报告 实验内容 实验一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...

  8. 【NOIP2018】提高组题解

    [NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕

  9. MySQLdb in Python: “Can't connect to MySQL server on 'localhost'”

    因为我使用的是win64,所以在此系统下,需要设置为 127.0.0.1 #coding=utf-8 import MySQLdb if __name__ == '__main__': # 打开数据库 ...

  10. C#反射的简单示例

    反射(Reflection)可以在运行时获 得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等反正说白了就 ...