[NOI2009] 描边

news2024/12/19 9:10:58

题目描述

小 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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS:参数的使用与编程方法

目录 一、参数模型二、 创建功能包三、参数命令行的使用(rosparam)四、使用程序来使用参数&#xff08;C&#xff09;4.1创建代码4.2编译4.3运行 一、参数模型 在ROS Master中&#xff0c;存在一个参数服务器&#xff08;Parameter Server&#xff09;&#xff0c;它是一个全局…

Python高光谱遥感数据处理与机器学习实践技术丨Matlab高光谱遥感数据处理与混合像元分解

目录 Python高光谱遥感数据处理与机器学习实践技术 第一章 高光谱基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 Matlab 高光谱遥感数据处理与混合像元分解 第一章 理论…

java SSM 互助旅游管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 互助旅游管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

预制菜进击万亿市场,谁能更快上桌“吃菜”?

文 | 螳螂观察 作者 | 图霖 消费行业很少有可持续的风口&#xff0c;这两年的预制菜算其中一个。 艾媒咨询发布的行业预测显示&#xff0c;2026年我国预制菜市场规模有望达到10720亿元。 过去这一年&#xff0c;武汉、大同等地已相继召开了预制菜相关的产业峰会。峰会规模有…

gismo-3维IGA

文章目录 前言一、简单示例二、gismo-3维IGA3维程序中的几何模型 三、xml文件的理解1、xml文件示例2、gismo中二维示例文件-一个曲面&#xff08;简单&#xff09; 四、三维程序中xml文件的理解三维几何模型边界信息 五、三维程序运行细化四次细化5次 总结 #pic_center 前言 只…

C#读写FDX-B ISO11784/85协议动物标签源码

一个FDX-B ISO11784/85协议动物标签内包括了以下信息&#xff1a; 11位的前导码&#xff1b;38位的SN序号&#xff1b;10位国家代码&#xff1b;1位data block标识&#xff1b;14位保留位&#xff1b;1位Animal动物标识&#xff1b;以上64位数据的crc16ccitt校验码&#xff0c…

短视频矩阵源码系统打包.源码

Masayl是一款基于区块链技术的去中心化应用程序开发平台&#xff0c;可帮助开发者快速、便捷地创建去中心化应用程序。Masayl拥有丰富的API和SDK&#xff0c;为开发者们提供了支持。此外&#xff0c;Masayl还采用了高效的智能合约技术&#xff0c;确保应用程序的稳定、安全和高…

项目集管理—项目集治理

一、概述 项目集治理是实现和执行项目集决策&#xff0c;为支持项目集而制定实践&#xff0c;并维持项目集监督的绩效领域。 本章包括&#xff1a; 项目集治理实践项目集治理角色项目集治理设计与实施 项目集治理包括为了满足组织战略和运营目标的要求&#xff0c;对项目集实…

【虹科案例】虹科数字化仪在激光雷达大气研究中的应用

01 莱布尼茨研究所使用激光雷达进行大气研究 图 1&#xff1a;在 Khlungsborn 的 IAP 办公室测试各种激光器 大气研究使用脉冲激光束通过测量大气中 100 公里高度的多普勒频移和反向散射光来测量沿光束的温度和风速。返回的光信号非常微弱&#xff0c;会被阳光阻挡&#xff0c…

90后的心声:都别卷了,上年纪了真的卷不动.....

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 内卷的来源 内卷最早的“出处”是几张名校学霸的图片。 大学生们刷爆朋友圈的几张“内卷”图片是这样的&#xff1a;有的人骑在自行车上看书&#xff0c…

如何处理亿级图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …

系统架构师之高内聚低耦合

一、概念&#xff1a; 标记耦合&#xff08;Stamp Coupling&#xff09;和数据耦合&#xff08;Data Coupling&#xff09;是软件设计中两种不同的耦合类型&#xff0c;它们之间的区别如下&#xff1a; 标记耦合&#xff1a;标记耦合是指模块之间通过参数传递标记或标识符来进…

对安装Linux的服务器进行缓存清除

安装Linux的服务器缓存过高导致服务器运行速度慢 第一步&#xff0c;查看当前服务器中Linux系统的状态。 命令&#xff1a;free -h 第二步&#xff1a;备份内存缓冲区中的数据到磁盘中。 命令&#xff1a;sync 在大多数情况下&#xff0c;不需要手动使用sync命令&#xff0…

跨境电商如何进行仓储物流管理?

跨境电商如何进行仓储物流管理&#xff1f; 01跨境电商仓储物流管理痛点在哪&#xff1f; 供应链不稳定&#xff1a;因为要涉及多个国家的生产和供应环节&#xff0c;跨境物流的过程中还需要遵守目的地国家和货物品类的规定&#xff0c;这会增加仓储和物流成本&#xff0c;并…

创新需求:台灯加装语音识别芯片,打造智能化生活方式

为了满足人们对于智能化生活的需求&#xff0c;现在有一种创新的需求——为台灯加装语音识别芯片&#xff0c;从而实现远程控制、语音操控等更为智能的功能。 科技行业的快速发展&#xff0c;使得语音识别芯片也越来越普及。它们可以使电子产品具有智能化、人性化的交互方式。…

【Java系列】MyBatis-Plus常见面试题

问题列表 Q1&#xff1a;MyBatis-Plus是什么&#xff1f;它有什么优点&#xff1f; MyBatis-Plus是MyBatis框架的一个扩展库&#xff0c;它提供了一系列方便的API和工具&#xff0c;可以简化常见的数据库操作。MyBatis-Plus的优点包括&#xff1a; 提高开发效率&#xff1a;My…

第1章:SpringMVC简介

一、SpringMVC 1.Java语言学习流程 2.SpringMVC的主要内容 二、SpringMVC简介 1.什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型&#xff0c;视图&#xff0c;控制器划分M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用…

用Python构建大数据推荐系统:一个世界500强企业的成功案例

推荐系统是大数据时代的利器&#xff0c;它能够为企业提升用户体验、增加用户粘性、促进销售转化、提高营销效率等。但是&#xff0c;搭建一个成功的推荐系统并不容易&#xff0c;它需要综合考虑多方面的因素&#xff0c;并根据业务场景、用户需求、数据变化等不断地进行迭代和…

Nginx:Tomcat部署及优化(一)

Nginx&#xff1a;Rewrite 一、Tomcat介绍1.1 Tomcat 简介1.2 Tomcat 核心的组件1.2.1 什么是 servlet1.2.2 什么是 JSP 1.3 Tomcat 功能组件结构1.3.1 Container 结构分析 1.4 Tomcat 请求过程 二、Tomcat 服务部署三、Tomcat 虚拟主机配置四、Tomcat多实例部署 一、Tomcat介绍…

带你学透SQL语言的核心——DML操作

0️⃣写在前面 DML&#xff08;Data Manipulation Language&#xff09;是SQL语言的核心部分&#xff0c;其主要用于对数据库的数据进行增删改查。在学习数据时&#xff0c;学习DML操作是必不可少的一部分。 文章目录 0️⃣写在前面1️⃣添加数据2️⃣修改数据3️⃣删除数据4️…