BZOJ4614 UVA1742 Oil 计算几何+搜索+扫描线
正解:差分
解题报告:
一个结论:最优解一定可以通过各种变换(旋转/平移)使得经过一条线段的左端点(很显然的亚子$QwQ$
(噢似乎是可以证明一定存在最优解经过左端点和右端点,,,?虽然但是并没啥用而且感觉虽然很对但是不懂正确性的亚子就不管了$/kel$
然后看到数据范围$\leq 300$,就直接枚举是经过哪个线段的左端点呗
然后怎么算这个线呢?最傻逼的方法当然就再枚下经过哪条线然后算下能经过哪些线算一下$balabala$的,不详细港了反正是$T$的
考虑算斜率
显然如果固定了一个端点之后每条线段就可以化成一个斜率的区间,然后这题就变成了给你一些区间每个区间有一个权值问哪个点的权值之和最大是趴
考虑差分,在左端点加上权值右端点减去权值,取个$max$就成.
对了,我开始一直没有理解...我说为什么要$+eps$???毫无意义的趴???然后就去问了托腮腮(原来托腮那时候就那么强了嘛$/kel$
然后学到了,就是说,因为可能出现玄学误差趴,比如可能三点共线的时候除法算出来是不相同的斜率了
为了防止这种玄学事件,我们一般就,$+eps$(高斯消元里面也有啊,为了防止玄学误差所以判断不是相等而是$\leq eps$嘛
好滴学到了,以后做这种可能存在精度误差的题目都要注意$eps$这个东西鸭,$over$
#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i) const int N=+;
int n,tot,ans;
double eps=1e-;
struct ed{int x1,x2,y,len;}a[N];
struct xl{double k;int len;}b[N<<]; inline int read()
{
char ch=getchar();int x=;bool y=;
while(ch!='-' && (ch<'' || ch>''))ch=getchar();
if(ch=='-')y=,ch=getchar();
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline bool cmp(xl x,xl y){return x.k<y.k;}
inline void dfs(int x,int y)
{
int cnt=;
rp(i,,n)
{
if(a[i].y!=y)
{
b[++cnt].k=(double)(a[i].x1-x)/(a[i].y-y);b[++cnt].k=(double)(a[i].x2-x)/(a[i].y-y);
if(b[cnt].k>b[cnt-].k){b[cnt-].len=a[i].len;b[cnt].len=-a[i].len;b[cnt].k+=eps;}
else{b[cnt].len=a[i].len;b[cnt-].len=-a[i].len;b[cnt-].k+=eps;}
}
}
sort(b+,b+cnt+,cmp);
rp(i,,cnt)tot+=b[i].len,ans=max(ans,tot);
} int main()
{
while(~scanf("%d",&n))
{
ans=;
rp(i,,n){a[i].x1=read(),a[i].x2=read(),a[i].y=read();if(a[i].x1>a[i].x2)swap(a[i].x1,a[i].x2);a[i].len=a[i].x2-a[i].x1;}
rp(i,,n){tot=a[i].len;ans=max(tot,ans);dfs(a[i].x1,a[i].y);}
printf("%d\n",ans);
}
return ;
}
哇我真滴觉得!这个方法!太太太妙了!
BZOJ4614 UVA1742 Oil 计算几何+搜索+扫描线的更多相关文章
- BZOJ4614/UVA1742 Oil 计算几何
传送门 题意:在平面直角坐标系中给出$N$条互不相交的.与$x$轴平行.且在$x$轴上方的线段,每一条线段的价值为其长度.求一条不与$x$轴平行的直线,使得与这条直线相交的线段的价值之和最大,求出这个 ...
- UVALIVE 5893 计算几何+搜索
题意:很复杂的题意,我描述不清楚. 题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=3033#problem/33526 大致是,给定一个起 ...
- BZOJ4614 [Wf2016]Oil
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- A - Oil Deposits(搜索)
搜索都不熟练,所以把以前写的一道搜索复习下,然后下一步整理搜索和图论和不互质的中国剩余定理的题 Description GeoSurvComp地质调查公司负责探测地下石油储藏. GeoSurvComp ...
- Oil Deposits 搜索 bfs 强联通
Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...
- BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)
题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- 【FINAL】NOI
我就是复习一下..根本就不是什么题解...谁也看不懂的... NOI2007 社交网络 最短路 货币兑换 斜率优化动态规划 项链工厂 线段树 生成树计数 ...
随机推荐
- SharePoint如何模拟用户
try { SPSecurity.RunWithElevatedPrivileges(delegate() //用此方法模拟管理员账户运行此事件处理程序 { SPWeb web = SPContext ...
- Ansible Playbook 使用循环语句
如下,with_items 是循环的对象,with_items 是 python list 数据结构,task 会循环读取 list 里面的值,key 的名称是 item [root@localhos ...
- JLINK与JTAG的区别(转)
调试ARM,要遵循ARM的调试接口协议,JTAG就是其中的一种.当仿真时,IAR.KEIL.ADS等都有一个公共的调试接口,RDI就是其中的一种,那么我们如何完成RDI-->ARM调试协议(JT ...
- 【Java并发编程一】线程安全和共享对象
一.什么是线程安全 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的 ...
- 关于bat中使用rar压缩命令
数据库备份,导出的dmp 文件比较大,需要压缩,压缩后大小能变为原来十分之一左右吧. 写的是批处理的语句,每天调用,自动导出dmp 文件,压缩删除原文件. 首先写下路径 先将压缩软件的路径写入系统的环 ...
- Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
...
- Django restframwork教程之类视图(class-based views)
我们也可以使用类的views写我们的API,我们将看到这是一个强大的模式,允许我们重用公共功能,让我们的代码整洁 使用Class-based Views重新改写我们的API 打开views.py文件, ...
- File类使用
简介 File类的实例代表了一个文件或者一个目录,通过API可以获取这个对象的相关信息. File类代表的文件或者目录可以真实存在,也可以是不存在的,可以使用File.exists()来判断. 在Wi ...
- CListCtrl使用(转)
CListCtrl使用技巧 以下未经说明,listctrl默认view 风格为report 1. CListCtrl 风格 LVS_ICON: 为每个item显示大图标 LVS_SMALLI ...
- 利用开源架构ELK构建分布式日志系统
问题导读 1.ELK产生的背景?2.ELK的基本组成模块以及各个模块的作用?3.ELK的使用总计有哪些? 背景 日志,对每个系统来说,都是很重要,又很容易被忽视的部分.日志里记录了程序执行的关键信息, ...