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. Java基础一篇过(二)泛型

    一.啥是泛型 概述 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数. 格式 类名<类型名> 标记符 E - Element (在集合中使用 ...

  2. Spring学习(八)AOP详解

    文章更新时间:2020/04/06 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让 ...

  3. Laravel驱动管理类Manager的分析和使用

    Laravel驱动管理类Manager的分析和使用 第一部分 概念说明 第二部分 Illuminate\Support\Manager源码 第三部分 Manager类的使用 第一部分:概念解释 结合实 ...

  4. Solon详解(八)- Solon的缓存框架使用和定制

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  5. Centos-搜索文件或目录-find

    find 在指定的目录下查找指定的文件 相关选项 -type 指定文件类型 -name   指定文件名字,支持通配符 -gid   指定用户组ID -uid   指定用户ID -empty 查找长度为 ...

  6. ECharts系列:玩转ECharts之常用图(折线、柱状、饼状、散点、关系、树)

    一.背景 最近产品叫我做一些集团系列的统计图,包括集团组织.协作.销售.采购等方面的.作为一名后端程序员,于是趁此机会来研究研究这个库. 如果你仅仅停留在用的层面,那还是蛮简单的. 二.介绍 ECha ...

  7. JavaScript 将十进制数转换成格式类似于 0x000100 或 #000100 的十六进制数

    将十进制数转换成格式类似于 0x000100 或 #000100 的十六进制数 1 <!DOCTYPE html> 2 <html> 3 <head> 4 < ...

  8. P3431 [POI2005]AUT-The Bus

    Link 简化题意: 给你一张网格图,每个点有其对应的权值,让你找出来一条横纵坐标都单调不降的路径,并最大化经过点的权值. 分析: 这是经典的二维数点或者二维偏序问题. 如果两维一直在变的话,我们不是 ...

  9. Vue学习使用系列九【axiox全局默认配置以及结合Asp.NetCore3.1 WebApi 生成显示Base64的图形验证码】

    1:前端code 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta char ...

  10. 洛谷 P3413 【萌数】

    敲完这篇题解,我就,我就,我就,嗯,好,就这样吧... 思路分析: 首先我们要知道一个回文串的性质--假如说一个[l-1,r+1]的串是回文的,那么[l,r]一定也是回文的. 所以我们只要记录前一个数 ...