Agc019_C Fountain Walk
题目大意
给定网格图上起点和终点每个格子是长为$100$米的正方形,你可以沿着线走。
平面上还有若干个关键点,以每个关键点为圆心,$10$为半径画圆,表示不能进入圆内的线,但是可以从圆周上走,求起点到终点的最短距离。
保证任意两个关键点不在同一条水平或竖直的线上。
题解
先通过翻转网格图使得起点$S$在终点$Y$的左下方,由于有任意两两关键点不在同一水平竖直的线上,通过简单计算发现,我们只可能往右或往上冲着最终的终点走。
随意我们只需要横纵坐标都在起点终点之间的关键点即可。
对于一个关键点,如果经过它转$90°$,那么路程的长度就会减少,如果绕过半圆继续直走,那么路程长度就会增加。
我们贪心取关键点。由于起点在左下方,终点在右上方,每次向右上方走,那么最终经过的关键点一定是一个上升的序列。
我们只需要求这个上升的序列的长度即可。
答案等于起点终点的曼哈顿距离$-$经过关键点的数量$\times$绕$90$度省去的路程。
注意,当最长上升子序列的长度达到$\min\{Y_T-Y_S+1,X_T-X_S+1\}$时,说明至少绕过一个关键点的半圆,需要特判。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 200020
using namespace std;
namespace IO{
const int BS=(1<<20)+5; int Top=0;
char Buffer[BS],OT[BS],*OS=OT,*HD,*TL,SS[20]; const char *fin=OT+BS-1;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);} return (HD==TL)?EOF:*HD++;}
void flush(){fwrite(OT,1,OS-OT,stdout);}
void Putchar(char c){*OS++ =c;if(OS==fin)flush(),OS=OT;}
void write(int x){
if(!x){Putchar('0');return;} if(x<0) x=-x,Putchar('-');
while(x) SS[++Top]=x%10,x/=10;
while(Top) Putchar(SS[Top]+'0'),--Top;
}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
}
using namespace IO;
const double D=11.4159265358979323846264338328;
const double K=-4.2920367320510338076867830836;
int n,m,maxy,sx,sy,ex,ey,tot,c[M],pos[M],now; double ans;
struct pot{
int X,Y; void gtin(){X=read(),Y=read(),maxy=max(maxy,Y+1);}
bool ft(){return X>=sx&&X<=ex&&Y>=sy&&Y<=ey;}
bool operator <(const pot&ot)const{return X<ot.X;}
}p[M],t[M];
int main(){
sx=read(),sy=read(),ex=read(),ey=read(),maxy=max(sy,ey);
if(sx>ex) swap(sx,ex),swap(sy,ey); n=read();
for(int i=1;i<=n;i++) p[i].gtin();
if(sy>ey){
for(int i=1;i<=n;i++) p[i].Y=maxy-p[i].Y;
sy=maxy-sy,ey=maxy-ey;
} sort(p+1,p+n+1),ans=(ey+ex-sy-sx)*100.0;
for(int i=1;i<=n;i++) if(p[i].ft()) t[++tot]=p[i];
memset(c,0x3f,sizeof(c)),c[0]=now=0;
for(int i=1;i<=tot;i++){
int l=1,r=now,md,res=0;
while(l<=r){md=((r+l)>>1);if(c[md]<t[i].Y) res=md,l=md+1;else r=md-1;}
if(res==now) now++; c[res+1]=min(c[res+1],t[i].Y);
}
if(now<=ex-sx&&now<=ey-sy) ans+=now*K;
else ans+=(now-1)*K+D; printf("%.13lf\n",ans);
return 0;
}
Agc019_C Fountain Walk的更多相关文章
- [AtCoder 2702]Fountain Walk - LIS
Problem Statement In the city of Nevermore, there are 108 streets and 108 avenues, both numbered fro ...
- 【agc019C】Fountain Walk
Portal --> agc019C Description 有一个\(10^8*10^8\)的网格图,一格距离为\(100\),第\(x\)条竖线和第\(y\)条横线的交点记为\((x,y)\ ...
- 【AtCoder】AGC019
A - Ice Tea Store 算一下每种零售最少的钱就行,然后优先买2,零头买1 #include <bits/stdc++.h> #define fi first #define ...
- python os.walk()
os.walk()返回三个参数:os.walk(dirpath,dirnames,filenames) for dirpath,dirnames,filenames in os.walk(): 返回d ...
- LYDSY模拟赛day1 Walk
/* 依旧考虑新增 2^20 个点. i 只需要向 i 去掉某一位的 1 的点连边. 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可. ...
- How Google TestsSoftware - Crawl, walk, run.
One of the key ways Google achievesgood results with fewer testers than many companies is that we ra ...
- poj[3093]Margaritas On River Walk
Description One of the more popular activities in San Antonio is to enjoy margaritas in the park alo ...
- os.walk()
os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. walk()方法语法格式如下: os.walk(top[, topdown=True[, onerror=None[ ...
- 精品素材:WALK & RIDE 单页网站模板下载
今天,很高兴能向大家分享一个响应式的,简约风格的 HTML5 单页网站模板.Walk & Ride 这款单页网站模板是现代风格的网页模板,简洁干净,像素完美,特别适合用于推广移动 APP 应用 ...
随机推荐
- Android:日常学习笔记(9)———探究广播机制
Android:日常学习笔记(9)———探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 In ...
- Owncloud-X安装配置
系统是基于Centos7.2 1.更改yum源: mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...
- $ 用python处理Excel文档(1)——用xlrd模块读取xls/xlsx文档
本文主要介绍xlrd模块读取Excel文档的基本用法,并以一个GDP数据的文档为例来进行操作. 1. 准备工作: 1. 安装xlrd:pip install xlrd 2. 准备数据集:从网上找到的1 ...
- [原创]spring及springmvc精简版--AOP
接上一篇:[原创]spring及springmvc精简版--IOC 理解AOP.java是一种面向对象的语言.而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配. 经典例子 ...
- comet4j开发指南
http://blog.csdn.net/majian_1987/article/details/8489738 好多朋友反映,因排版问题,文章部分边缘内容无法查看.尝试过排版,但仍无法显示正常,所以 ...
- 正则表达式----grep
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. grep [参数] 匹配条件 路径 参数 : -n :显示行号 ...
- [POI2008]账本BBB
题目 BZOJ 做法 明确: \(~~~1.\)为了达到目标分数所取反的次数是固定的 \(~~~2.\)为了满足前缀非负,得增加取反和滚动次数 滚动的次数可以枚举,增加的取反可以通过最小前缀和得到 滚 ...
- 20145231《Java程序设计》第二次实验报告
实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD: 理解并掌握面向对象三要素: 初步掌握UML建模: 熟悉S.O.L.I.D原则: 了解设计模式: 实验要求 实现并体会例子中代码的 ...
- 斯坦福机器学习视频笔记 Week6 关于机器学习的建议 Advice for Applying Machine Learning
我们将学习如何系统地提升机器学习算法,告诉你学习算法何时做得不好,并描述如何'调试'你的学习算法和提高其性能的“最佳实践”.要优化机器学习算法,需要先了解可以在哪里做最大的改进. 我们将讨论如何理解具 ...
- 服务器Windows 2008 R2 安装SQL 2008 R2
在站点下载 SQL 2008 R2 在安装数据库之前首先安装IIS和.NET 3.5 解压 找到运行程序 (这里需要修改路径,数据库一般不要安装在系统盘) (选择任何一个都可以,这里选择system ...