传送门:

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的更多相关文章

  1. bzoj2592: [Usaco2012 Feb]Symmetry

    Description After taking a modern art class, Farmer John has become interested in finding geometric ...

  2. Symmetry(对称轴存在问题)

    Symmetry Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description   Th ...

  3. fzu 2035 Axial symmetry(枚举+几何)

    题目链接:fzu 2035 Axial symmetry 题目大意:给出n个点,表示n边形的n个顶点,判断该n边形是否为轴对称图形.(给出点按照图形的顺时针或逆时针给出. 解题思路:将相邻两个点的中点 ...

  4. [刷题]算法竞赛入门经典(第2版) 5-6/UVa1595 - Symmetry

    题意:平面上给若干点,问它们是不是关于某垂直于x轴的直线对称. 代码:(Wrong Answer, –ms) //UVa1595 - Symmetry #include<iostream> ...

  5. rosetta对称性文件(rosetta symmetry file)的产生及应用

    针对对称性PDB 3UKM,使用make_symmdef_file.pl脚本,可以执行产生对称单元及对称文件: $> $ROSETTA3/src/apps/public/symmetry/mak ...

  6. 洛谷P3048 [USACO12FEB]牛的IDCow IDs

    P3048 [USACO12FEB]牛的IDCow IDs 12通过 67提交 题目提供者lin_toto 标签USACO2012 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 ...

  7. Codeforces Round #127 (Div. 1) A. Clear Symmetry 打表

    A. Clear Symmetry 题目连接: http://codeforces.com/contest/201/problem/A Description Consider some square ...

  8. 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...

  9. 洛谷P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...

随机推荐

  1. 敏捷史话(三):笃定前行的勇者——Ken Schwaber

    很多人之所以平凡,并不在于能力的缺失,而是因为缺乏迈出一步的勇气.只有少部分的人可以带着勇气和坚持,走向不凡.Ken Schwaber 就是这样的人,他带着他的勇气和坚持在敏捷的道路上不断前行,以实现 ...

  2. SonarQube学习(五)- SonarQube之自定义规则使用

    一.前言 古人云:"欲速则不达",最近真的是深有体会.学习也是如此,不是一件着急的事,越是着急越不会. 就拿SonarQube来说吧,去年年末就想学来着,但是想着想着就搁置了,有时 ...

  3. 【SpringBoot1.x】SpringBoot1.x 任务

    SpringBoot1.x 任务 文章源码 异步任务 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的.但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使 ...

  4. 【MyBatis】MyBatis 缓存

    MyBatis 缓存 文章源码 什么是缓存 像大多数的持久化框架一样,MyBatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能. Mybatis 中缓存分为一级缓存,二级缓存 ...

  5. LeetCode394 字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. 你可 ...

  6. Centos7安装Jenkins和目录迁移

    Centos7安装Jenkins和目录迁移 内容: 安装Jenkins和相关的配置 尝试目录迁移,模拟磁盘空间不足 1. 安装Jenkins和配置 安装 根据Jenkins的官方安装指引,安装步骤如下 ...

  7. 【Linux】nohup和&的区别

    同样都是后台执行进程,但是nohup和&有什么区别呢? & 是指后台运行: nohup 的功能和& 之间的功能并不相同. 其中,nohup 可以使得命令永远运行下去和用户终端没 ...

  8. 使用yaml配置文件管理资源

    [root@k8s-master ~]# vim nginx-deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: n ...

  9. 优化太多的if-else

    来源java小当家 第1种方法:提前return,减少else判断 1 // 1.优化前 2 private int handlerPre1(boolean flag) { 3 if(flag){ 4 ...

  10. Ice系列--基于IceGrid的部署方案

    前言 前一篇文章介绍了IceGrid的简单应用.这篇文章来介绍一下它的高端玩法-如何将模板,复制组,知名对象应用于部署方案及其作用. 基于模板的部署方案 之前介绍了xml格式的配置文件通过各种描述符如 ...