【BZOJ】栅栏-线段树优化DP

本文介绍了BZOJ3387题目,即奶牛通过栅栏障碍赛的最短水平距离问题。文章探讨了错误的解题思路,并详细阐述了利用线段树优化的动态规划解决方案,同时提及了Dijkstra算法作为另一种可能的解法。
摘要由CSDN通过智能技术生成

蒟蒻做了一天线段树,表示心态炸裂,从未想到线段树还有这么多操作(已狗带)。
传送门:BZOJ3387


题意

    Farmer John 为奶牛们设置了一个障碍赛。障碍赛中有n个(n≤50000)各种长度的栅栏,每个都与x轴平行,其中的第i个栅栏的y坐标为i。
    终点在坐标原点(0,0),起点在(s,n)。如下所示,×为终点,s为起点。
这里写图片描述
    奶牛们很笨拙,它们都是绕过栅栏而不是跳过去的。也就是说它们会沿着栅栏走直到走到栅栏头,然后向着x轴奔跑,直到碰到下一个栅栏拦住去路,然后再绕过去……
    求奶牛从起点到终点需要走的最短水平距离。


数据范围

n≤50000 |s|≤100000
-100000≤ai<bi≤100000,an≤s≤bn (ai,bi分别代表第i个栅栏的两个端点的横坐标)


题解

    本蒟蒻怎么可能会做?orzzzzz
    于是自己yy了一种方法,居然依靠水数据得了七十分。
    就是这样的愚蠢。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define INF 1e7
using namespace std;
const int N=5e4+10;
int n,s,ans;

struct P{
    int x;
    bool in;
}t[N<<2];
int fr,to;

inline int read()
{
    char c=getchar();int x=0,t=1;
    while(c<'0' || c>'9') {
  if(c=='-') t=-1;c=getchar();}
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值