HDU 6631 line symmetric(枚举)

首先能想到的是至少有一对相邻点或者中间间隔一个点的点对满足轴对称,那么接下来只需要枚举剩下的点对是否满足至多移动一个点可以满足要求。

第一种情况,对于所有点对都满足要求,那么Yes。

第二种情况,有一个点不满足要求,那么显然这种情况只可能是奇数点的时候才出现,那么只需要将这个点移到对称轴上则满足要求,那么Yes。

第三种情况,有两个点不满足要求,然后我们需要枚举这两个点对应的对称点是否满足要求,对于其中一个点的对称点判断他是否和之前所有点重合,以及判断这个点是否在对称轴上。

这样还不够,还需要考虑对于对称轴两边的可能的对应的对称点,他们是不是在对应一侧,如果两个点都不在对应的一侧,说明这两个点自交,则不能满足要求,直接跳过。

多注意细节吧,现场wa到自闭。

数据:

5
-100 -100
0 0
-100 100
2 -1
100 1
N7
-3 3
-5 -5
1 -3
-1 -3
0 2
5 -5
3 3
N

附图说明:

  1 //        ——By DD_BOND
  2 
  3 //#include<bits/stdc++.h>
  4 //#include<unordered_map>
  5 //#include<unordered_set>
  6 #include<functional>
  7 #include<algorithm>
  8 #include<iostream>
  9 //#include<ext/rope>
 10 #include<iomanip>
 11 #include<climits>
 12 #include<cstring>
 13 #include<cstdlib>
 14 #include<cstddef>
 15 #include<cstdio>
 16 #include<memory>
 17 #include<vector>
 18 #include<cctype>
 19 #include<string>
 20 #include<cmath>
 21 #include<queue>
 22 #include<deque>
 23 #include<ctime>
 24 #include<stack>
 25 #include<map>
 26 #include<set>
 27 
 28 #define fi first
 29 #define se second
 30 #define MP make_pair
 31 #define pb push_back
 32 
 33 typedef long long ll;
 34 
 35 using namespace std;
 36 
 37 const int MAXN=1e3+10;
 38 const double eps=1e-12;
 39 const double pi=acos(-1.0);
 40 const ll INF=0x3f3f3f3f3f3f3f3f;
 41 
 42 inline int dcmp(double x){
 43     if(fabs(x)<eps)    return 0;
 44     return (x>0? 1: -1);
 45 }
 46 
 47 inline double sqr(double x){ return x*x; }
 48 
 49 struct Point{
 50     double x,y;
 51     Point(){ x=0,y=0; }
 52     Point(double _x,double _y):x(_x),y(_y){}
 53     void input(){ scanf("%lf%lf",&x,&y); }
 54     bool operator ==(const Point &b)const{
 55         return (dcmp(x-b.x)==0&&dcmp(y-b.y)==0);
 56     }
 57     Point operator +(const Point &b)const{
 58         return Point(x+b.x,y+b.y);
 59     }
 60     Point operator -(const Point &b)const{
 61         return Point(x-b.x,y-b.y);
 62     }
 63     Point operator *(double a){
 64         return Point(x*a,y*a);
 65     }
 66     Point operator /(double a){
 67         return Point(x/a,y/a);
 68     }
 69     double len2(){    //长度平方
 70         return sqr(x)+sqr(y);
 71     }
 72     Point rotate_left(){    //逆时针旋转90度
 73         return Point(-y,x);
 74     }
 75 };
 76 
 77 inline double cross(Point a,Point b){    //叉积
 78     return a.x*b.y-a.y*b.x;
 79 }
 80 
 81 inline double dot(Point a,Point b){    //点积
 82     return a.x*b.x+a.y*b.y;
 83 }
 84 
 85 struct Line{
 86     Point s,e;
 87     Line(){}
 88     Line(Point _s,Point _e):s(_s),e(_e){} //两点确定直线
 89 };
 90 
 91 int relation(Point p,Line l){    //点和向量关系   1:左侧   2:右侧   3:在线上
 92     int c=dcmp(cross(p-l.s,l.e-l.s));
 93     if(c<0)    return 1;
 94     else if(c>0)    return 2;
 95     else    return 3;
 96 }
 97 
 98 Point projection(Point p,Line a){        //点在直线上的投影
 99     return a.s+(((a.e-a.s)*dot(a.e-a.s,p-a.s))/(a.e-a.s).len2());
100 }
101 
102 Point symmetry(Point p,Line a){            //点关于直线的对称点
103     Point q=projection(p,a);
104     return Point(2*q.x-p.x,2*q.y-p.y);
105 }
106 
107 int vis[MAXN];
108 vector<Line>st;
109 Point point[MAXN];
110 
111 int main(void){
112     int T;  scanf("%d",&T);
113     while(T--){
114         int n,ans=0;  scanf("%d",&n);
115         for(int i=0;i<n;i++)    point[i].input();
116         for(int i=0;i<n&&!ans;i++){
117             int s=i,t=(i+1)%n;
118             Point mid=(point[s]+point[t])/2,vec=(point[s]-point[t]).rotate_left();
119             Line line(mid,mid+vec);
120             int num=0,error=0;
121             memset(vis,0,sizeof(vis));
122             while(!vis[s]&&!vis[t]){
123                 vis[s]=1,vis[t]=1;
124                 Point p1=(point[s]+point[t])/2,dir=(point[s]-point[t]).rotate_left();
125                 Point p2=p1+dir;
126                 if(dcmp(cross(point[i]-mid,vec))*dcmp(cross(point[s]-mid,vec))<0&&dcmp(cross(point[(i+1)%n]-mid,vec))*dcmp(cross(point[t]-mid,vec))<0)   error=1;
127                 if(relation(p1,line)==3&&relation(p2,line)==3){
128                     if(s!=t)    num+=2;
129                     else    num++;
130                 }
131                 s=(s-1+n)%n,t=(t+1)%n;
132             }
133             if(error)   continue;
134             if(num+1>=n)  ans=1;
135             else if(num+2==n){
136                 s=i,t=(i+1)%n;
137                 memset(vis,0,sizeof(vis));
138                 while(!vis[s]&&!vis[t]){
139                     vis[s]=1,vis[t]=1;
140                     Point p1=(point[s]+point[t])/2,vec=(point[s]-point[t]).rotate_left();
141                     Point p2=p1+vec;
142                     if(relation(p1,line)!=3||relation(p2,line)!=3){
143                         if(relation(point[s],line)!=3&&relation(point[t],line)!=3){
144                             int f1=0,f2=0;
145                             Point s1=symmetry(point[s],line),s2=symmetry(point[t],line);
146                             for(int j=0;j<n;j++)
147                                 if(point[j]==s1)
148                                     f1=1;
149                             for(int j=0;j<n;j++)
150                                 if(point[j]==s2)
151                                     f2=1;
152                             if(!f2||!f1) ans=1;
153                         }
154                         break;
155                     }
156                     s=(s-1+n)%n,t=(t+1)%n;
157                 }
158             }
159         }
160         for(int i=0;i<n&&!ans;i++){
161             int s=(i-1+n)%n,t=(i+1)%n;
162             Point mid=(point[s]+point[t])/2,vec=(point[s]-point[t]).rotate_left();
163             Line line(mid,mid+vec);
164             int num=0,error=0;  s=t=i;
165             memset(vis,0,sizeof(vis));
166             while(!vis[s]&&!vis[t]){
167                 vis[s]=1,vis[t]=1;
168                 Point p1=(point[s]+point[t])/2,dir=(point[s]-point[t]).rotate_left();
169                 Point p2=p1+dir;
170                 if(dcmp(cross(point[(i-1+n)%n]-mid,vec))*dcmp(cross(point[s]-mid,vec))<0&&dcmp(cross(point[(i+1)%n]-mid,vec))*dcmp(cross(point[t]-mid,vec))<0)   error=1;
171                 if(relation(p1,line)==3&&relation(p2,line)==3){
172                     if(s!=t)    num+=2;
173                     else    num++;
174                 }
175                 s=(s-1+n)%n,t=(t+1)%n;
176             }
177             if(error)   continue;
178             if(num+1>=n)  ans=1;
179             else if(num+2==n){
180                 s=t=i;
181                 memset(vis,0,sizeof(vis));
182                 while(!vis[s]&&!vis[t]){
183                     vis[s]=1,vis[t]=1;
184                     Point p1=(point[s]+point[t])/2,vec=(point[s]-point[t]).rotate_left();
185                     Point p2=p1+vec;
186                     if(relation(p1,line)!=3||relation(p2,line)!=3){
187                         if(relation(point[s],line)!=3&&relation(point[t],line)!=3){
188                             int f1=0,f2=0;
189                             Point s1=symmetry(point[s],line),s2=symmetry(point[t],line);
190                             for(int j=0;j<n;j++)
191                                 if(point[j]==s1)
192                                     f1=1;
193                             for(int j=0;j<n;j++)
194                                 if(point[j]==s2)
195                                     f2=1;
196                             if(!f2||!f1) ans=1;
197                         }
198                         break;
199                     }
200                     s=(s-1+n)%n,t=(t+1)%n;
201                 }
202             }
203         }
204         if(ans) puts("Y");
205         else    puts("N");
206     }
207     return 0;
208 }

 

