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}\)。

而要計算最短距離,我們有兩種方法:

  1. 利用內積是投影長度的相乘的性質,我們把線段的法向量和\(\overrightarrow{PE}\)作內積,再除以法向量的長度,就是最短距離。
  2. 利用外積的絕對值是向量們所展出的四邊形面積,且等於底乘以高,\(|\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 解析(思維、幾何)的更多相关文章

  1. 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 ...

  2. codeforce #339(div2)C Peter and Snow Blower

    Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...

  3. [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 ...

  4. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  5. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  6. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  7. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  8. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  9. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

随机推荐

  1. 理解 JAVABEAN EJB POJO

    <Spring实战>第一章:基本理念.各类名称熟语 POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混 ...

  2. UOS服务器常见问题

    UOS服务器安装完成之后,xshell工具无法远程, 描述 我安装完系统后,用xshell工具无法远程,必须在系统上才能进去我是通过centos7的kvm虚拟工具上刷的统信的系统,安装方式: 最小化安 ...

  3. Spring学习(八)--Spring的AOP

    自工作以后身不由己,加班无数,996.995不可控制,高高立起的flag无法完成,无奈,随波逐流,尽力而已! 1.advice通知 advice主要描述Spring AOP 围绕奥方法调用而注入的切面 ...

  4. Python-判断字符串是否以某个字符串开头或结尾?

    案例: 某文件系统目录下有一系列文件: 1.c 2.py 3.java 4.sh 5.cpp ...... 编写一个程序,给其中所有的.sh文件和.py文件加上可执行权限 如何解决这个问题? 1. 先 ...

  5. java安全编码指南之:死锁dead lock

    目录 简介 不同的加锁顺序 使用private类变量 使用相同的Order 释放掉已占有的锁 简介 java中为了保证共享数据的安全性,我们引入了锁的机制.有了锁就有可能产生死锁. 死锁的原因就是多个 ...

  6. sql注入里关键字绕过的发现

    网上大量文章,甚至<黑客攻防技术实战宝典-WEB实战篇>里面都说一些关键字如 select 等绕过可以用注释符/**/. 例如: select,union.可以用 ,se/**/lect, ...

  7. 用composer安装captcha_src()不成功

    1,要么就是TP的框架配置有问题建议重新下载 2,要么就是下载captcha_src的语句有问题  正确的语句  composer require topthink/think-captcha 1.* ...

  8. mysql5.7.23 解压版 密码忘记了咋办??

    mysql 5.7.23  err文件: 查看log中保存的 密码 记下密码,重新启动MySQL服务,并进入CMD命令行,在此使用mysql -u root -p登陆,键入密码 进入数据库后,使用se ...

  9. MeteoInfoLab脚本示例:创建netCDF文件(合并文件)

    在MeteoInfoLab中增加了创建netCDF文件并写入数据的功能,这里利用合并多个netCDF文件为一个新的netCDF文件为例.1.创建一个可写入的netCDF文件对象(下面用ncfile表示 ...

  10. Android开发签名证书的生成

    现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套[Android进阶学习视频].[全套Android面试秘籍].[Android知识点PDF] ...