题目链接:Oil

  感觉同时几线作战有点吃不消啊……

  这道题有一个显然的结论,那就是最优的直线一定过某条线段的端点。

  仔细想想很有道理。如果最终的直线没有过线段的端点的话,那么这条直线就一定可以平移,直到过端点为止。

  于是我们可以枚举直线上的一个点,由于直线不能与线段平行,那么与枚举的点纵坐标不同的线段就对应着一个斜率区间。于是这个问题就转化成了一个经典问题:有$n$个区间,第$i$个区间$[l_i,r_i]$会给区间内的所有位置(可以不是整数)加上一个权值$c_i$,求最后所有位置中最大的权值。这个问题解法很简单,就是把每个区间拆成两个点,然后从左往右扫,扫到左端点就加上权值,扫到右端点就减去权值,取个$\max$即可。

  还有一点小优化:枚举点的时候不必枚举所有端点,可以只枚举所有左端点(或者右端点)。因为如果最终的直线不过任何线段的左端点的话,那么一定可往左平移到过一个左端点为止。

  还有计算斜率的时候由于可能会有斜率不存在的情况,可以把斜率式中的$x$、$y$互换一下,方便计算。

  下面贴代码(自带巨大常数):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define N 2010
#define eps (1e-8) using namespace std;
typedef double llg; struct data{
int x,y;
}l[N],r[N],a[N];
struct dato{
llg l,r;int c;
}s[N],sl[N],sr[N];
int n,ans,ls,ld;
llg d[N<<1]; bool cmpl(dato a,dato b){return a.l<b.l;}
bool cmpr(dato a,dato b){return a.r<b.r;} int main(){
File("a");
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d %d",&l[i].x,&r[i].x,&r[i].y); l[i].y=r[i].y;
if(l[i].x>r[i].x) swap(l[i],r[i]); a[i]=l[i];
d[++ld]=l[i].x,d[++ld]=r[i].x;
ans=max(ans,r[i].x-l[i].x);
}
for(int i=1,id,now;i<=n;i++){
ls=ld=0; id=(i-1)%n+1;
for(int j=1;j<=n;j++)
if(l[j].y!=a[i].y){
ls++; s[ls].c=r[j].x-l[j].x;
s[ls].l=(llg)(l[j].x-a[i].x)/(llg)(l[j].y-a[i].y);
s[ls].r=(llg)(r[j].x-a[i].x)/(llg)(r[j].y-a[i].y);
if(s[ls].l>s[ls].r) swap(s[ls].l,s[ls].r);
}
if(ls){
now=r[id].x-l[id].x;
for(int i=1;i<=ls;i++) d[++ld]=s[i].l,d[++ld]=s[i].r,sl[i]=sr[i]=s[i];
sort(d+1,d+ld+1); ld=unique(d+1,d+ld+1)-d-1;
sort(sl+1,sl+ls+1,cmpl); sort(sr+1,sr+ls+1,cmpr);
for(int i=1,zl=1,zr=1;i<=ld;i++){
while(zl<=ls && d[i]==sl[zl].l) now+=sl[zl++].c;
ans=max(ans,now);
while(zr<=ls && d[i]==sr[zr].r) now-=sr[zr++].c;
}
}
}
printf("%d",ans);
return 0;
}

BZOJ 4614 【Wf2016】 Oil的更多相关文章

  1. BZOJ 1854 【Scoi2010】 游戏

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...

  2. BZOJ 1303 【CQOI2009】中位数图

    baidu了一下bzoj水题列表...找到这道题.   题目大意:给定一个数t,在给定的一段包含1-n的序列中找出多少个长度为奇数子序列的中位数为t. 第一眼没看数据范围,于是开心的打了一个O(n^3 ...

  3. 【BZOJ】【1177】【APIO2009】Oil

    DP 找出三个正方形,可以转化为将整个油田切成三个矩形块,每块中各找一个正方形区域,切的形式只有6种,分类更新ans即可 题解:http://trinklee.blog.163.com/blog/st ...

  4. BZOJ 1853 【Scoi2010】 幸运数字

    Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认 为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,8 ...

  5. BZOJ 1026 【SCOI2009】 windy数

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? I ...

  6. BZOJ 3669 【NOI2014】 魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  7. UOJ#58/BZOJ 3052【WC2013】糖果公园

    好写好调的莫队算法,就算上树了仍然好写好调. 传送门 http://uoj.ac/problem/58 简要做法 将树按照dfs序分块,然后将询问按照(u所在块,v所在块,时间)作为关键字进行排序,依 ...

  8. 洛谷 P2634 BZOJ 2152 【模板】点分治(聪聪可可)

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  9. BZOJ 1096 【ZJOI2007】 仓库建设

    Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天, ...

随机推荐

  1. niginx代理配置

    常用关键词:rewrite.proxy_pass location ^~ /address/ { proxy_set_header Host xx.sohu.com; #设置header proxy_ ...

  2. Rafy 框架 - 幽灵插件(假删除)

      Rafy 框架又添新成员:幽灵插件.本文将解释该插件的场景.使用方法.原理.   场景 在开发各类数据库应用系统时,往往需要在删除数据时不是真正地删除数据,而只是把数据标识为'已删除'状态.这些数 ...

  3. 针对每种Windows Server 操作Excel、Word等Office组件遇到“ComException"、”80070005“等COM错误的解决方案大汇总

    以下所有Excel错误的解决方案,同样适用于Word.PowerPoint等Office产品. 以下解决方案中,如果出现"安装Excel组件",是适用于遇到Excel错误的.如果是 ...

  4. window下使用Redis Cluster部署Redis集群

    日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...

  5. EnumHelper.cs枚举助手(枚举描述信息多语言支持)C#

    C#里面经常会用到枚举类型,枚举是值类型对象,如果你想用枚举类型的多属性特性,或者你想在MVC页面上通过简单的值类型转换,将某字段值所代表的含义转换为文字显示,这时候必须要将枚举扩展,是它支持文本描述 ...

  6. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引

    索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(1)搭建MVC环境 注册区域 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(2)创建 ...

  7. C++ map的基本操作和使用

    原文地址:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可 ...

  8. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  9. GJM : Unity3D HIAR 目录导航

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  10. 摆脱DOM操作,从TodoMVC看angularJS

    取代jQuery? 我很久之前便听说了angularJS的大名,之前的leader也经常感叹angularJS的设计如何如何精妙,可叹一直没有机会深入了解,国庆长假因为没钱出游,倒是可以对他做一个了解 ...