J 小白兔小灰兔

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
Special Judge, 64bit IO Format: %lld

题目描述

老山羊伯伯在地里收白菜,小白兔和小灰兔看见了就一起来帮忙。

他们干了半天,终于干完了。

羊伯伯:小灰兔,这车白菜送给你!

小灰兔:谢谢羊伯伯!

羊伯伯:小白兔,我也送你一车白菜!

小白兔:我不要白菜!给我一包白菜种子吧!

羊伯伯:好!给你~

小白兔:谢谢羊伯伯~

小灰兔把白菜拉到家里之后,就跟大家梦想中的生活一样,躺着啥都不干,吃吃吃,吃了玩~(好想一辈子都这样啊~小灰兔心想。)

小白兔把种子拿回去,打算开始勤劳地种白菜。然而他发现不是所有土地都能用来种白菜,只有被阳光照到的地方可以种白菜。

小白兔生活的星球可以看作二维平面中的一个简单多边形,太阳可以看作一个点。小白兔想知道,这个星球上一共有长度多少的土地可以用来种白菜。

输入描述:

第一行是一个正整数T(≤ 20),表示测试数据组数,

对于每组测试数据,

第一行是一个整数n(3≤ n≤ 10),表示简单多边形的顶点数,

接下来n行,每行是两个整数xi,yi(-10≤ xi,yi≤10),按照逆时针绕向给出简单多边形的n个顶点的坐标,

最后一行是两个整数x,y(-10≤ x,y≤10),表示太阳的坐标,保证太阳在多边形外且不在多边形任意一条边所在直线上。

输出描述:

对于每组测试数据,输出一行,包含一个实数,表示可以用来种白菜的土地的总长度,要求相对误差不超过

也就是说,令输出结果为a,标准答案为b,若满足,则输出结果会被认为是正确答案。

输入例子:
2
4
0 0
2 0
2 2
0 2
4 1
4
0 0
2 0
2 2
0 2
4 4
输出例子:
2.000000000000
4.000000000000

-->

示例1

输入

2
4
0 0
2 0
2 2
0 2
4 1
4
0 0
2 0
2 2
0 2
4 4

输出

2.000000000000
4.000000000000

 #include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define mod 1000000007
#define INF 0x3f3f3f3f
#define LL long long
#define pb push_back
#define pbk pop_back
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define mp make_pair
using namespace std;
typedef double db;
const int N=5e5+;
const db eps=1e-;
int equzero(db t)//带精度大小判断
{
if(t>eps) return ;
if(t<-eps) return -;
return ;
}
struct Point
{
db x,y;
Point(){}
Point(db _x,db _y):x(_x),y(_y) {}
Point operator +(const Point &b) const //+
{
return Point(x+b.x,y+b.y);
}
Point operator -(const Point &b) const//-
{
return Point(x-b.x,y-b.y);
}
Point operator *(const db &b) const// 放大
{
return Point(x*b,y*b);
}
Point operator /(const db &b) const//缩小
{
return Point (x/b,y/b);
}
db dot(const Point &b) const//点积
{
return x*b.x+y*b.y;
}
db det(const Point &b) const//叉积
{
return x*b.y-b.x*y;
}
bool operator ==(const Point &b) const
{
return equzero(x-b.x)== && equzero(y-b.y)==;
}
bool operator !=(const Point &b) const
{
return !(Point(x,y)==b);
}
db mo() //模
{
return sqrt(x*x+y*y);
}
}pt[N],u,v,mid;
struct Line
{
Point a,b;
Line (){}
Line (Point _a,Point _b):a(_a),b(_b) {};
bool quickrej(const Line &t) const//快速排斥判断
{
return equzero(min(a.x,b.x)-max(t.a.x,t.b.x))<= && equzero(min(t.a.x,t.b.x)-max(a.x,b.x))<= && equzero(min(a.y,b.y)-max(t.a.y,t.b.y))<= && equzero(min(t.a.y,t.b.y)-max(a.y,b.y))<=;
}
db len() const
{
return (b-a).mo();
}
bool stra(const Line &t) const //跨立判断
{
return equzero((a-t.a).det(t.b-t.a)*(b-t.a).det(t.b-t.a))< && equzero((t.a-a).det(b-a)*(t.b-a).det(b-a))< ;
}
bool gfxj(const Line &t) const //规范相交
{
return quickrej(t) && stra(t);
}
bool on(const Point &t) const //点在线段上
{
Line p=Line(a,b);
if(p.a.x>p.b.x)
swap(p.a,p.b);
if(equzero(t.x-p.a.x)< || equzero(t.x-p.b.x)>)
return false;
if(equzero((p.a-t).det(p.b-t))==)
return true;
else
return false;
}
bool kddxj(const Line &t) const //可多点相交
{
return quickrej(t) && (stra(t) || on(t.a) || on(t.b) || t.on(a) || t.on(b));
}
bool para(const Line &t) const // 平行或在一条直线上
{
return equzero((a.y-b.y)*(t.a.x-t.b.x)-(t.a.y-t.b.y)*(a.x-b.x))== ;
}
db operator & (const Line &t) const //返回切点占直线比例,距a比例
{
if(equzero((a-b).det(t.a-t.b))==)return -INF;
db tk=((a-t.a).det(t.a-t.b))/((a-b).det(t.a-t.b));
return equzero(tk)>= && equzero(tk-)<= ? tk : -INF;
}
}le[N],lu,lv;
int n,m,T;
vector<db> cp;
db ans,ins,rate;
bool flag;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf%lf",&pt[i].x,&pt[i].y);
for(int i=;i<n;i++)
le[i]=Line(pt[i],pt[(i+)%n]);
ans=;
for(int i=;i<n;i++)
{
cp.clear();
for(int j=;j<n;j++)
{
ins=le[i]&Line(pt[n],pt[j]);
if(ins>=-) cp.pb(ins);
}
sort(cp.begin(),cp.end());
rate=;
for(int j=;j<cp.size()-;j++)
{
lu=Line(pt[n],le[i].a+(le[i].b-le[i].a)*((cp[j]+cp[j+])/));
flag=;
for(int k=;k<n;k++)
{
if(lu.gfxj(le[k]))
{
flag=;
break;
}
}
if(!flag)
{
rate+=cp[j+]-cp[j];
}
}
ans+=rate*le[i].len();
}
printf("%.12f\n",ans);
}
return ;
}

