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

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

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

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

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

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

数据:

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

附图说明:

 //        ——By DD_BOND

 //#include<bits/stdc++.h>
//#include<unordered_map>
//#include<unordered_set>
#include<functional>
#include<algorithm>
#include<iostream>
//#include<ext/rope>
#include<iomanip>
#include<climits>
#include<cstring>
#include<cstdlib>
#include<cstddef>
#include<cstdio>
#include<memory>
#include<vector>
#include<cctype>
#include<string>
#include<cmath>
#include<queue>
#include<deque>
#include<ctime>
#include<stack>
#include<map>
#include<set> #define fi first
#define se second
#define MP make_pair
#define pb push_back typedef long long ll; using namespace std; const int MAXN=1e3+;
const double eps=1e-;
const double pi=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3f; inline int dcmp(double x){
if(fabs(x)<eps) return ;
return (x>? : -);
} inline double sqr(double x){ return x*x; } struct Point{
double x,y;
Point(){ x=,y=; }
Point(double _x,double _y):x(_x),y(_y){}
void input(){ scanf("%lf%lf",&x,&y); }
bool operator ==(const Point &b)const{
return (dcmp(x-b.x)==&&dcmp(y-b.y)==);
}
Point operator +(const Point &b)const{
return Point(x+b.x,y+b.y);
}
Point operator -(const Point &b)const{
return Point(x-b.x,y-b.y);
}
Point operator *(double a){
return Point(x*a,y*a);
}
Point operator /(double a){
return Point(x/a,y/a);
}
double len2(){ //长度平方
return sqr(x)+sqr(y);
}
Point rotate_left(){ //逆时针旋转90度
return Point(-y,x);
}
}; inline double cross(Point a,Point b){ //叉积
return a.x*b.y-a.y*b.x;
} inline double dot(Point a,Point b){ //点积
return a.x*b.x+a.y*b.y;
} struct Line{
Point s,e;
Line(){}
Line(Point _s,Point _e):s(_s),e(_e){} //两点确定直线
}; int relation(Point p,Line l){ //点和向量关系 1:左侧 2:右侧 3:在线上
int c=dcmp(cross(p-l.s,l.e-l.s));
if(c<) return ;
else if(c>) return ;
else return ;
} Point projection(Point p,Line a){ //点在直线上的投影
return a.s+(((a.e-a.s)*dot(a.e-a.s,p-a.s))/(a.e-a.s).len2());
} Point symmetry(Point p,Line a){ //点关于直线的对称点
Point q=projection(p,a);
return Point(*q.x-p.x,*q.y-p.y);
} int vis[MAXN];
vector<Line>st;
Point point[MAXN]; int main(void){
int T; scanf("%d",&T);
while(T--){
int n,ans=; scanf("%d",&n);
for(int i=;i<n;i++) point[i].input();
for(int i=;i<n&&!ans;i++){
int s=i,t=(i+)%n;
Point mid=(point[s]+point[t])/,vec=(point[s]-point[t]).rotate_left();
Line line(mid,mid+vec);
int num=,error=;
memset(vis,,sizeof(vis));
while(!vis[s]&&!vis[t]){
vis[s]=,vis[t]=;
Point p1=(point[s]+point[t])/,dir=(point[s]-point[t]).rotate_left();
Point p2=p1+dir;
if(dcmp(cross(point[i]-mid,vec))*dcmp(cross(point[s]-mid,vec))<&&dcmp(cross(point[(i+)%n]-mid,vec))*dcmp(cross(point[t]-mid,vec))<) error=;
if(relation(p1,line)==&&relation(p2,line)==){
if(s!=t) num+=;
else num++;
}
s=(s-+n)%n,t=(t+)%n;
}
if(error) continue;
if(num+>=n) ans=;
else if(num+==n){
s=i,t=(i+)%n;
memset(vis,,sizeof(vis));
while(!vis[s]&&!vis[t]){
vis[s]=,vis[t]=;
Point p1=(point[s]+point[t])/,vec=(point[s]-point[t]).rotate_left();
Point p2=p1+vec;
if(relation(p1,line)!=||relation(p2,line)!=){
if(relation(point[s],line)!=&&relation(point[t],line)!=){
int f1=,f2=;
Point s1=symmetry(point[s],line),s2=symmetry(point[t],line);
for(int j=;j<n;j++)
if(point[j]==s1)
f1=;
for(int j=;j<n;j++)
if(point[j]==s2)
f2=;
if(!f2||!f1) ans=;
}
break;
}
s=(s-+n)%n,t=(t+)%n;
}
}
}
for(int i=;i<n&&!ans;i++){
int s=(i-+n)%n,t=(i+)%n;
Point mid=(point[s]+point[t])/,vec=(point[s]-point[t]).rotate_left();
Line line(mid,mid+vec);
int num=,error=; s=t=i;
memset(vis,,sizeof(vis));
while(!vis[s]&&!vis[t]){
vis[s]=,vis[t]=;
Point p1=(point[s]+point[t])/,dir=(point[s]-point[t]).rotate_left();
Point p2=p1+dir;
if(dcmp(cross(point[(i-+n)%n]-mid,vec))*dcmp(cross(point[s]-mid,vec))<&&dcmp(cross(point[(i+)%n]-mid,vec))*dcmp(cross(point[t]-mid,vec))<) error=;
if(relation(p1,line)==&&relation(p2,line)==){
if(s!=t) num+=;
else num++;
}
s=(s-+n)%n,t=(t+)%n;
}
if(error) continue;
if(num+>=n) ans=;
else if(num+==n){
s=t=i;
memset(vis,,sizeof(vis));
while(!vis[s]&&!vis[t]){
vis[s]=,vis[t]=;
Point p1=(point[s]+point[t])/,vec=(point[s]-point[t]).rotate_left();
Point p2=p1+vec;
if(relation(p1,line)!=||relation(p2,line)!=){
if(relation(point[s],line)!=&&relation(point[t],line)!=){
int f1=,f2=;
Point s1=symmetry(point[s],line),s2=symmetry(point[t],line);
for(int j=;j<n;j++)
if(point[j]==s1)
f1=;
for(int j=;j<n;j++)
if(point[j]==s2)
f2=;
if(!f2||!f1) ans=;
}
break;
}
s=(s-+n)%n,t=(t+)%n;
}
}
}
if(ans) puts("Y");
else puts("N");
}
return ;
}

