POJ2826:An Easy Problem?!——题解(配特殊情况图)
http://poj.org/problem?id=2826
题目大意:给两条线,让它接竖直下的雨,问其能装多少横截面积的雨。
————————————————————————————
水题,看题目即可知道。
但是细节是真的多……不过好在两次AC应该没算被坑的很惨(全程没查题解)。
推荐交之前看一下讨论版的数据,方便一次AC(我第一次就是作死直接交了结果我自己都想好的情况忘了写了……)
相信看到这篇题解的人都看过题了,那么先说细节:
1.C++提交(G++不知道为什么WA了……)
2.精度
3.特殊情况,看看下面哪种情况你没有考虑到(以下都是没法装水的情况):






还有一种能够接水的情况:

将上面考虑完了,应该就差不多了。
那么说一下正解:
1.ko掉所有平行情况。(图3)
2.ko掉所有不相交情况。(图6)
3.ko掉所有斜率为0的情况。(图5)
4.上述两种情况完成后,求交点。
5.发现图1和图7情况只存在于斜率同号的情况下,特判之。
6.图2和图4一并解决:从交点处画一条平行于x的线,如果在该线上方的点的个数不为2,则不能接水。
7.上述情况讨论完后一定能接水,从6中获得的两个点取y值最小的点画一条平行于x的线,则围成的面积即为所求
总结:
线关系和线交点的题,细节较多,代码实现较长较繁琐,不推荐读下面代码。
#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef double dl;
const dl eps=1e-;
const dl INF=;
struct point{
dl x;
dl y;
}p[];
inline point getmag(point a,point b){
point s;
s.x=b.x-a.x;s.y=b.y-a.y;
return s;
}
inline dl multiX(point a,point b){
return a.x*b.y-b.x*a.y;
}
inline dl multiP(point a,point b){
return a.x*b.x+b.y*a.y;
}
inline bool parallel_mag(point a,point b){
if(fabs(a.x*b.y-a.y*b.x)<eps)return ;
return ;
}
inline bool check(point a,point b,point c,point d){
if(multiX(getmag(c,d),getmag(c,a))*multiX(getmag(c,d),getmag(c,b))>eps)return ;
if(multiX(getmag(a,b),getmag(a,c))*multiX(getmag(a,b),getmag(a,d))>eps)return ;
return ;
}
inline point intersection(point a,point b,point c,point d){
point s;
dl a1=a.y-b.y,b1=b.x-a.x,c1=a.x*b.y-b.x*a.y;
dl a2=c.y-d.y,b2=d.x-c.x,c2=c.x*d.y-d.x*c.y;
s.x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
s.y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
return s;
}
inline dl slope(point a,point b){
if(fabs(a.x-b.x)<eps)return INF;
return (a.y-b.y)/(a.x-b.x);
}
inline bool deng(point a,point b){
if(fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps)return ;
return ;
}
inline bool pan(point s){
dl k1=slope(p[],p[]);
dl k2=slope(p[],p[]);
if(fabs(k1)<eps||fabs(k2)<eps)return ;
if(k1>eps&&k2>eps){
if(k2-k1>eps){
if(-eps<p[].x-p[].x)return ;
}else{
if(-eps<p[].x-p[].x)return ;
}
}
if(k1<-eps&&k2<-eps){
if(k1<k2){
if(p[].x-p[].x>-eps)return ;
}else{
if(p[].x-p[].x>-eps)return ;
}
return ;
}
int ok=;
for(int i=;i<=;i++){
if(p[i].y-s.y>eps){
ok++;
}
}
if(ok!=)return ;
return ;
}
dl area(){
if(parallel_mag(getmag(p[],p[]),getmag(p[],p[])))return ;
if(!check(p[],p[],p[],p[]))return ;
point s=intersection(p[],p[],p[],p[]);
if(!pan(s))return ;
int s1=,s2=;
for(int i=;i<=;i++){
if(p[i].y-s.y>eps){
if(!s1)s1=i;
else s2=i;
}
}
point ns,nss,n1,n2;
if(eps<p[s2].y-p[s1].y){
ns.x=p[s1].x;ns.y=p[s1].y;
}else{
ns.x=p[s2].x;ns.y=p[s2].y;
}
nss.x=INF;nss.y=ns.y;
n1=intersection(p[],p[],ns,nss);
n2=intersection(p[],p[],ns,nss);
return fabs(multiX(getmag(s,n1),getmag(s,n2)))/;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=;i<=;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
if(p[].x>p[].x)swap(p[],p[]);
if(p[].x>p[].x)swap(p[],p[]);
printf("%.2f\n",area());
}
return ;
}
POJ2826:An Easy Problem?!——题解(配特殊情况图)的更多相关文章
- poj2826 An Easy Problem?!【计算几何】
含[三点坐标计算面积].[判断两线段是否有交点].[求线段交点]模板 An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Tot ...
- Poj2826 An Easy Problem
呵呵哒.WA了无数次,一开始想的办法最终发现都有缺陷.首先需要知道: 1)线段不相交,一定面积为0 2)有一条线段与X轴平行,面积一定为0 3)线段相交,但是能接水的三角形上面线段把下面的线段完全覆盖 ...
- poj2826 An Easy Problem?!(计算几何)
传送门 •题意 两根木块组成一个槽,给定两个木块的两个端点 雨水竖直下落,问槽里能装多少雨水, •思路 找不能收集到雨水的情况 我们令线段较高的点为s点,较低的点为e点 ①两条木块没有交点 ②平行或重 ...
- LuoguP7852 「EZEC-9」Yet Another Easy Problem 题解
Content 给定 \(n,m\),你需要输出一个长度为 \(n\) 的排列,满足该排列进行不超过 \(m\) 次交换操作可以得到的最小的字典序最大. 数据范围:\(T\) 组数据,\(1\leqs ...
- An Easy Problem?!(细节题,要把所有情况考虑到)
http://poj.org/problem?id=2826 An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- POJ 2826 An Easy Problem?![线段]
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12970 Accepted: 199 ...
- POJ 2826 An Easy Problem?!
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7837 Accepted: 1145 ...
- HDU 5475 An easy problem 线段树
An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- [POJ] 2453 An Easy Problem [位运算]
An Easy Problem Description As we known, data stored in the computers is in binary form. The probl ...
随机推荐
- MySQL高级-锁机制
一.概述 1.定义 2.锁的分类 ①从对数据操作的类型(读\写)分 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响. 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁 ...
- Python Map 并行
Map是一个酷酷的小东西,也是在Python代码轻松引入并行的关键.对此不熟悉的人会认为map是从函数式语言(如Lisp)借鉴来的东西.map是一个函数 - 将另一个函数映射到一个序列上.例如: ur ...
- ToString的格式化字符串
如下: , , ).ToString(@"d\.hh\:mm\:ss"); var b = DateTimeOffset.Now.ToString("yyyy-MM-dd ...
- android分析windowManager、window、viewGroup之间关系(一)
本文将主要介绍addview方法,在windowManager.window.viewGroup中的实现原理.首先将介绍这些类结构关系,然后分析其内在联系,介绍实现原理,最后介绍重要的一个参数wind ...
- Siki_Unity_1-9_Unity2D游戏开发_Roguelike拾荒者
Unity 1-9 Unity2D游戏开发 Roguelike拾荒者 任务1:游戏介绍 Food:相当于血量:每走一步下降1,吃东西可以回复(果子10药水20),被怪物攻击会减少中间的障碍物可以打破, ...
- jdbc连接sql server2017进行简单的增、删、改、查操作
这几天刚做完数据库的课程设计,来稍微总结一下如何通过jdbc访问sql server数据库进行简单的增删改查操作.在连接之前,需要简单地配置一下,包括下载对应jdk版本的驱动,设置环境变量等等.相关配 ...
- Daily Scrum 11
今天我们小组开会内容分为以下部分: part 1: 针对学长的搜索算法进行优化,每人发表自己的看法; part 2:对积分系统.防滥用.搜索算法优化部分代码任务的讨论和分工: part 3:进行明日的 ...
- c#调用c++dll(c++界面在c#显示)____制作dll
1.c++dll含界面,以摄像头dll为例: 1.直接在c++SDK上调试运行成功,生成dll. 2.留一个调用接口(格式如下,写在cpp文件中,即函数体): extern "C" ...
- python学习摘要(3)--字符串处理函数
python没有字符类型, "字符串" '字符串' '''字符串''' """字符串""" 三引号可以支持字符串跨行 字 ...
- iOS- Exception异常处理
1.Exception 前言 在iOS里对异常的处理及捕获,并没有其它语言里那么常见,相信很多iOS程序员都知道,更多的时候是对内存的的检测与分析,检测相关内存方面的问题. 而在app闪退并不是因为内 ...