[NOI2009] 描边

题目描述

小 Z 是一位杰出的数学家。聪明的他特别喜欢研究一些数学小问题。

有一天,他在一张纸上选择了 n 个点,并用铅笔将它们两两连接起来,构成 (�−1)22n(n−1)​ 条线段。由于铅笔很细,可以认为这些线段的宽度为 。

望着这些线段,小 Z 陷入了冥想中。他认为这些线段中的一部分比较重要,需要进行强调。因此小 Z 拿出了毛笔,将它们重新进行了描边。毛笔画在纸上,会形成一个半径为 �r 的圆。在对一条线段进行描边时,毛笔的中心(即圆心)将从线段的一个端点开始,沿着该线段描向另一个端点。下图即为在一张 44 个点的图中,对其中一条线段进行描边强调后的情况。

现在,小 Z 非常想知道在描边之后纸面上共有多大面积的区域被强调,你能帮助他解答这个问题么?

输入格式

本题是一道提交答案型试题,所有的输入文件 path1.in ∼∼ path10.in 已在相应目录下。

输入文件请点击 这里 下载。

输入文件的第一行为一个正整数 �n,表示选择的点的数目。

第二行至第 �+1n+1 行,其中:第 �+1i+1 行中为两个实数 ��,��xi​,yi​,表示点 �i 的坐标为 (��,��)(xi​,yi​)。

第 �+2n+2 行为一个正整数 �m,表示小 Z 认为比较重要的线段的条数。

第 �+3n+3 行至第 �+�+2n+m+2 行,每行有两个正整数 �,�a,b,表示一条线段。其中 �,�a,b 两个数分别表示该线段的两个端点的编号。

第 �+�+3n+m+3 行中为一个实数 �r,表示毛笔在纸上形成的圆的半径。

第 �+�+4n+m+4 行中为四个实数 �1,�2,�3,�4p1​,p2​,p3​,p4​,即评分使用的参数。

输出格式

输出文件 path*.out 仅一行一个数,即为描边后被强调区域的总面积。

输入输出样例

输入 #1复制

2
1 1
1 2
1
1 2
1
0.00001 0.001 0.1 1

输出 #1复制

5.1415927

说明/提示

每个测试点单独评分。

本题设有 44 个评分参数 �1,�2,�3,�4p1​,p2​,p3​,p4​(�1<�2<�3<�4p1​<p2​<p3​<p4​),已在输入文件中给出。

你的得分将按照如下规则给出:

  • 若你的答案与标准答案相差不超过 �1p1​,则该测试点你将得到满分;
  • 否则,若你的答案与标准答案相差不超过 �2p2​,则你将得到该测试点 70%70% 的分数;
  • 否则,若你的答案与标准答案相差不超过 �3p3​,则你将得到该测试点 40%40% 的分数;
  • 否则,若你的答案与标准答案相差不超过 �4p4​,则你将得到该测试点 10%10% 的分数;
  • 否则,该测试点你的得分为 00。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N=2505;