转载于:https://www.cnblogs.com/dd-bond/p/11308155.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习数字图像处理经验谈

一、面向应用&#xff1a;层层分解、抓住要点 我们学习数字图像处理的最终目的还是应用&#xff0c;不管是用它来研制产品还是研发项目抑或是研究课题&#xff0c;都要用数字图像处理的理论、方法和技术来解决实际问题。在此过程中&#xff0c;提高效率是非常重要的&#xff0c…

react-router-dom@6获取路由传参

目录 参数获取 1、子路由形式携带 2、问号(?)形式参数 3、事件跳转传参 router/index.tsx import App from "App"; import Home from "pages/Home"; import List from "pages/List"; import Detail from "pages/Detail"; import…

koa洋葱模型

Koa 和 Express 都会使用到中间件 Express的中间件是顺序执行&#xff0c;从第一个中间件执行到最后一个中间件&#xff0c;发出响应如上图 Koa是从第一个中间件开始执行&#xff0c;遇到 next 进入下一个中间件&#xff0c;一直执行到最后一个中间件&#xff0c;在逆序&#x…

koa后端允许跨域

举个例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width…

python面向对象之继承

面向对象之继承 什么是面向对象的继承&#xff1f; 继承&#xff08;英语&#xff1a;inheritance&#xff09;是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B&#xff0c;就把这个A称 为“B的子类别”&#xff0c;而把B称为“A的父类别”也可以称“B是…

