[USACO12FEB]Symmetry
传送门:
https://www.luogu.com.cn/problem/P3046
https://ac.nowcoder.com/acm/contest/6306/G
题意
给定n个不同的点,求这个点集有多少条对称轴
题解
对于一个点只有两种情况,一种是和另一个点关于这条线对称,一种是在对称轴上。
第一种情况:随机选择一个点p,枚举其他的点和他形成的对称轴,然后再判断这个对称轴是不是点集的对称轴。
第二种情况:当点在对称轴上时,要么另一个点 q 也在对称轴上,两点所在的直线是对称轴,这种情况直接判断这个对称轴是不是点集的对称轴。要么另一个点 q 关于这个点 p 所在的直线有对称点,这个时候按照第一种情况随机点为 q ,枚举其他点和他形成的对称轴,但是这个对称轴要经过点 p 。
想法很好理解,但是实现很难,在洛谷看到了一个题解,代码比较容易理解。
https://www.luogu.com.cn/blog/jzzcjb/dui-cheng-xing-symmetry-ti-xie
用到的数学结论
两点(x1,y1)(x2,y2)求过两点直线Ax+By+C=0
A=y2-y1 B=x1-x2 C=x2*y1-x1*y2 两点(x1,y1)(x2,y2)求两点间的对称轴Ax+By+C=0
A=x1-x2 B=y1-y2 C=-((x1+x2)(x1-x2)+(y1+y2)(y1-y2))/2 求(x',y')关于直线 Ax+By+C=0 的对称点(x0,y0)
设 k=-2*(A*x'+B*y'+C)/(A*A+B*B);
x0=x'+k*A;
y0=y'+k*B;
代码
优化了一下这个题解的代码,可以直接用set来记录一对点是否存在
1 #include<bits/stdc++.h>
2 #define eps 1e-6
3 using namespace std;
4
5 int n,cnt,x[100100],y[100100];
6 set<pair<int,int> >s;
7
8 bool dy(double x,double y){return ((x-y<=eps)||(y-x<=eps));}
9
10 bool is(double A,double B,double C){//判断某条直线是否是对称轴
11 for(int i=1;i<=n;i++){
12 /*
13 求(x',y')关于直线 Ax+By+C=0 的对称点(x0,y0)
14 设 k=-2*(A*x'+B*y'+C)/(A*A+B*B);
15 x0=x'+k*A;
16 y0=y'+k*B;
17 */
18 double k=-2*(double)(A*x[i]+B*y[i]+C)/(A*A+B*B);
19 double xo=x[i]+k*A;int xx=round(xo);
20 double yo=y[i]+k*B;int yy=round(yo);
21 if(!s.count({xx,yy})) return 0;
22 }
23 return 1;
24 }
25
26 bool check(int a,int b){ //以两点为一对对称点
27 //A=x1-x2 B=y1-y2 C=-((x1+x2)(x1-x2)+(y1+y2)(y1-y2))/2
28 double A=x[a]-x[b];
29 double B=y[a]-y[b];
30 double C=(double)-((x[a]*x[a]-x[b]*x[b])+(y[a]*y[a]-y[b]*y[b]))/2;
31 if(a!=1&&A*x[1]+B*y[1]+C!=0) return 0;
32 return is(A,B,C);
33 }
34
35 bool ok(int a,int b){ //以两点所在直线为对称轴
36 //A=y2-y1 B=x1-x2 C=x2*y1-x1*y2
37 int A=y[b]-y[a];
38 int B=x[a]-x[b];
39 int C=x[b]*y[a]-x[a]*y[b];
40 return is(A,B,C);
41 }
42
43 int main()
44 {
45 cin>>n;
46 for(int i=1;i<=n;i++) cin>>x[i]>>y[i],s.insert({x[i],y[i]});
47 for(int i=2;i<=n;i++) cnt+=check(1,i);
48 for(int i=2;i<n;i++) cnt+=check(i,n);
49 cout<<cnt+ok(1,n);
50 }
[USACO12FEB]Symmetry的更多相关文章
- bzoj2592: [Usaco2012 Feb]Symmetry
Description After taking a modern art class, Farmer John has become interested in finding geometric ...
- Symmetry(对称轴存在问题)
Symmetry Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description Th ...
- fzu 2035 Axial symmetry(枚举+几何)
题目链接:fzu 2035 Axial symmetry 题目大意:给出n个点,表示n边形的n个顶点,判断该n边形是否为轴对称图形.(给出点按照图形的顺时针或逆时针给出. 解题思路:将相邻两个点的中点 ...
- [刷题]算法竞赛入门经典(第2版) 5-6/UVa1595 - Symmetry
题意:平面上给若干点,问它们是不是关于某垂直于x轴的直线对称. 代码:(Wrong Answer, –ms) //UVa1595 - Symmetry #include<iostream> ...
- rosetta对称性文件(rosetta symmetry file)的产生及应用
针对对称性PDB 3UKM,使用make_symmdef_file.pl脚本,可以执行产生对称单元及对称文件: $> $ROSETTA3/src/apps/public/symmetry/mak ...
- 洛谷P3048 [USACO12FEB]牛的IDCow IDs
P3048 [USACO12FEB]牛的IDCow IDs 12通过 67提交 题目提供者lin_toto 标签USACO2012 难度普及/提高- 时空限制1s / 128MB 提交 讨论 题解 ...
- Codeforces Round #127 (Div. 1) A. Clear Symmetry 打表
A. Clear Symmetry 题目连接: http://codeforces.com/contest/201/problem/A Description Consider some square ...
- 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows
P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...
- 洛谷P3045 [USACO12FEB]牛券Cow Coupons
P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...
随机推荐
- Redis核心原理-简单动态字符串SDS
SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...
- SQL注入之堆叠注入(堆查询注入)
Stached injection -- 堆叠注入 0x00 堆叠注入的定义 Stacked injection 汉语翻译过来后,称 为堆查询注入,也有称之为堆叠注入.堆叠注入为攻击者提供了很多的 ...
- JDK1.7-HashMap原理
JDK1.7 HashMap 如何在源码上添加自己的注释 打开jdk下载位置 解压src文件夹,打开idea,ctrl+shift+alt+s打开项目配置 选择jdk版本1.7,然后点击Sourcep ...
- LeetCode105 从前序和中序序列构造二叉树
题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...
- AI智能皮肤测试仪助力美业数字化营销 实现门店与用户双赢局面
当皮肤遇到AI智能,会有怎么样的火花呢?随着生活水平的提升,人们对肌肤保养护理的需求也越来越高,人要美,皮肤养护也要更精准,数字化必将成为美业发展的新契机.新机遇下肌肤管家SkinRun为美业客户提供 ...
- 浅谈JVM垃圾回收
JVM内存区域 要想搞懂啊垃圾回收机制,首先就要知道垃圾回收主要回收的是哪些数据,这些数据主要在哪一块区域. Java8和Java8之前的相同点有很多. 都有虚拟机栈,本地方法栈,程序计数器,这三个是 ...
- 串的模式匹配算法1 BF算法
BF算法 字符串的模式匹配不一定要从主串的第一个位置开始,可以指定主串中查找的起始位置 pos. 2. 算法步骤: 1)分别利用计数器指针 i 和 j 指定主串和模式串即小字符串待比较的位置,初始化为 ...
- 那些最全面的Windows10安装pytorch踩过的坑以及如何应用
那些最全面的Windows10安装pytorch踩过的坑以及如何应用 一.pytorch简介 2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch.它是一个基 ...
- newbee-mall 开源商城新计划:秒杀功能、优惠券、对接支付宝
新项目是 newbee-mall 的升级版本,暂时就叫它 newbee-mall-plus 吧,第一阶段会开发秒杀功能.优惠券.对接支付宝这些功能,也会慢慢加入 Redis. Elastic Sear ...
- 【译】Async/Await(三)——Aysnc/Await模式
原文标题:Async/Await 原文链接:https://os.phil-opp.com/async-await/#multitasking 公众号: Rust 碎碎念 翻译 by: Praying ...