题目戳这里

首先我们对坐标进行离散化,有用的点就变成了\(O(N)\)个。我们假设\(A\)点\(B\)的右边(从\(A\)往\(B\)跑和从\(B\)往\(A\)跑等价),然后我们很容易发现不会往左跑。于是我们就可以dp了。我们用\(f[i][j]\)表示\(A\)到\((i,j)\)的最小代价(\((i,j)\)是离散后的坐标),然后我们很容易得到dp方程。

\[f[i][j] = \min \{ f[i-1][j]+Tx[i-1][j] \times (x[i]-x[i-1]),\\f[i][j+1]+Ty[i][j] \times (y[j+1]-y[j]),f[i][j-1]+Ty[i][j-1]+(y[j]-y[j-1]) \}
\]

其中\(Tx[i][j]\)表示从\((i,j)\)走到\((i+1,j)\)走一个单位所需要的时间,\(Ty[i][j]\)表示从\((i,j)\)走到\((i,j+1)\)一个单位所需要的时间。这个我们可以预处理出来(大致就是看这中间有没有点在矩形的边界或中间)。

然后若\(B\)在\(A\)下方,则还可能只向下向左向右走。我们可以旋转坐标,就跟上面的一样处理了。

#include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; typedef long long ll;
const int maxn = 2010; const ll inf = 1LL<<60;
int Xa,Ya,Xb,Yb,N,totx,toty,bacx[maxn],bacy[maxn],in[maxn][maxn],Lb[maxn][maxn],Db[maxn][maxn];
ll f[maxn][maxn],Tx[maxn][maxn],Ty[maxn][maxn],ans; inline int gi()
{
char ch; int ret = 0,f = 1;
do ch = getchar(); while (!(ch >= '0'&&ch <= '9')&&ch != '-');
if (ch == '-') f = -1,ch = getchar();
do ret = ret*10+ch-'0',ch = getchar(); while (ch >= '0'&&ch <= '9');
return ret*f;
} struct Node
{
int X1,Y1,X2,Y2,T;
inline void read()
{
bacx[++totx] = X1 = gi(); bacy[++toty] = Y1 = gi();
bacx[++totx] = X2 = gi(); bacy[++toty] = Y2 = gi();
T = gi();
}
inline void convert() { swap(X1,Y1); swap(X2,Y2); }
}rec[maxn]; inline int find(int arr[],int r,int key)
{
int l = 1,mid;
while (l <= r)
{
mid = (l+r) >> 1;
if (arr[mid] < key) l = mid+1;
else r = mid-1;
}
return l;
} inline void work(int xx[],int tx,int yy[],int ty)
{
for (int i = 1;i <= tx;++i) for (int j = 1;j <= ty;++j) Lb[i][j] = Db[i][j] = in[i][j] = 0;
for (int i = 1;i <= N;++i)
{
int pX1 = find(xx,tx,rec[i].X1),pX2 = find(xx,tx,rec[i].X2);
int pY1 = find(yy,ty,rec[i].Y1),pY2 = find(yy,ty,rec[i].Y2);
for (int j = pX1+1;j < pX2;++j)
for (int k = pY1+1;k < pY2;++k) in[j][k] = i;
for (int k = pY1+1;k < pY2;++k) Lb[pX1][k] = i;
for (int j = pX1+1;j < pX2;++j) Db[j][pY1] = i;
}
for (int i = 1;i <= tx;++i)
for (int j = 1;j <= ty;++j)
{
if (i < tx)
{
Tx[i][j] = 10;
if (in[i][j]) Tx[i][j] = rec[in[i][j]].T;
else if (in[i+1][j]) Tx[i][j] = rec[in[i+1][j]].T;
else if (Lb[i][j]) Tx[i][j] = rec[Lb[i][j]].T;
}
if (j < ty)
{
Ty[i][j] = 10;
if (in[i][j]) Ty[i][j] = rec[in[i][j]].T;
else if (in[i][j+1]) Ty[i][j] = rec[in[i][j+1]].T;
else if (Db[i][j]) Ty[i][j] = rec[Db[i][j]].T;
}
}
if (Xa > Xb) swap(Xa,Xb),swap(Ya,Yb); for (int i = 1;i <= tx;++i) for (int j = 1;j <= ty;++j) f[i][j] = inf;
f[find(xx,tx,Xa)][find(yy,ty,Ya)] = 0;
for (int i = 2;i <= tx;++i)
{
for (int j = 1;j <= ty;++j)
{
f[i][j] = min(f[i-1][j]+Tx[i-1][j]*(xx[i]-xx[i-1]),f[i][j]);
if (j > 1) f[i][j] = min(f[i][j],f[i][j-1]+Ty[i][j-1]*(yy[j]-yy[j-1]));
}
for (int j = ty;j;--j) if (j < ty) f[i][j] = min(f[i][j],f[i][j+1]+Ty[i][j]*(yy[j+1]-yy[j]));
}
ans = min(ans,f[find(xx,tx,Xb)][find(yy,ty,Yb)]);
} int main()
{
freopen("4374.in","r",stdin);
freopen("4374.out","w",stdout);
while (scanf("%d %d %d %d",&Xa,&Ya,&Xb,&Yb) != EOF)
{
totx = toty = 0; N = gi(); ans = inf;
bacx[++totx] = Xa; bacx[++totx] = Xb;
bacy[++toty] = Ya; bacy[++toty] = Yb;
for (int i = 1;i <= N;++i) rec[i].read(); sort(bacx+1,bacx+totx+1); sort(bacy+1,bacy+toty+1);
totx = unique(bacx+1,bacx+totx+1)-bacx-1; toty = unique(bacy+1,bacy+toty+1)-bacy-1; work(bacx,totx,bacy,toty); swap(Xa,Ya); swap(Xb,Yb);
for (int i = 1;i <= N;++i) rec[i].convert();
work(bacy,toty,bacx,totx);
cout << ans << endl;
}
fclose(stdin); fclose(stdout);
return 0;
}

