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 ...
随机推荐
- Springboot配置文件占位符
一.配置文件占位符 1.application.properties server.port=8088 debug=false product.id=ID:${random.uuid} product ...
- 与Swing的相识
参考自http://c.biancheng.net/swing/ Swing是一个用于Java GUI编程(图形界面设计)的工具包(类库):换句话说,java可以用来开发带界面的PC软件,使用到的工具 ...
- ESP8266的使用学习
ESP8266-01 ESP8266-12F简介 让灯闪烁 ESP8266-中断 模拟输入(ADC-A0) 模拟输出(PWM) 串口通信(Serial) EEPROM类库的使用 ...
- Alter改变终结
#alter#删除date列但若表中只有一个字段无法使用drop删除ALTER TABLE z_staff_info_copy1 DROP `date`;ALTER TABLE z_staff_inf ...
- echart--如何将echart的配置项,放到webpack中(CHARTTEMPLATE时)
1.假如,我们已经写好了组件,我们需要把它放入到一个环境中去 2.首先在index.html中,我们需要写一个dom结构 3.新建一个,chart.js文件(这个里面放组件的代码) 1>开始创建 ...
- tweenMax+如何让数字由初始值动画到结束的值
html: <div class="wz1">0</div> css: .wz1{ width: 114px; height: 30px; position ...
- 3,ActiveMQ-入门(基于JMS发布订阅模型)
一.Pub/Sub-发布/订阅消息传递模型 在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端.在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅 ...
- 12 Spring Boot密码加密算法
- Vue框架基础概要
Vue.js是什么? Vue.js(读音 /vjuː/,类似于 view 的读音)是一套构建用户界面(user interface)的渐进式框架.与其他重量级框架不同的是,Vue 从根本上采用最小成本 ...
- WEB实现大文件上传和下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...