美国正面临“人才泡沫”破裂危机?

&#xff08;Jason Lane和Kevin Kinser/文&#xff09;最近&#xff0c;与教育有关的种种问题在美国社会引起了广泛讨论。首先巨额的学生贷款问题&#xff1a;根据美联储纽约分行在2012年11月发布的一份报告&#xff0c;全美学生贷款总额已经达到420亿美元&#xff0c;其中新增…

ngrx学习笔记

什么是ngrx ngrx是Angular基于Rxjs的状态管理&#xff0c;保存了Redux的核心概念&#xff0c;并使用RxJs扩展的Redux实现。使用Observable来简化监听事件和订阅等操作。 在看这篇文章之前&#xff0c;已经假设你已了解rxjs和redux。 有条件的话请查看官方文档进行学习理解。 所…

.slice(0)

高手代码里看到.slice(0)&#xff0c;查了下这样写的好处&#xff1a; 1.对原数组进行深拷贝&#xff0c;这样进行一系列操作的时候就不影响原数组了&#xff1b; 2.将类数组对象转化为真正的数组对象&#xff1a;var anchorArray [].slice.call(document.getElementsByTagN…

亲历2013年TED大会:全球最潮灵感大会

本文转自&#xff1a;http://mooc.guokr.com/opinion/436837/ 本文由《外滩画报》供稿 文/华琪&#xff08;发自美国&#xff09; 编辑/吴慧雯 什么是TED的世界&#xff1f;在这里&#xff0c;你可以轻易发现各种名人出没的痕迹&#xff0c;和各个领域里最具远见卓识和创造…

Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明&#xff1a;Java生鲜电商平台中会员体系作为电商平台的基础设施&#xff0c;重要性不容忽视。我去年整理过生鲜电商中的会员系统&#xff0c;但是比较粗&#xff0c;现在做一个最好的整理架构. 设计电商会员体系需…