UVALive4374 Drive through MegaCity的更多相关文章

  1. AHCI: Failed to attach drive to Port1 (VERR_GENERAL_FAILURE).

    在mac操作系统下,安装VirtualBoxVm虚拟机,虚拟机里面安装wind7操作系统.在启动虚拟机的时候报错:AHCI: Failed to attach drive to Port1 (VERR ...

  2. vmware安装win7提示No CD-ROM drive to use:GCDROM not loaded

    今天安装win7 64位的操作系统到vmware虚拟机,以为一切事如此的简单,因为自己以前经常拿vmware来装系统,结果确出现下面莫名其妙的错误: 提示说没有CD-ROM,可是我明明在vmware的 ...

  3. Ignite 配置更新Oracle JDBC Drive

           如果使用Oracle 12C 作为Ignite 的Repository的话,在Repository Createion Wizard的配置过程中,会出现ORA-28040:No matc ...

  4. 网盘的选择,百度网盘、google drive 还是 Dropbox

    我是国内用户,需要越过Chinawall 我使用的是一枝红杏,用着还行 如果要买,结账时输入'laod80' 一枝红杏官网:官网地址 Dropbox: 稳定,速度快 Dropbox官网:链接 操作十分 ...

  5. UEFI Bootable USB Flash Drive - Create in Windows(WIN7 WIN8)

    How to Create a Bootable UEFI USB Flash Drive for Installing Windows 7, Windows 8, or Windows 8.1 In ...

  6. Create a SQL Server Database on a network shared drive

    (原文地址:http://blogs.msdn.com/b/varund/archive/2010/09/02/create-a-sql-server-database-on-a-network-sh ...

  7. 【转】Expire Google Drive Files 让Google Docs云盘共享连接在指定时间后自动失效

    最近在清理Google Docs中之前共享过的文件链接,发现Google Docs多人协作共享过的链接会一直存在,在实际操作中较不灵活.正好订阅的RSS推送了Pseric写的这篇文章 - Expire ...

  8. vs2010 A selected drive is no longer valid

    visual studio 2010重新安装添加组件,报A selected drive is no longer valid错误. 这个是由于已经安装了sp1,此时需要将sp1卸载掉,然后就可以安装 ...

  9. 24.编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。

    package zhongqiuzuoye; public class Car { String brand; public void drive() {} } package zhongqiuzuo ...

随机推荐

  1. mybatis两级缓存原理剖析

    https://blog.csdn.net/zhurhyme/article/details/81064108 对于mybatis的缓存认识一直有一个误区,所以今天写一篇文章帮自己订正一下.mybat ...

  2. OpenLDAP部署目录服务

        文档信息 目        的:搭建一套完整的OpenLDAP系统,实现账号的统一管理.                     1:OpenLDAP服务端的搭建               ...

  3. python__基础 : 类的 __slots__ 方法

    实例在创建出来之后,可以动态的添加属性和方法, 那如果想要限制添加的实例属性,可以用一下 __slots__ 这个东西: class Test(object): __slots__ = ('name' ...

  4. datetime模块及time模块

    pyhton的datetime模块分析(小女子的测试之路):https://www.cnblogs.com/cindy-cindy/p/6720196.html python时间模块小结(time a ...

  5. Hacker Cups and Balls Gym - 101234A 二分+线段树

    题目:题目链接 题意:有编号从1到n的n个球和n个杯子. 每一个杯子里有一个球, 进行m次排序操作,每次操作给出l,r. 如果l<r,将[l,r]范围内的球按升序排序, 否则降序排, 问中间位置 ...

  6. [Codeforces375D]Tree and Queries(莫队算法)

    题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...

  7. P2158 [SDOI2008]仪仗队 欧拉函数模板

    题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...

  8. 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

    上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析Demo”啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货 ...

  9. Android面试收集录13 Android虚拟机及编译过程

    一.什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...

  10. 9,Flask 中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西,在Flask中的蓝图 blueprint 也是非常宏伟的,它的作用就是将 功能 与 主服务 分开. 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的 ...