100837D
囤了一个星期。。今天看了下vj上 sysuteam7 三年半之前的代码。。
深刻地认识到了自己智商不足的问题。
先求出来每个点对中心的偏移量。
确实是乱序的,但是我们可以极角排序,这样一定是一个
循环移位匹配到另一个循环移位。
所以枚举n次就可以,check也十分简单
#include <bits/stdc++.h>
using namespace std;
typedef double db;
const db eps = 1e-;
const db pi = acos(-);
int sign(db k){
if(k>eps)return ;else if(k<-eps)return -;return ;
}
int cmp(db k1,db k2){ return sign(k1-k2);}
struct point{
db x,y;
point operator+(const point &k1)const { return point{x+k1.x,y+k1.y};}
point operator-(const point &k1)const { return point{x-k1.x,y-k1.y};}
point operator *(db k1)const{ return point{x*k1,y*k1};}
point operator/(db k1)const { return point{x/k1,y/k1};}
int operator == (const point &k1) const{return cmp(x,k1.x)==&&cmp(y,k1.y)==;}
bool operator<(const point k1)const {
int a = cmp(x,k1.x);
if(a==-)return ;else if(a==) return ;
else return cmp(y,k1.y)==-;
}
db abs(){ return sqrt(x*x+y*y);}
db abs2(){return x*x+y*y;}
db dis(point k1){ return ((*this)-k1).abs();}
point unit(){db w = abs(); return point{x/w,y/w};}
point turn90(){return point{-y,x};}
db getP()const{return sign(y)==-||(sign(y)==&&sign(x)==-);}
};
db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
int compareangle (point k1,point k2){//[0,2pi]
return k1.getP()<k2.getP()||(k1.getP()==k2.getP()&&sign(cross(k1,k2))>)||(k1.getP()==k2.getP()&&sign(cross(k1,k2))==&&abs(k1.x)<abs(k2.x));
}
int n;
point a[],b[];
point o1,o2;
int main(){
//freopen("d.in","r",stdin);
//freopen("d.out","w",stdout);
scanf("%d",&n);
if(n==) return *printf("%.11f\n",0.0);
for(int i=;i<n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
o1=o1+a[i];
}
for(int i=;i<n;i++){
scanf("%lf%lf",&b[i].x,&b[i].y);
o2=o2+b[i];
}
o1=o1/n,o2=o2/n;
for(int i=;i<n;i++){
a[i]=a[i]-o1,b[i]=b[i]-o2;
}
sort(a,a+n,compareangle);
sort(b,b+n,compareangle);
// printf("%.11f\n",a[0].abs());
// printf("%.11f\n",b[2].abs());
db ans = pi;
for(int i=;i<n;i++){//[0,n)~[i,i+n)
bool f=;
for(int j=;j<n;j++){
if(cmp(a[j].abs(),b[(i+j)%n].abs())!=){
f=;break;
}
}
if(f){
ans=min(ans,acos(dot(a[],b[i])/a[].abs()/b[i].abs()));
}
}
printf("%.11f\n",ans);
}
/**
先求出来每个点对中心的偏移量。
确实是乱序的,但是我们可以极角排序,这样一定是一个
循环移位匹配到另一个循环移位。
所以枚举n次就可以,check也十分简单
*/
100837D的更多相关文章
随机推荐
- ArcGIS Server 10.0 安装及使用完整攻略
引言 ArcGIS Server 10.0在使用和安装的过程中,需要进行比较全面的学习,才能正确使用.缺乏正确的指引,用户很容易在安装及使用中遇到问题.所以笔者在此总结Server 10.0的安装及使 ...
- 已知 $AB$, 求 $BA$
设 $A,B$ 分别是 $3\times 2$ 和 $2\times 3$ 实矩阵. 若 $\dps{AB=\sex{\ba{ccc} 8&0&-4\\ -\frac{3}{2}& ...
- js倒计时一分钟
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 408 JavaScript 变量、数据类型、正则
JavaScript 特点 是一门解释性脚本语言 .基于对象脚本编程.简单性(弱类型).安全性.动态性.跨平台 作用: 初学js 引入方式 与html有相同之处 也是3种1 用JavaScript前缀 ...
- webpack学习记录
webpack 中文网站 https://webpack.docschina.org/ webpack1 有编译打包 模块热更新 代码分割 文件处理功能 webpack2 tree Shaking( ...
- gzip 压缩
nginx 开启静态 gzip 配合 Vue 构建 在站点配置添加如下代码: location ~* \.(css|js)$ { gzip_static on; } 这是 nginx 的静态 gz ...
- 【转】mac环境下Android 反编译
一.需要的工具 apktool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件. dex2jar:将反编译后的classes.dex文件转化为.jar文件. jd ...
- 使用Python进行OCR -- 识别图片中的文字
工具 Tesseract pytesseract tesserocr 朋友需要一个工具,将图片中的文字提取出来.我帮他在网上找了一些OCR的应用,都不好用.所以准备自己研究,写一个Web APP供他使 ...
- codeforces 915E - Physical Education Lessons 动态开点线段树
题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...
- 错误: H.264 bitstream malformed, no startcode found,
使用命令 ffmpeg -i hbg.flv -c copy hbg.ts 时遇到如下错误: ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) ...