HDU 6631 line symmetric(枚举)的更多相关文章

  1. HDU 6631 line symmetric 计算几何

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6631 题意:共\(T\)组数据,每组数据给出\(n\)个点的坐标,这\(n\)个点按顺序给出,相邻的点 ...

  2. HDU 3400 Line belt (三分再三分)

    HDU 3400 Line belt (三分再三分) ACM 题目地址:  pid=3400" target="_blank" style="color:rgb ...

  3. HDU 5778 abs (枚举)

    abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...

  4. 三分套三分 --- HDU 3400 Line belt

    Line belt Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3400 Mean: 给出两条平行的线段AB, CD,然后一 ...

  5. HDU 3835 R(N)(枚举)

    题目链接 Problem Description We know that some positive integer x can be expressed as x=A^2+B^2(A,B are ...

  6. HDU 4709 Herding (枚举)

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. HDU 4462Scaring the Birds(枚举所有状态)

    Scaring the Birds Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 2015多校第6场 HDU 5358 First One 枚举,双指针

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358 题意:如题. 解法:观察式子发现,由于log函数的存在,使得这个函数的值域<=34,然后我 ...

  9. HDU 4431 Mahjong(枚举+模拟)(2012 Asia Tianjin Regional Contest)

    Problem Description Japanese Mahjong is a four-player game. The game needs four people to sit around ...

随机推荐

  1. nginx图片过滤处理模块http_image_filter_module

    nginx图片过滤处理模块http_image_filter_module安装配置笔记 http_image_filter_module是nginx提供的集成图片处理模块,支持nginx-0.7.54 ...

  2. NOIP2016 D1T1 玩具谜题

    洛谷P1563 看完了noip2017觉得noip2016是真的简单……2017第一题就卡住2016第一题10分钟AC 思路: m<=100000很明显暴力模拟就可以 唯一有一点点难度的地方就是 ...

  3. SpringBoot整合AOP

    一.创建LogComponent类     类上加上@Component和@Aspect 表示把该类注册成spring组件和aop         二.创建6个方法     2.1     @Poin ...

  4. jquery +点击按钮,切换div内容,按钮加高亮

    html: <div class="dw4"> <span class="dw">单位(次)</span> <div ...

  5. 【CF1252F】Regular Forestation(重心,树同构)

    题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预 ...

  6. .NET COM+级别的事务Transaction实现

    参考: https://docs.microsoft.com/zh-cn/dotnet/api/system.enterpriseservices.contextutil?view=netframew ...

  7. 手把手教你做echarts图表系列之组织结构图

    在实际项目中使用echarts越来越多了,今天从一个组织结构图开始,手把手教大家开发echarts图表. 公司里的组织结构图如下: 可以参考echarts入门教程:http://echarts.bai ...

  8. 手把手教你学Vue-3(路由)

    1.路由的作用 1.当我们有多个页面的时候 ,我们需要使用路由,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们. 简单的路由 const ro ...

  9. (转)Matplotlib的子图subplot的使用

    转:https://www.jianshu.com/p/de223a79217a 前言 Matplotlib的可以把很多张图画到一个显示界面,这就设计到面板切分成一个一个子图.这是怎么做到的呢.mat ...

  10. Flashtext:大规模数据清洗的利器

    Flashtext:大规模数据清洗的利器 在这篇文章中,我们将介绍一种新的关键字搜索和替换的算法:Flashtext 算法.Flashtext 算法是一个高效的字符搜索和替换算法.该算法的时间复杂度不 ...