为什么要上大学?

为了让自己成为更有意思的人。 &#xff08;文&#xff0f;美国圣母大学哲学教授 Gary Gutting&#xff09;再不久&#xff0c;千千万万的大学生又将走完一个学期。他们中的很多人以及他们的家人&#xff0c;可能为刚刚过去的几个月或是几年投入了相当可观的时间、努力以及金钱…

打造“神犇”是教育的未来吗?

这年头&#xff0c;品学兼优、身怀特长的“神犇”&#xff0c;拼的不仅是天赋异禀和后天努力&#xff0c;更是身后爹妈的钱包&#xff0c;而本该实现社会公平的教育&#xff0c;反而加速和凝固了社会的不公。 高等教育的终极目标真的是造就学业超人吗&#xff1f;《纽约时报》刊…

AntD 官网样例 InputRef报错原因

在官网可编辑表格typescript样例里 const inputRef useRef<InputRef>(null); InputRef项目报错原因是ant design的版本问题! antd 4.19版本重写了input 可通过InputRef来使用input组件的ref

AntD 可编辑行表格

本地数据代码模板自用,官网例子改改 // 编辑行的自定义表格 import React, { useState } from "react"; import {Table,Input,InputNumber,Popconfirm,Form,Typography,Divider, } from "antd";interface Item {key: string;name: string;age: number;add…

三心二意,助你好运?

经验说&#xff1a;做事要专心致志。 实验说&#xff1a;专心致志常常让人缺少一双发现的眼睛。 专心致志从来都被当做一个美德来歌颂。从来我们就认为要想成为伟大的人就必须要像牛顿老师那样把钟当成吃的放到锅里煮才行&#xff0c;至少至少也得有能在集市上看书的本事。否则…

React Antd Upload自定义上传customRequest

单独的上传图片接口要传参,action方式不太适合,需要使用自定义上传customRequest覆盖 公司代码不可弄,就发一个可用的demo例子 import React, { useState } from "react"; import { render } from "react-dom"; import "antd/dist/antd.css"; i…

HDU 4109 Instrction Arrangement

题目链接&#xff1a;https://vjudge.net/problem/HDU-4109 题目大意 有 N 个指令&#xff0c;标号从 0 ~ N - 1&#xff0c;和 M 个指令间的先后关系&#xff0c;每个关系都有一个权值 w&#xff0c;表示后一个指令在前一个指令开始时间之后 w 纳秒才开始执行。现在要并发执行…

养成一个习惯需要多久?

有人说养成一个习惯需要21天&#xff0c;有人说30天……养成习惯到底需要多少天&#xff1f; _hzw 2012-11-09 18:04又快到年末了。 年初时&#xff0c;你曾许诺要养成一些好习惯&#xff0c;比如要常运动、多读书、少微博。有人说说养成一个习惯只需要坚持21天&#xff1b;21天…

vue3 eslint The template root requires exactly one element问题

vue项目中手动引入eslint npm install eslint --save-dev eslint初始化 npx eslint --init 运行时npm run lint 简单语法问题--fix会自动修复 但是vue3项目出现只能有一个根节点的问题 原因在于 eslintrc.js里extends中plugin:vue/essential的问题 看eslint-plugin-vue官网…

你所知道的学习方法,都是错的!

你所知道的学习方法&#xff0c;都是错的&#xff01; 上课的时候记笔记&#xff1f;哪门功课不行&#xff0c;就集中精力专项突击&#xff1f;自习的时候不要晃&#xff0c;选好一个地儿安安稳稳地待那儿学习&#xff1f;你还在这样学习吗&#xff1f;不要被骗了&#xff1a;这…