BNU校赛总决赛J 小白兔小灰兔 相交计算几何模板的更多相关文章

  1. 2018BNU校赛总决赛

    题解是qls的题解我就懒得写了23333 A塞特斯玛斯塔 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld ...

  2. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板

    链接:https://www.nowcoder.com/acm/contest/141/J来源:牛客网 Eddy has graduated from college. Currently, he i ...

  3. 2014哈商大ICPC/ACM校赛解题报告

    被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数 ...

  4. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  5. 2014上半年acm总结(1)(入门+校赛)

    大一下学期才开始了acm,不得不说有一点迟,但是acm确实使我的生活充实了很多,,不至于像以前一样经常没事干=  = 上学期的颓废使我的c语言学的渣的一笔..靠考前突击才基本掌握了语法 寒假突然醒悟, ...

  6. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  7. 牛客网多校赛第9场 E-Music Game【概率期望】【逆元】

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  8. ZJU 17th 校赛

    第一次参加校赛,和小伙伴们拿了7个气球,还是挺开心的.  简单记个流水账吧. A:判断出INF的情况后 暴力模拟即可. INF的情况有x=1 || y=1 || (x==2 && y= ...

  9. 长春理工大学第十四届程序设计竞赛(重现赛)J.Printout

    链接:https://ac.nowcoder.com/acm/contest/912/J 题意: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字社,小r一看价格:总打印页数 ...

随机推荐

  1. HBA 介绍

    1.首先介绍一下什么是HBA. 这里所说的HBA,全称FC HBA,也就是Fibre Channel Host Bus Adapter.在FC网络中,主机(如服务器)需要和FC网络.FC存储设备(如S ...

  2. MongoDB 3.4.2 配置 CentOS 6.5 远程连接

    1.新建用户 db.createUser({user: 'test', pwd: 'myPassword', roles: [{role: 'readWrite', db: 'test_db'}]}) ...

  3. nginx配置不当导致的目录遍历下载漏洞-“百度杯”CTF比赛 2017 二月场

    题目:http://98fe42cede6c4f1c9ec3f55c0f542d06b680d580b5bf41d4.game.ichunqiu.com/login.php 题目内容: 网站要上线了, ...

  4. sicily 1240. Faulty Odometer

    Description You are given a car odometer which displays the miles traveled as an integer. The odomet ...

  5. gdb安装

    1.卸载原有gdb  以root用户登录  1.1 查询原有gdb包名,执行命令: rpm -q gdb  1.2 卸载原有gdb包,假设gdb包名为gdb-7.0-0.4.16,执行命令:rpm - ...

  6. 手机页面或是APP中减少使用setTimeout和setInterval,因为他们会导致页面卡顿

    1.setTimeout致使页面的卡顿或是不流畅,打乱模块的生命周期 ,还有setTimeout其实是很难调试的. 当一个页面有众多js代码的时候,setTimeout就是导致页面的卡顿. var s ...

  7. 轻量级运维工具-pssh,pscp,prsync,pslurp,pnuke

    批量执行,并行传输,远程killall #yum安装 yum install pssh -y #yun安装后pscp改名为pscp.pssh #源码编译 wget https://pypi.pytho ...

  8. Webcollector应用(二)

    先吐槽一句哀家的人品,总在写好代码之后,网站默默的升级,没有一点点防备... 一.加代理 爬取一个网站的时候,爬了不到一半,IP被封了,整个内部局域网的所有电脑都不能访问网站了. public cla ...

  9. Mysql的刷脏页问题

    平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短. 当内存数据 ...

  10. Yii2使用驼峰命名的形式访问控制器

    yii2在使用的时候,访问控制器的时候,如果控制器的名称是驼峰命名法,那访问的url中要改成横线的形式.例如: public function actionRoomUpdate() { // }//访 ...