挺水的一道线段树+DP题。可以从底往上添加线段,每添加线段之前查询端点所被覆盖的区间线段。再从最顶往下DP,每次从端点出发,递推覆盖该端点的区间线段的两端的值即可。

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#include <algorithm>
#define LL __int64
using namespace std; const int N= ;
const int SN=;
const int inf=(<<);
int mark[N*];
int n,s;
int dp[SN][];
struct Seg{
int l,r;
int li,ri;
}seg[SN]; void PushDown(int rt){
if(mark[rt]!=-){
mark[rt<<]=mark[rt<<|]=mark[rt];
mark[rt]=-;
}
} void update(int rt,int L,int R,int l,int r,int d){
if(L<=l&&r<=R){
mark[rt]=d;
return ;
}
PushDown(rt);
int m=(l+r)>>;
if(L<=m)update(rt<<,L,R,l,m,d);
if(m<R)update(rt<<|,L,R,m+,r,d);
} int query(int rt,int index,int l,int r){
if(mark[rt]!=-){
return mark[rt];
}
int m=(l+r)>>;
if(index<=m) return query(rt<<,index,l,m);
else return query(rt<<|,index,m+,r);
} int main(){
while(scanf("%d%d",&n,&s)!=EOF){
int mm=N,mc=-N;
memset(mark,-,sizeof(mark));
for(int i=n-;i>=;i--){
scanf("%d%d",&seg[i].l,&seg[i].r);
mm=min(seg[i].l,mm);
mc=max(seg[i].r,mc);
dp[i][]=dp[i][]=inf;
}
seg[n].l=mm; seg[n].r=mc;
mm=abs(mm);
dp[n][]=dp[n][]=inf;
mm++;
update(,,seg[n].r+mm,,mc+mm,n);
for(int i=n-;i>=;i--){
seg[i].li=query(,seg[i].l+mm,,mc+mm);
seg[i].ri=query(,seg[i].r+mm,,mc+mm);
update(,seg[i].l+mm,seg[i].r+mm,,mm+mc,i);
}
dp[][]=abs(seg[].l-s),dp[][]=abs(seg[].r-s);
int ans=inf;
int li,ri;
for(int i=;i<n;i++){
li=seg[i].li; ri=seg[i].ri;
if(li==n){
ans=min(ans,dp[i][]+abs(seg[i].l-));
}
if(ri==n){
ans=min(ans,dp[i][]+abs(seg[i].r-));
}
dp[li][]=min(dp[li][],dp[i][]+abs(seg[li].l-seg[i].l));
dp[li][]=min(dp[li][],dp[i][]+abs(seg[li].r-seg[i].l));
dp[ri][]=min(dp[ri][],dp[i][]+abs(seg[ri].l-seg[i].r));
dp[ri][]=min(dp[ri][],dp[i][]+abs(seg[ri].r-seg[i].r));
}
printf("%d\n",ans);
}
return ;
}

POJ 2374的更多相关文章

  1. POJ 2374 Fence Obstacle Course(线段树+动态规划)

    Fence Obstacle Course Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2524   Accepted:  ...

  2. POJ 2374 线段树建图+Dijkstra

    题意: 思路: 线段树+Dijkstra(要堆优化的) 线段树要支持打标记 一个栅栏 拆成两个点 :左和右 新加一个栅栏的时候 看看左端点有没有被覆盖过 如果有的话 就分别从覆盖的那条线段的左右向当前 ...

  3. ACM数据结构相关资料整理【未完成,待补充】

    在网上总是查不到很系统的练ACM需要学习的数据结构资料,于是参考看过的东西,自己整理了一份. 能力有限,欢迎大家指正补充. 分类主要参考<算法竞赛入门经典训练指南>(刘汝佳),山东大学数据 ...

  4. 【Homework】LCA&RMQ

    我校是神校,作业竟然选自POJ,难道不知道“珍爱生命 勿刷POJ”么? 所有注明模板题的我都十分傲娇地没有打,于是只打了6道题(其实模板题以前应该打过一部分但懒得找)(不过感觉我模板还是不够溜要找个时 ...

  5. $2019$ 暑期刷题记录1:(算法竞赛DP练习)

    $ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...

  6. poj 题目分类(1)

    poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. poj 动态规划题目列表及总结

    此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...

  9. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

随机推荐

  1. Java数据结构2——深入JCF

    Java集合框架(JCF)参考C++的STL实现的在日常Java开发工作很常用的数据结构容器,有技术追求的人除了要会简单使用JCF之外,也要知道其底层的实现机制,知道它是如何实现的,为什么这样实现.就 ...

  2. 学习XOR

    //f(x;W,c,w,b)=w*max{0, W*x+c}+b #include <iostream>#include <vector>#include <algori ...

  3. jsp页面动态展示list-使用<select>和<c:forEach>标签

    转自:https://blog.csdn.net/zhugewochuang/article/details/80276466 后台:搜索数据放入list,然后为这个list提供响应的get和set方 ...

  4. 初学jQuery之jQuery虚假购物车-------与真实数据无关

    初学者用jquery来写仿真的购物车,确实有点恶心,那我们今天就把这万恶的购物车剖析一下,来看看到底有什么难的. 购物车的效果图 那我们先从复选框开始吧,废话不多说,上代码!! 带有序号的,都是一些分 ...

  5. 表单校验插件(bootstrap-validator)

    表单校验插件(bootstrap-validator) 参考文档 http://blog.csdn.net/nazhidao/article/details/51542508 http://blog. ...

  6. PHP获取远程和本地文件信息(汇总)

    1.PHP filesize() 函数filesize() 函数返回指定文件的大小.若成功,则返回文件大小的字节数.若失败,则返回 false 并生成一条 E_WARNING 级的错误. 但是只能获取 ...

  7. span标签对于margin-top,margin-bottom无效,但是margin-left,margin-right却是有效的。

    首先,span是行内元素,是没有宽高的. 我们来做个简单的布局 <div> <span>内容内容内容内容内容内容内容内容</span> </div> 页 ...

  8. animation与transition的简单讲述

    CSS动画分为两大组成部分:transition和animation 在CSS 3引入Transition(过渡)这个概念之前,CSS是没有时间轴的.也就是说,所有的状态变化,都是即时完成. tran ...

  9. GitHub上fork别人打代码后如何保持和原作者同步的更新

    1.进入你的GitHub发起Pull  request 2.选择compare across  forks 3.反向操作.base fork改为自己的,head fork改为原作者的 4.点击 cre ...

  10. for 循环 乘法口诀表

    用for循环写乘法口诀表: for(var i = 1; i <= 9; i++) { var c=''; for(var x = 1; x <= i; x++) {    c=c+x+' ...