A. Peter and Snow Blower 解析(思維、幾何)
Codeforce 613 A. Peter and Snow Blower 解析(思維、幾何)
今天我們來看看CF613A
題目連結
題目
給你一個點\(P\)和\(n\)個點形成的多邊形(照順或逆時針順序給),求這個多邊形繞著\(P\)轉最後可以造成的面積。(有關正式的"旋轉"定義請看原題)
前言
儲存點的座標時沒想過要用\(pair<long\ long,long\ long>\),結果debug超久
想法
首先要注意到:由於題目的旋轉的定義是把每個點都對於點\(P\)去做旋轉,所以最後的圖形一定是兩個同心圓,而面積就是兩個圓中間的面積,而我們只需要維護最長的半徑和最短的半徑就好。
由於題目是按照順序給多邊形的點,所以我們可以把每條邊單獨拿出來考慮和\(P\)點的最短和最長距離。
如上圖所示,想要判斷點\(P\)到線段\(\overline{SE}\)的最短距離線段是否在線段\(\overline{SE}\)上,我們只需要判斷\(\overrightarrow{PM}\)是否被\(\overrightarrow{PS},\overrightarrow{PE}\)所包住,而其中一種方法就是利用外積(叉積、cross product):
如果\(\overrightarrow{PM}\)是被包住的,那麼\(sgn(\overrightarrow{PM}\times\overrightarrow{PS})=-sgn(\overrightarrow{PM}\times\overrightarrow{PE})\)
反之如果\(sgn(\overrightarrow{PM}\times\overrightarrow{PS})=sgn(\overrightarrow{PM}\times\overrightarrow{PE})\),那麼代表沒有被包住。以上是利用了外積的性質:\(\overrightarrow{AB}\times\overrightarrow{CD}=-\overrightarrow{CD}\times\overrightarrow{AB}\)對於任何向量\(\overrightarrow{AB},\overrightarrow{CD}\)。
而要計算最短距離,我們有兩種方法:
- 利用內積是投影長度的相乘的性質,我們把線段的法向量和\(\overrightarrow{PE}\)作內積,再除以法向量的長度,就是最短距離。
- 利用外積的絕對值是向量們所展出的四邊形面積,且等於底乘以高,\(|\overrightarrow{PS}\times\overrightarrow{PE}|/|\overrightarrow{SE}|\)就是最短距離。
而透過觀察可以發現,\(P\)點到線段的長度,不是最短距離,那就是端點。有了以上資訊,我們就可以寫了。
程式碼:
const int _n=1e5+10;
int t,n,m;
PII p,prev,ps[_n];
db minn=1e9,maxx=-1e9,pi=acos(-1);
bool sgn(db x){
return x>=0.0?0:1;
}
db cp(PII u,PII v){
return (db)(u.fi*v.se-u.se*v.fi);
}
db len(PII u){
return sqrt(u.fi*u.fi+u.se*u.se);
}
void f(PII x,PII y){
PII tt2={y.fi-p.fi,y.se-p.se},tt3={x.fi-p.fi,x.se-p.se},tt1={-(tt3.se-tt2.se),tt3.fi-tt2.fi};
db res1=len(tt2),res2=len(tt3),res3=abs((db)(tt1.fi*tt2.fi+tt1.se*tt2.se))/len(tt1);
bool z=1;if(sgn(cp(tt1,tt2))==sgn(cp(tt1,tt3)))z=0;
if(z){
minn=min(minn,min(res1,min(res2,res3)));
maxx=max(maxx,max(res1,max(res2,res3)));
}else{
minn=min(minn,min(res1,res2));
maxx=max(maxx,max(res1,res2));
}
}
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//這邊的PII必須是pair<ll,ll>
cin>>n>>p.fi>>p.se;rep(i,0,n)cin>>ps[i].fi>>ps[i].se; prev=ps[0];
rep(i,1,n)f(prev,ps[i]),prev=ps[i];
f(prev,ps[0]);
cout<<setprecision(20)<<pi*(maxx*maxx-minn*minn)<<'\n';
return 0;
}
標頭、模板請點Submission看
Submission
A. Peter and Snow Blower 解析(思維、幾何)的更多相关文章
- Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
A. Peter and Snow Blower 题目连接: http://www.codeforces.com/contest/613/problem/A Description Peter got ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- [CodeForces - 614C] C - Peter and Snow Blower
C - Peter and Snow Blower Peter got a new snow blower as a New Year present. Of course, Peter decide ...
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
- B. Two Arrays 解析(思維)
Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...
- C. k-Amazing Numbers 解析(思維)
Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...
随机推荐
- Spring Cloud各组件学习
Spring-Cloud 介绍 SpringCloud各个组件详解,因为SpringCloud部分组件停止更新,故本项目包含原SpringCloud(基于SpringCloud H版和SpringBo ...
- ZooKeeper学习(二)ZooKeeper实现分布式锁
一.简介 在日常开发过程中,大型的项目一般都会采用分布式架构,那么在分布式架构中若需要同时对一个变量进行操作时,可以采用分布式锁来解决变量访问冲突的问题,最典型的案例就是防止库存超卖,当然还有其他很多 ...
- git push 提交时出错 the remote end hung up unexpectedly
错误原因 与远程服务的连接中断,但是检查发现origin还在,可能是文件太大,缓存不够,增加缓存大小 解决方案 专案目录 >.git >config 在末尾增加如下代码 [http] po ...
- 基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中。
react-amap 这是一个基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中. 文档实例预览: Github Web | Gitee Web 特性 ️ 自动加载高德地 ...
- Centos-归档文件或目录-tar
tar 对文件或者目录进行打包归档成一个文件,不是压缩 相关选项 -c 新建文件 -r 将目标文件追加都档案文件末尾 -t 列出归档文件中已经归档文件列表 -x 从归档文件中还原文件 -u 新文件更新 ...
- Python-在列表、字典中筛选数据
实际问题有哪些? 过滤掉列表[3,9,-1,10.-2......] 中负数 筛选出字典{'li_ming':90,'xiao_hong':60,'li_kang':95,'bei_men':98} ...
- logging模块培训小结
Python自动化课程又上了一节课,每一个自动化框架都涉及到日志的使用,logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日 ...
- Layman H5+Webapp+MUI App 页面滑至到底部自动加载新的内容
要点:使用jquery的scroll()方法实现,当用户滚动指定的元素时,会发生 scroll 事件 scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口) scroll() 方 ...
- JDK1.8新特性之(一)--Lambda表达式
近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...
- matlab中imread 从图形文件读取图像
来源:https://ww2.mathworks.cn/help/matlab/ref/imread.html?searchHighlight=imread&s_tid=doc_srchtit ...