const ld eps=1e-9;
int n,m,u[N],v[N],cnt;
ld r,mxx=-1e9,mix=1e9,mxy=-1e9,miy=1e9;
ld ans;
struct aa
{
	ld x,y;
	aa operator +(const aa &b)const{return aa{x+b.x,y+b.y};}
	aa operator -(const aa &b)const{return aa{x-b.x,y-b.y};}
	aa operator *(const ld &b)const{return aa{x*b,y*b};}
	ld operator ^(const aa &b)const{return x*b.y-y*b.x;}
	ld operator *(const aa &b)const{return x*b.x+y*b.y;}
	ld dis() {return sqrt(x*x+y*y);}
}dt[N];
int sgn(ld x) {return (x>eps)-(x<-eps);}
struct bb
{
	ld ps;
	int fl;
	bool operator <(const bb &b)const{return sgn(ps-b.ps)? ps<b.ps:fl>b.fl;}
}Ln[N+N];
bool in(aa s,aa t,aa x)
{
	ld lp=((x-s)^(t-s));
	if(sgn(lp)>0) swap(s,t);
	else lp=-lp;
	aa la=t-s,lb=la;
	swap(lb.x,lb.y),lb.x=-lb.x;
	if(sgn((x-s)^lb)>=0&&sgn((x-t)^lb)<=0) return lp/la.dis()<=r;
	return min((x-s).dis(),(x-t).dis())<=r;
}
int main()
{
	freopen("path10.in","r",stdin);
	freopen("path10.out","w",stdout); 
	int i,j;
	for(cin>>n,i=1;i<=n;i++)
		cin>>dt[i].x>>dt[i].y,mxx=max(mxx,dt[i].x),mix=min(mix,dt[i].x),
		mxy=max(mxy,dt[i].y),miy=min(miy,dt[i].y);
	for(cin>>m,i=1;i<=m;i++) cin>>u[i]>>v[i];
	cin>>r,mix-=r,mxx+=r,miy-=r,mxy+=r;
	ld px=(mxx-mix)/10000000.0;
	int Cl=0;
	for(ld X1=mix+px/2,X;X1<mxx;X1+=px)
	{
		cnt=0,X=X1;
		for(i=1;i<=m;i++)
			if(max(dt[u[i]].x,dt[v[i]].x)+r>X&&min(dt[u[i]].x,dt[v[i]].x)-r<X)
			{
				if(fabs(dt[u[i]].x-X)>fabs(dt[v[i]].x-X)) swap(u[i],v[i]);
				if(fabs(dt[u[i]].x-X)<r)
				{
					ld st=dt[u[i]].y,pl=0,pr=mxy-st,mid;
					while(pr-pl>eps)
					{
						mid=(pl+pr)/2;
						if(in(dt[u[i]],dt[v[i]],aa{X,st+mid})) pl=mid;
						else pr=mid;
					}
					Ln[++cnt]=bb{st+(pl+pr)/2,-1},pl=0,pr=st-miy;
					while(pr-pl>eps)
					{
						mid=(pl+pr)/2;
						if(in(dt[u[i]],dt[v[i]],aa{X,st-mid})) pl=mid;
						else pr=mid;
					}
					Ln[++cnt]=bb{st-(pl+pr)/2,1};
				}
				else
				{
					if(dt[u[i]].x>dt[v[i]].x) swap(u[i],v[i]);
					aa lp=dt[v[i]]-dt[u[i]];
					ld la=dt[u[i]].y+lp.y*(X-dt[u[i]].x)/(dt[v[i]].x-dt[u[i]].x),lb=r*lp.dis()/(dt[v[i]].x-dt[u[i]].x);
					Ln[++cnt]=bb{la-lb,1},Ln[++cnt]=bb{la+lb,-1};
				}
			}
		sort(Ln+1,Ln+cnt+1);
		for(i=1,j=0;i<=cnt;i++)
			ans+=(!!j)*(Ln[i].ps-Ln[i-1].ps)*px,j+=Ln[i].fl;
	}
	printf("%.9Lf",ans);
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/27058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023软件测试卷出天际!!!性能测试为啥一枝独秀?

近十年是中国互联网发展最快的10年&#xff0c;互联网用户从4亿增长至10亿。面对用户量的暴增&#xff0c;用户体验就成为互联网产品最大的考验。而 影响用户体验的最重要因素就是性能。 流量为王的时代&#xff0c;性能测试是所有产品上线前必须通过的重要环节。 企业招聘性…

上海亚商投顾:沪指小幅震荡微涨 AI应用端持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日走势分化&#xff0c;沪指全天窄幅震荡&#xff0c;创业板指低开低走&#xff0c;盘中一度跌超1.6%&a…

基于“三维六类”干扰分析模型进行FDD900干扰规避优化指导

1.概述 随着网络发展&#xff0c;鉴于900M覆盖上的优势&#xff0c;为增强深度覆盖及竞对提升&#xff0c;当前FDD 900M已在加快部署&#xff0c;但随之也带来了干扰问题。当前&#xff0c;干扰排查成为FDD 900M部署过程中大量存在的难题。由于干扰排查难度大&#xff0c;且排…

《Contrastive Learning for Unpaired Image-to-Image Translation》

Contrastive Learning for Unpaired Image-to-Image Translation 1. 摘要2. 介绍3. 相关工作3.1 图像转换、循环一致性3.2 关系保持3.3 深度网络嵌入中的感知相似性3.4 对比表示学习 4. 方法 原文及代码链接 https://github.com/taesungp/contrastive-unpaired-translation 1.…

Nginx踩坑记录(二) nginx: [warn] invalid value “TLSv1.3“ in /etc/nginx/nginx.conf:20

问题详情 &#xff08;通过指定配置文件的方式&#xff09;启动nginx&#xff0c;提示告警&#xff0c;nginx启动失败。 rootvultr:~# nginx -c /etc/nginx/conf/nginx.conf nginx: [warn] invalid value "TLSv1.3" in /etc/nginx/conf/conf.d/v2ray.conf:20问题原…

发现问题更全面,减少测试成本:WEB自动化测试的价值分析!

目录 前言&#xff1a; 一、WEB自动化测试的价值 1. 提高测试效率 2. 提高软件的质量 3. 减少测试成本 二、WEB自动化测试的瓶颈 1. 可维护性差 2. 兼容性问题 3. 比手工测试慢 三、代码示例 四、总结 前言&#xff1a; 自动化测试是软件开发中必不可少的一环&…

【支付平台】java springboot 通过ip获取所在地城市信息

如果只是想知道如何通过ip获取所在地城市信息,可直接看第三步. 如果搭建自己的支付平台,异地支付限制是必不可少的一环.因为市面上一些非法份子,会使用我们平台生成的付款码进行欺诈行为.这也是我们必须杜绝的一种现象.因此限制异地支付就是其中一种手段. 在上一篇文章【三方支…

第九篇:强化学习Q-learning算法 通俗介绍

你好&#xff0c;我是郭震&#xff08;zhenguo) 今天介绍强化学习第九篇&#xff1a;Q-learning算法 前面我们介绍强化学习基本概念&#xff0c;马尔科夫决策过程&#xff0c;策略迭代和值迭代&#xff0c;这些组成强化学习的基础。 从今天开始逐步介绍常用强化学习算法&#x…

SparkCore的相关概念

1、Spark的RDD算子 RDD算子的概念和分类 1、1 Transformation算子 定义&#xff1a;RDD算子&#xff0c;返回值仍是一个RDD的&#xff0c;称之为转换算子 特性&#xff1a;这类算子是lazy懒加载的。如果没有Action算子&#xff0c;转换算子是不工作的。 1、2 Action算子 定义&…

做了一个日内信号可视化系统

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;半年过去了。松鼠Quant计划6月内发布本年度最重要的一个策略:盘口策略。这个策略群友们的呼声很高&#xff0c;也是花了比较多时间去弄。整个策略有多个python脚本: CTP数据生成order…

部署和配置DHCP服务器实验:自动分配IP地址和网络配置

部署和配置DHCP服务器实验&#xff1a;自动分配IP地址和网络配置 【实验目的】 部署DHCP服务器。熟悉DHCP服务器的配置方法。验证拓扑。 【实验拓扑】 实验拓扑如图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 DHCPSERVE F0/0 172.16.10.1 25…

数据安全--16--数据采集阶段安全防护措施

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/131033616 一、引子 数据采集阶段的安全防护措施主要是从三个方面来开展的&#xff0c;第一个是从个人数据主体采集方面&#xff0c;第二个是从外部机构采集方面&#xff0c;以上两个方面基本涵盖了数…

Bitmiracle Docotic.Pdf 9.015 Crack

Docotic.Pdf 库是正确的法语和强大的编程和界面&#xff0c;可以让用户和开发人员创建专业和高质量的 PDF 文件&#xff0c;甚至可以阅读和修改那些已经存在的。它具有干净而强大的编程接口&#xff0c;能够帮助用户创建质量非常好的 PDF 文档。在这个库的帮助下&#xff0c;用…

CMake学习(1): CMake基本使用

https://subingwen.cn/cmake/CMake-primer/ 1. CMake 概述 CMake是一个项目构建工具&#xff0c;并且是跨平台的。Cmake跟Makefile其实是差不多的&#xff0c;只不过makefile更底层些。大多是 IDE 软件都集成了 make&#xff0c;比如&#xff1a;VS 的 nmake、linux 下的 GNU…

python之函数(参数,匿名函数,局部变量和全局变量)

文章目录 前言一、函数的参数 1、形参和实参2、必传参数&#xff08;也叫&#xff1a;必须参数&#xff09;3、关键字传参4.、默认参数5、不定长参数6、传参的顺序二、匿名函数&#xff08;lambda函数&#xff09; 1. 定义及特点语法格式2. lambda函数的特点三、函数返回值retu…

【测试开发】实训记录日志

软件测试系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 了解测试开发和软件测试 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 …

SSD源码总结

一、生成默认框 默认框的宽高 默认框的宽高是相对于原图的尺寸计算出来的。 默认框的中心 默认框的中心是相对于特征图的尺寸计算出来的。 二、将真实框分配给默认框 1、区分正负样本 1.1、选取正样本 计算真实框&#xff08;bboxs&#xff09;与每个默认框&#xff08;…

SpringMVC-【回顾】

回顾MVC架构 什么是mvc&#xff1a;模型、视图、控制器 -----软件设计规范 回顾servlet maven项目导入依赖&#xff08;webmvc,servlet-api,jsp-api,jstl,junit&#xff09;创建子模块&#xff0c;在子模块中添加框架支持&#xff08;在子模块中导入依赖jsp、servlet【因为父…

2018 年一月联考逻辑真题

2018 年一月联考逻辑真题 三、逻辑推理&#xff1a;第 26-55 小题&#xff0c;每小题 2 分&#xff0c;共 60 分。下列每題给出的A.、 B.、C.、D.五个选项中&#xff0c;只有一项是符合试题要求的。请在答题卡上将所选项的字母涂黑。 真题&#xff08;2018-26&#xff09;-翻译…

区块链的基本介绍

目录 1、简介 2、区块链的分类 2.1 公有链 2.2 联盟链 2.3 私有链 3、区块链特征 4、区块链结构 5、区块链对记账权利的分配方式 5.1 POW 5.2 PoS 5.3 DPoS 6、Defi、NFT、 gameFi 7、DAPP 7.1 DAPP 的核心要素 8、比特币 8.1 比特币简介 8.2 比特币数字签名…