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 ...
随机推荐
- 使用RAP2模拟假数据实现前后端分离
一.为什么使用RAP2 在一个项目的开发中,在页面需要使用大量数据进行渲染生成前,后端开发人员的接口可能还没有写完, 当前端没有后端数据支持的情况下,我们使用mock.js(mock.js用于生成随机 ...
- delphi 10.3.1 android沉浸式透明状态栏
从10.2升级上来, 之前的沉浸状态栏在android手机上不透明了, 添加二个发布文件,remote path分别设为 res\values-v21和 res\values-v19 style.xm ...
- Linux内核设计与实现 总结笔记(第十五章)进程地址空间
一.地址空间 进程地址空间由进程可寻址的虚拟内存组成,内核允许进程使用这种虚拟内存中的地址. 每个进程都有一个32位或64位的平坦地址空间,空间的具体大小取决于体系结构.“平坦”指的是地址空间范围是一 ...
- 可用来修改bean对象的BeanPostProcessor
可用来修改bean对象的BeanPostProcessor 11.1 简介 BeanPostProcessor是Spring中定义的一个接口,其与之前介绍的InitializingBean和Dispo ...
- 循环结构for语句-求和思想
循环结构for语句的练习-求和思想:需求1:求出1到10之间的数据和 public static void main(String[] args) { int sum = 0; for(int i = ...
- BZOJ 4923: [Lydsy1706月赛]K小值查询 Splay + 思维
Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...
- monit-日志监控工具
前段时间,CTO下达了一个brief,需要搭建monit日志监控应用,匹配日志中的异常信息,自动发送邮件/微信告警.具体的要求如下: 1.监控***项目的各个应用,nginx的日志,匹配到错误时发送告 ...
- python图像处理——频率域增强
图像的傅里叶变换: import chardet import numpy as np import cv2 as cv import cv2 from PIL import Image import ...
- EQS 自定义Context 如何用Testing Pawn 进行测试?
比如自定义了一个玩家的Context, 那么需要把这个玩家直接放置到场景中 在Context中override Provide Single Actor函数,按类型获取所有的Actor,其中第一个作为 ...
- Spring Cloud架构教程 (七)消息驱动的微服务(核心概念)【Dalston版】
下图是官方文档中对于Spring Cloud Stream应用模型的结构图.从中我们可以看到,Spring Cloud Stream构建的应用程序与消息中间件之间是通过绑定器Binder相关联的,绑定 ...