本文版权归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. 手把手教你编译安装MariaDB

    MariaDB是什么? MariaDB是MySQL的一个分支,由于Oracle有可能对MySQL闭源,所以分离了出来(MySQL先后被Sun.Oracle收购). 但是除了作为一个Mysql的&quo ...

  2. W3School-CSS 分类 (Classification) 实例

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

  3. Start Instance 操作详解 - 每天5分钟玩转 OpenStack(31)

    本节通过日志文件详细分析 instance start 操作. 下面是 start instance 的流程图 向 nova-api 发送请求 nova-api 发送消息 nova-compute 执 ...

  4. android 让一个Activity停留几秒后再跳转

    有时候我们需要在某个 Activity 停留几秒种,然后再跳到下一个 Activity.那么这个怎么实现呢? 一个方法是可以使用 Thread 的 sleep 函数,这个我们在 用Handler实现线 ...

  5. python 多线程实例

    #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): ...

  6. openwrt 安装 ser2net 配置

    //--- openwrt中的ipk应用 opkg install /tmp/ser2net_2.7-2_brcm63xx.ipk 看到安装成功的信息后启动ser2net Ser2net –c /et ...

  7. sql server 2012 数据引擎任务调度算法解析(下)

    上次我们说到,sql server 2012的企业版的任务调度流程,一直到给新连接分配了scheduler,都是与以前的版本算法是一致的,只有在进行任务分配的时候,算法才有了细微的调整. 新算法的目的 ...

  8. RedHat6.2搭建FTP服务器

    我的环境: A:Red Hat Enterprise 6.2 IP:192.168.16.12 此机作测试端 B:Red Hat Enterprise 6.2 IP:192.168.16.13 此机做 ...

  9. shell中export理解误区

    一直以来,以为shell脚本中经过export后的变量会影响到执行这个shell的终端中的环境变量.环境变量这个概念不是shell所独有的,而是linux里面进程所拥有的,shell解释器运行起来就是 ...

  10. 推荐一些python Beautiful Soup学习网址

    前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多 ...