BZOJ4614/UVA1742 Oil 计算几何
传送门
题意:在平面直角坐标系中给出$N$条互不相交的、与$x$轴平行、且在$x$轴上方的线段,每一条线段的价值为其长度。求一条不与$x$轴平行的直线,使得与这条直线相交的线段的价值之和最大,求出这个和。$N \leq 2000 , -10^6 \leq \text{线段两端点横坐标} \leq 10^6 , 1 \leq \text{线段两端点纵坐标} \leq 10^6$
首先我们可以想到:必定存在一条最优的直线,它经过某一条线段的左端点和某条线段的右端点,因为如果某条最优的直线不满足这些性质,我们可以通过旋转和平移使其满足条件。基于上面的结论,我们可以很轻松地想到一种算法:枚举直线经过哪一条线段的左端点和哪一条线段的右端点,然后扫一遍所有的线段看其是否被该直线穿过。这样子的复杂度是$O(n^3)$的。
接着我们考虑优化。我们这样考虑:枚举直线经过其左端点的线段,那么某一条线段会产生贡献当且仅当直线的斜率在某一个区间之内。那么我们将所有线段的会产生贡献的区间算出来,问题就转化为了:给定若干区间,每个区间有权值,选择一个点使得包含这个点的区间的权值之和最大。这个问题可以利用尺取法:按照左端点从小到大加入区间,删除与新加入的区间不相交的区间,计算剩余的权值和。这种算法的复杂度就降为了$O(n^2logn)$
一个细节:为了避免区间不连续、斜率不存在的情况,我们可以计算每一个线段产生贡献时,直线斜率的倒数会落在哪一段区间$($我们认为直线的斜率不存在的时候,斜率的倒数为$0)$,这样每一个线段的贡献区间就是连续的,还可以在计算斜率时避免除$0$。
//一份常数极大的Code
#include<bits/stdc++.h>
#define ld long double
#define eps 1e-12
using namespace std;
inline int read(){
;
;
char c = getchar();
while(!isdigit(c)){
if(c == '-')
f = ;
c = getchar();
}
while(isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return f ? -a : a;
}
struct range{
ld l , r;
int ind;
}now[] , ano[];
][];
inline long long max(long long a , long long b){
return a > b ? a : b;
}
inline void swap(int &a , int &b){
int t = a;
a = b;
b = t;
}
inline void swap(ld &a , ld &b){
ld t = a;
a = b;
b = t;
}
bool cmp1(range l , range r){
return l.l < r.l;
}
bool cmp2(range l , range r){
return l.r < r.r;
}
inline ld calcK(int x1 , int y1 , int x2 , int y2){
return (ld)(x1 - x2) / (y1 - y2);
}
int main(){
int N;
while(scanf("%d" , &N) != EOF){
; i <= N ; i++){
num[i][] = read();
num[i][] = read();
num[i][] = read();
] < num[i][])
swap(num[i][] , num[i][]);
}
;
; i <= N ; i++){
;
; j <= N ; j++)
] != num[j][]){
now[++cnt].l = calcK(num[i][] , num[i][] , num[j][] , num[j][]);
now[cnt].r = calcK(num[i][] , num[i][] , num[j][] , num[j][]);
now[cnt].ind = j;
if(now[cnt].l > now[cnt].r)
swap(now[cnt].l , now[cnt].r);
now[cnt].l -= eps;
now[cnt].r += eps;
ano[cnt] = now[cnt];
}
sort(now + , now + cnt + , cmp1);
sort(ano + , ano + cnt + , cmp2);
;
] - num[i][];
maxN = max(maxN , ans);
; j <= cnt ; j++){
ans += num[now[j].ind][] - num[now[j].ind][];
while(ano[p].r < now[j].l){
ans -= num[ano[p].ind][] - num[ano[p].ind][];
++p;
}
maxN = max(maxN , ans);
}
}
printf("%lld\n" , maxN);
}
;
}
BZOJ4614/UVA1742 Oil 计算几何的更多相关文章
- BZOJ4614 UVA1742 Oil 计算几何+搜索+扫描线
正解:计算几何+搜索+扫描线 解题报告: 传送门 哇我是真的觉得这题很妙了!各个方面都很妙啊... 首先有一个很重要的结论:最优线一定可以通过各种变换(旋转/平移)使得经过一条线段的左端点(...并不 ...
- BZOJ4614 [Wf2016]Oil
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- HDU5033 building 单调栈+计算几何
正解:单调栈 解题报告: 哇生气辽QAQ本来打了半天feel good都快调出来了然后说换题了QAQ(所以可能那题的代码会过一阵子再放上来了QAQ 不过还是大爆手速打了一通拿到首杀了嘻嘻 美滋滋辽 然 ...
- BZOJ 4614 【Wf2016】 Oil
题目链接:Oil 感觉同时几线作战有点吃不消啊-- 这道题有一个显然的结论,那就是最优的直线一定过某条线段的端点. 仔细想想很有道理.如果最终的直线没有过线段的端点的话,那么这条直线就一定可以平移,直 ...
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- ACM 计算几何中的精度问题(转)
http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...
- Oil Deposits
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- hdu 2393:Higher Math(计算几何,水题)
Higher Math Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- Sql Server 向上取整、向下取整、四舍五入取整
==================================================== [四舍五入取整截取] select round(55.56,0) ============== ...
- Salesforce自定义权限简介
自定义权限(Custom Permission) Salesforce默认提供了多种方式设定用户的权限,比如简档.权限集等.在这些设定中,已经包括了系统中的对象.应用.字段.页面布局等组件,管理员或开 ...
- 商业智能BI-基础理论知识总结 ZT
因为要加入一个BI项目,所以最近在研究BI相关的知识体系,由于这个方面的知识都是比较零散,开始都很多概念,不知道从何入手,网上找的资料也不多,特别是实战案例方面更少,这里还是先把理论知识理解下吧,分享 ...
- 《ASP.NET MVC企业实战》(二) MVC开发前奏
在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性. ...
- sql server 数据导出(入)方法总结
我们都知道日常在面对数据需求时需要导出数据,比较少量的数据导出我们一般是通过查询后另存即可,当面对数据量比较大的时候我们应该怎么处理?我搜索总结一些几个方法:1.bcp 导出.2.数据库本身自带的导入 ...
- Spring Boot 使用 ServletFileUpload上传文件失败,upload.parseRequest(request)为空
使用Apache Commons FileUpload组件上传文件时总是返回null,调试发现ServletFileUpload对象为空,在Spring Boot中有默认的文件上传组件,在使用Serv ...
- 【待完成】[MapReduce_9] MapReduce 的 Shuffle 机制
0. 说明 待补充...
- 系统运维|SqlServer2008|数据库日志文件过大需要清理的操作攻略
摘要: 1.执行SQL语句改成“简单模式” 2.收缩数据库 3.执行SQL语句改回“完全模式” 原文链接: http://www.lookdaima.com/WebForms/WebPages/B ...
- python基础、字符串和if条件语句,while循环,跳出循环、结束循环
一:Python基础 1.文件后缀名: .py 2.Python2中读中文要在文件头写: -*-coding:utf8-*- 3.input用法 n为变量,代指某一变化的值 n = inpu ...
- SQL2008 一直error40 无法连接到localhost
1. Problem 2. Reason 可能是之前卸载SQL Server时没卸载干净 后来又重新安装时导致默认实例名不能用 就随手写了个SQLMOLORY实例名 但其实系统内这时是有两个SQL实例 ...