BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3076
https://www.luogu.org/problemnew/show/P3081#sub
有N(1 <= N <= 100,000)座小山,每座山所占的区域用直线(x1, y1) 到 (x2, y2)来表示(x1 < x2 并且 y1 < y2)。也就是说这些山用笛卡尔坐标系里的线段来表示,这些用于表示小山的线段都没有任何交点,第一座山的一端位于(x1, y1) = (0,0)
贝西从(0,0)开始在第一座山上漫步,一旦贝西到了一座山,她会一直走到该山的终点,这时,她会从边缘处起跳,如果她降落到另一座山上,她会继续在新的山上漫步。贝西起跳后沿y轴方向下落,如果贝西不能降落到一座山上,她会一直下落,直到到达y轴的负无穷大位置(y = -infinity)。
每座用线段表示的山 (x1, y1) -> (x2, y2)包含(x1, y1)这个点,但不包含(x2, y2) ,请计算出贝西总共在多少座山上漫步了。
……这道题网上几乎没找到题解……所以是参考了标程的(我也看不懂英文啊……)
首先说一下解题思路:我们显然要走一遍线段,并且在掉落的时候以O(logn)的速度查找到你应当掉落在那个线段上。那么复杂度就是O(nlogn)了。
显然的思路,我们记录当前走在了哪个线段,用set维护接下来**可能**走的线段,取出我们所要的线段即可。
(PS:“可能”指你所在的坐标的x在某个线段的x区间内)
走在了哪个线段没有难度,本代码的cur就是做这个的。
找接下来可能走的线段(并且及时剔除掉走过/不能走到的线段),扫描线即可解决。
那么这题的难点就在于我们如何排序(也就是set的比较方法)来取出我们所要的线段。
先画个图感性理解一下,黑点是我们所在的位置,编号就是我们排好序之后的编号。

