本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000

作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

给定n条平行线段,每条线段的价值是它的长度。现在用一条直线贯穿最大价值的线段,求最大的价值。
N<=2000。
 

Input

第一行一个数n表示线段数。家下来n行每行三个数x0,x1和y,表示线段(x0,y)-(x1,y)。
|x0|,|x1|<=10^6,1<=y<=10^6。线段无交。

Output

输出最大的价值。

Sample Input

1
-100 180 20

Sample Output

280

正解:结论+搜索

解题报告:

  这道题很有意思,我开始也没想到那个结论。

  这道题有一个很有用的结论:最优解的直线必然是经过了某一条线段的端点。仔细想想就会发现其实很有道理,或者说显然?

  这样就很方便了,因为$n$只有$2000$,所以 $n^2$ 暴力即可。我不妨枚举一个端点,作为直线必然经过的那个端点,那么对于经过这个端点的直线,如果我想经过别的线段,显然可以通过作出别的线段的两个端点到这个点的斜率来得到一个可行的范围。假如直线斜率在这个范围内,这条线段就会产生贡献。我们得到了一个可行的做法:得到所有线段关于这个点的斜率得到若干个区间,之后扫一遍即可知道在什么时候能取到最大值了。但是有一些需要注意的地方:斜率有可能不存在,而且可能接近无限大。考虑到直线不能平行于线段,即斜率不能为$0$,我们不妨用斜率的倒数来维护上述操作,很容易发现,对于这道题来说,会减少很多计算而且方便很多,精度误差也小很多。

//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 2011;
const double eps = 1e-8;
int n,ans,tot;
struct node{int x0,x1,y,len;}a[MAXN];
struct seq{double k;int type;}b[MAXN*2];
inline bool cmp(seq q,seq qq){ return q.k<qq.k; }
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void solve(double x,double y){
int cnt=0;
for(int i=1;i<=n;i++) {
if(a[i].y==y) continue;
b[++cnt].k=(a[i].x0-x)/(a[i].y-y);
b[++cnt].k=(a[i].x1-x)/(a[i].y-y);
if(b[cnt].k>b[cnt-1].k) {
b[cnt-1].type=a[i].len;
b[cnt].type=-a[i].len;
b[cnt].k+=eps;
}
else{
b[cnt-1].type=-a[i].len;
b[cnt].type=a[i].len;
b[cnt-1].k+=eps;
}
}
sort(b+1,b+cnt+1,cmp);
for(int i=1;i<=cnt;i++) {
tot+=b[i].type;
if(tot>ans) ans=tot;
}
} inline void work(){
n=getint(); ans=0;
for(int i=1;i<=n;i++) {
a[i].x0=getint(),a[i].x1=getint(),a[i].y=getint();
if(a[i].x0>a[i].x1) swap(a[i].x0,a[i].x1);
a[i].len=a[i].x1-a[i].x0;
}
for(int i=1;i<=n;i++) {
tot=a[i].len; if(tot>ans) ans=tot;
solve(a[i].x0,a[i].y);
tot=a[i].len;
solve(a[i].x1,a[i].y);
}
printf("%d",ans);
} int main()
{
work();
return 0;
}

  

BZOJ4614 [Wf2016]Oil的更多相关文章

  1. BZOJ4614/UVA1742 Oil 计算几何

    传送门 题意:在平面直角坐标系中给出$N$条互不相交的.与$x$轴平行.且在$x$轴上方的线段,每一条线段的价值为其长度.求一条不与$x$轴平行的直线,使得与这条直线相交的线段的价值之和最大,求出这个 ...

  2. BZOJ 4614[Wf2016]Oil

    权限题鸭qwq 首先可以知道最优答案选出来的直线一定可以经过某条线段左端点,如果这条直线没有过左端点,可以通过平移和旋转等操作达到.所以可以枚举这条直线过了哪条线段的左端点,那么对于其他线段,能对答案 ...

  3. BZOJ4614 UVA1742 Oil 计算几何+搜索+扫描线

    正解:计算几何+搜索+扫描线 解题报告: 传送门 哇我是真的觉得这题很妙了!各个方面都很妙啊... 首先有一个很重要的结论:最优线一定可以通过各种变换(旋转/平移)使得经过一条线段的左端点(...并不 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ 4614 【Wf2016】 Oil

    题目链接:Oil 感觉同时几线作战有点吃不消啊-- 这道题有一个显然的结论,那就是最优的直线一定过某条线段的端点. 仔细想想很有道理.如果最终的直线没有过线段的端点的话,那么这条直线就一定可以平移,直 ...

  6. Oil Deposits

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. Oil Deposits(dfs)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  8. 2016HUAS暑假集训训练题 G - Oil Deposits

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  9. uva 572 oil deposits——yhx

    Oil Deposits  The GeoSurvComp geologic survey company is responsible for detecting underground oil d ...

随机推荐

  1. Ubuntu14.04 Django Mysql安装部署全过程

    Ubuntu14.04 Django Mysql安装部署全过程   一.简要步骤.(阿里云Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便 ...

  2. MVC学习系列5--Layout布局页和RenderSection的使用

    我们开发网站项目的时候,都会遇到这样的问题:就是页面怎么统一风格,有一致的外观,在之前ASP.NET的时代,我们有两种选择,一个是使用MasterPage页,一个是手动,自己在每个页面写CSS样式,但 ...

  3. 配置git同时push到两个远端库的简单方法

    最近在写一个开源的论坛系统,在发布代码时选择了github和coding这两个平台,我手懒,不想敲两次git push了,所以说突然有了一个很奇怪的需求:用一条git push同时push到两个远端代 ...

  4. W3School-CSS 外边距 (margin) 实例

    CSS 外边距 (margin) 实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS ...

  5. SQLSERVER中正则表达式封装使用

    封装好的正则表达式供SQLSERVER调用 打开数据库->可编程性->函数->标量值函数->新建标量值函数名 USE [数据库]GOSET ANSI_NULLS ONGOSET ...

  6. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  7. openstack-swift云存储部署(二)

    接上篇,swift-proxy和swift-store的安装 先说一下服务器分配 swift-proxy和keystone部署在192.168.25.11 swift-store是两台  分别是192 ...

  8. WPF 自定义雷达图

    自定义雷达图表如下: Git下载地址:https://github.com/Kybs0/RadarChartControl 1.创建UserControl,名为“RadarChartControl” ...

  9. EcmaScript相关文档

    ecmascript5.1中文文档 ECMAScript 6入门 JavaScript 标准参考教程 ECMAScript 5.1简介 ES5中新增的Array方法详细说明 firefox社区java ...

  10. 【WPF系列】-TextBox常用知识点

    DataBinding中更新数据源的时机   TextBox .Text 属性的默认 UpdateSourceTrigger 值为 LostFocus.这意味着如果应用程序的 TextBox 包含数据 ...