HDU 6631 line symmetric(枚举)
首先能想到的是至少有一对相邻点或者中间间隔一个点的点对满足轴对称,那么接下来只需要枚举剩下的点对是否满足至多移动一个点可以满足要求。
第一种情况,对于所有点对都满足要求,那么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(枚举)的更多相关文章
- HDU 6631 line symmetric 计算几何
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6631 题意:共\(T\)组数据,每组数据给出\(n\)个点的坐标,这\(n\)个点按顺序给出,相邻的点 ...
- HDU 3400 Line belt (三分再三分)
HDU 3400 Line belt (三分再三分) ACM 题目地址: pid=3400" target="_blank" style="color:rgb ...
- HDU 5778 abs (枚举)
abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...
- 三分套三分 --- HDU 3400 Line belt
Line belt Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3400 Mean: 给出两条平行的线段AB, CD,然后一 ...
- 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 ...
- HDU 4709 Herding (枚举)
Herding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 4462Scaring the Birds(枚举所有状态)
Scaring the Birds Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2015多校第6场 HDU 5358 First One 枚举,双指针
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358 题意:如题. 解法:观察式子发现,由于log函数的存在,使得这个函数的值域<=34,然后我 ...
- 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 ...
随机推荐
- classloader加载class的流程及自定义ClassLoader
java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...
- div中放入一个img元素导致div高度会多出几个像素
在写代码的时候经常遇到这样一个问题,如果div里嵌套一个img元素且div的高度是由img的高度来撑开,那么div的高度总会比img的高度多3px.好了,废话不多说,直接给大家上代码. html代码: ...
- python 布尔判断并做需要的返回值
- 洛谷P1077 摆花——题解
题目传送 题目大意:有按顺序放的n种花,相同种类的花放一起,每种花最多放ai盆,共放了m盆花,求放花方案数. 求方案个数一般有以下思路:1.搜索:2.递推/动态规划:3.贪心:4.分治... 玄学估计 ...
- linux 多进程并发服务__关于子进程回收的方法
以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...
- Linux基础命令及使用帮助
一.内部命令 内置命令(builtin):由shell程序自带的命令 help:查看内部命令 enable -n command 禁用某内部命令 enable -n 查看全部被禁用的命令 enable ...
- UE4 质心相关
Add force 始终给质心施加力,即使手动偏移了质心(Center of mass)也不例外. Add force at location local 相对于物体的原始质心位置增加一个偏移值后的位 ...
- Spring Cloud Commons教程(三)忽略网络接口
有时,忽略某些命名网络接口是有用的,因此可以将其从服务发现注册中排除(例如,在Docker容器中运行).可以设置正则表达式的列表,这将导致所需的网络接口被忽略.以下配置将忽略“docker0”接口和以 ...
- 阿里云服务器+ubantu+nodejs 服务器基本配置流程
所有步骤在MAC 电脑环境下操作 一.配置环境 1.连接到远程服务器 1.购买阿里云ECS服务器,我选用的 ubantu 14.0.4 (64位),购买的时候输入的密码记录下来,没有设置的话可以随后在 ...
- MacOS下Java Mission Control无法正常启动
参考JMC(Java Mission Control)在mac下无法启动和显示界面 附件下载地址备份(org.eclipse.swt.cocoa.macosx.x86_64-3.112.0.jar) ...