(我们所在的位置是3,显然只需要跳到3-1=2的编号的那条边,我们就实现了走的动作。)
设比较的两条线段a,b,则分为两种情况:
1.ax2<bx2(eg:a=5,b=4或a=2,b=4):
我们把a的右端点和b的左端点连线,显然发现这条线段将这两条线划分开来,上面的线编号大,下面的线编号小。
2.ax2>bx2(eg:a=1,b=3或a=4,b=3):
同1的思路,其实只是把a和b颠倒而已。
我们可以通过斜率来比较两条线的位置。
(PPS:貌似可以两条线分别取一个不同方向的点连线貌似就可以,不必非得按照题解的连线方法)
(PPPS:可能有这种情况(举一个1的例子):

这时候我们只需要平移一下就好了。

所以用斜率判断是最准确的。)
————————————————————
一些小细节,比如说你已经在最下层线段没法在往下走时及时跳出
#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+;
inline int read(){
int X=,w=;char ch=;
while(ch<''||ch>''){if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<='')X=(X<<)+(X<<)+ch-'',ch=getchar();
return X*w;
}
struct edge{
int x1,x2,y1,y2,id;
bool operator <(edge const& a)const{
if(x2<a.x2){
return (ll)(y2-a.y1)*(ll)(a.x2-a.x1)<(ll)(a.y2-a.y1)*(ll)(x2-a.x1);
}else{
return (ll)(a.y2-y1)*(ll)(x2-x1)>(ll)(y2-y1)*(ll)(a.x2-x1);
}
}
}e[N];
struct event{
int x,y,id;
bool operator <(event const& a)const{
return x<a.x||(x==a.x&&y<a.y);
}
}f[*N];
set<edge>s;
set<edge>::iterator it1;
set<edge>::iterator it2;
int main(){
int n=read();
for(int i=;i<=n;i++){
e[i].x1=read();e[i].y1=read();
e[i].x2=read();e[i].y2=read();
e[i].id=i;
f[i*-].x=e[i].x1;f[i*].x=e[i].x2;
f[i*-].y=e[i].y1;f[i*].y=e[i].y2;
f[i*-].id=f[i*].id=i;
}
sort(f+,f+*n+);
s.insert(e[]);
int cur=,tot=;
for(int i=;i<=*n;i++){
event ev=f[i];
edge ed=e[ev.id];
if(ev.x==ed.x1)s.insert(ed);
else if(ev.id==cur){
it1=s.find(ed);
if(it1==s.begin())break;
it2=it1;--it2;
cur=it2->id;
s.erase(it1);
tot++;
}else s.erase(ed);
}
printf("%d\n",tot);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解的更多相关文章
- 【洛谷P3369】【模板】普通平衡树题解
[洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...
- 洛谷 P1992 不想兜圈的老爷爷 题解
洛谷 P1992 不想兜圈的老爷爷 题解 题目描述 一位年过古稀的老爷爷在乡间行走 而他不想兜圈子 因为那会使他昏沉 偶然路过小A发扬助人为乐优良传统 带上地图 想知道路况是否一定使他清醒 usqwe ...
- BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...
- 洛谷p3384【模板】树链剖分题解
洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...
- 洛谷 P1789 【Mc生存】插火把 题解
P1789 [Mc生存]插火把 题目背景 初一党应该都知道...... 题目描述 话说有一天 linyorson 在"我的世界"开了一个 \(n\times n(n\le 100) ...
- 洛谷P1066 2^k进制数(题解)(递推版)
https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...
- 洛谷P1373小a和uim大逃离题解
题目 这个题好坑啊,首先是他会卡空间,然后我们就只能把一种比较好理解的状态给舍弃,因为空间开不下,然而采用一种难理解的状态就是\(dp[i][j][l][0/1]\)表示\(i\),\(j\)位置,两 ...
- 洛谷 P1202 [USACO1.1]黑色星期五Friday the Thirteenth 题解
题目传送门 这道题暴力就能解决. #include<bits/stdc++.h> using namespace std; int xi; ,ans[]; int main() { int ...
- 洛谷 P2241统计方形(数据加强版) 题解
题目传送门 说是加强版,其实可以把棋盘那道题的代码粘过来(注意要开long long): #include<bits/stdc++.h> using namespace std; ,c; ...
随机推荐
- 使数据可供ArcGIS Server访问
内容来自ESRI官方文档(点击访问),简单总结如下: 1 ArcGIS Server用于发布服务的数据必须存储在服务器可以访问的位置: 2 这样的位置有三种类型: 本地路径:将数据本地存储在每台 Ar ...
- nginx支持php配置
location / { root /wwwroot/phptest; index index.html index.htm index.php; } location ~ \.(php|php5)$ ...
- python3 爬虫爬取深圳公租房轮候库(深圳房网)
深圳公租房轮候库已经朝着几十万人的规模前进了,这是截至16年10月之前的数据了,贴上来大家体会下 所以17年已更新妥妥的10W+ 今天就拿这个作为爬虫的练手项目 1.环境准备: 操作系统:win10 ...
- selenium--特殊元素定位
该篇博客总结特殊元素(select.radio\checkbox.时间控件.文件上传.图片验证码.模拟鼠标操作.Js 或 JQuery调用)操作. 1.select @Test public void ...
- PNG和PVR之间互相转换的脚本
项目经常会将png和pvr之间互相转换,这里mark一个脚本,会将当前目录下的文件全部批量转换 png转换成pvr @echo off path %path%;"C:\Program Fil ...
- 创新手机游戏《3L》开发点滴(1)——道具、物品、装备表设计
一.游戏物品/道具系统数据模型设计特点 为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统.于是丰富了游戏.取悦了玩家,哭了开发——道具/物品数据子系统是简单的.复杂的.不确定的: 简单 ...
- (转载)IE8+兼容经验小结
本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...
- 第十七次ScrumMeeting会议
第十七次Scrum Meeting 时间:2017/12/7 地点:线上+主235 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工作 ...
- UML设计(团队作业)
UML设计 一.团队信息 1.队名 读完文章再睡觉 2.团队成员的学号与姓名 学号 姓名 211606381 吴伟华(队长) 211606369 蔺皓雯 211606340 杨池宇 211606372 ...
- dataTables工作总结
近期在工作中用到了dataTables,现在总结一下在工作中遇到的问题以及解决方法,如有不妥之处希望多多指教,定会改进. 首先这里用的是coloradmin框架,在vs环境下开发. 这里写一个容器用于 ...