Codeforeces 13B-Letter A

二维基础

题目链接:https://codeforces.com/problemset/problem/13/B
题意:给定三条线段,判断三条线段是否是“A”形的。“A”形的定义如下:
  1. 线段A和线段B有一个公共点。
  2. 线段C的两个端点分别位于线段A和线段B上。
  3. 线段A和线段B所形成的夹角在\((0^\circ,90^\circ]\)。
  4. 线段C分线段A为\(x_1\)和\(x_2\)两部分且较短线段与较长线段的比值大于等于\(1/4\),线段B亦是。
思路:这是一道十分基础的练习题。只需要读取输入后按照条件一项一项判断即可。对于每一个条件,我们可以这样判断:
  1. 在给定的6个端点中有且仅有2个点的坐标一致。
  2. 设线段A的两个端点为\(a_1和a_2\)且线段C的端点\(c_1\)在线段A上,则有\(\vec {c_1a_1} \times \vec{c_1a_2} = 0\) 并且 \(\vec {c_1a_1} \cdot \vec{c_1a_2} < 0\),线段B同理。
  3. 设线段A和线段B的公共点为\(x_1\),各自另外一点分别为\(a_1,b_1\),则有\(\vec {x_1a_1} \cdot \vec{x_1b_1} \geq 0\) 并且 \(\vec {x_1a_1} \times \vec{x_1b_1} \neq 0\)。
  4. 设线段A的两个端点为\(a_1和a_2\)且线段C的端点\(c_1\)在线段A上, 则有\(16*min(\vert \vec {c_1a_1}\vert^2,\vert \vec {c_1a_2}\vert^2) \geq max(\vert \vec {c_1a_1}\vert^2,\vert \vec {c_1a_2}\vert^2)\),线段B同理。
    *此处使用线段长度的平方判断,避免开根号带来的精度误差。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ywh666 std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define all(a) a.begin(),a.end()
typedef long long ll ;
using _T = long long;//long long
const _T eps = 0;// 0
template<typename T> struct point
{
T x,y;
void read(){cin >> x >> y;}
bool operator<(const point &a) const
{if (abs(x-a.x)<=eps) return y<a.y-eps; return x<a.x-eps;}
bool operator>(const point &a) const
{return !(*this<a || *this==a);}
bool operator==(const point &a) const
{return (abs(x-a.x)<=eps && abs(y-a.y)<=eps);}
bool operator!=(const point &a) const
{return (abs(x-a.x)>eps || abs(y-a.y)>eps);}
point operator+(const point &a) const {return {x+a.x,y+a.y};}
point operator-(const point &a) const {return {x-a.x,y-a.y};}
point operator-() const {return {-x,-y};}
point operator*(const T k) const {return {k*x,k*y};}
point operator/(const T k) const {return {x/k,y/k};}
T operator*(const point &a) const {return x*a.x+y*a.y;}
T operator^(const point &a) const {return x*a.y-y*a.x;}
T dis2(const point &a) const {return (a-(*this)).len2();}
T len2() const {return (*this)*(*this);}
}; using Point = point<_T>;
map<Point, int> mp;
bool check(Point bo, Point end1, Point end2, Point a1, Point a2){
if(((end1 - bo) ^ (end2 - bo)) == 0) return 0 ;
if(((end1 - bo) * (end2 - bo)) < 0) return 0 ;
if(((end1 - a1) ^ (bo - a1)) == 0 &&((end1 - a1) * (bo - a1) < 0)
&& ((end2 - a2) ^ (bo - a2)) == 0 &&((end2 - a2) * (bo - a2) < 0)){
if(16 * min(bo.dis2(a1), a1.dis2(end1)) >= max(bo.dis2(a1), a1.dis2(end1)) &&
16 * min(bo.dis2(a2), a2.dis2(end2)) >= max(bo.dis2(a2), a2.dis2(end2))){
return 1 ;
}else{
return 0 ;
}
}else if(((end1 - a2) ^ (bo - a2)) == 0 &&((end1 - a2) * (bo - a2) < 0)
&& ((end2 - a1) ^ (bo - a1)) == 0 &&((end2 - a1) * (bo - a1) < 0)){
if(16 * min(bo.dis2(a2), a2.dis2(end1)) >= max(bo.dis2(a2), a2.dis2(end1)) &&
16 * min(bo.dis2(a1), a1.dis2(end2)) >= max(bo.dis2(a1), a1.dis2(end2))){
return 1 ;
}else{
return 0 ;
}
}else{
return 0 ;
}
}
void solve(){
Point a[6];
mp.clear();
for(int i = 0 ; i < 6 ; i ++) {
a[i].read();
mp[a[i]] ++;
}
bool f = 0 ;
Point both;
for(auto i : mp){
if(i.second == 2 && !f){
both = i.first;
f = 1;
}else if(i.second != 1){
cout << "NO" << endl;
return ;
}
}
if(!f){
cout << "NO" << endl;
return ;
}
mp.clear();
Point cnt[4];
int nn = 0 ;
for(int i = 0 ; i < 6 ; i ++){
if(a[i] == both){
cnt[nn ++] = a[(((i & 1) == 1) ? (i - 1) : (i + 1))];
mp[cnt[nn - 1]] ++;
}
}
for(int i = 0 ; i < 6 ; i ++){
if(!mp.count(a[i]) && a[i] != both) cnt[nn ++] = a[i];
}
bool ff = check(both, cnt[0], cnt[1], cnt[2], cnt[3]);
if(ff){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
return ; }
int main(){
ywh666;
int t ;
cin >> t;
while(t --){
solve();
}
return 0 ;
}

Codeforeces 13B的更多相关文章

  1. codeforeces近日题目小结

    题目源自codeforeces的三场contest contest/1043+1055+1076 目前都是solved 6/7,都差了最后一题 简单题: contest/1043/E: 先不考虑m个限 ...

  2. Codeforeces 617E XOR and Favorite Number(莫队+小技巧)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  3. Codeforeces 707B Bakery(BFS)

    B. Bakery time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  4. 牛客练习赛13B 幸运数字2

    题目链接:https://ac.nowcoder.com/acm/contest/70/B 题目大意: 略 分析: 先DFS求出所有幸运数,然后暴力即可 代码如下: #pragma GCC optim ...

  5. CodeForeces 25E (kmp)

    E. Test time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputst ...

  6. CodeForeces 665C Simple Strings

    C. Simple Strings time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  7. codeforeces:Mister B and Astronomers分析和实现

    题目很长,稍微翻译一下: 外星球每隔T秒中只有一秒可以被观测到,其它T-1秒无法被观测.n个天文学家(分别编号为1,...,n)轮流观测天空1秒,且第i+1个科学家在第i个天文学家后ai+1秒后才执行 ...

  8. Codeforeces 954C Matrix Walk

    题目大意 考虑一个 $x\times y$ 的矩阵 $A_{x\times y}$ ,$A_{i,j} = (i-1)x+y$ . 从矩阵中的某个位置出发,每次可向上下左右移动一步,每到一个位置,记录 ...

  9. CodeForeces 842d Vitya and Strange Lesson ——(带lazy标记的01字典树)

    给一个序列,每次操作对这个序列中的所有数异或一个x,问每次操作完以后整个序列的mex值. 做法是去重后构建01字典树,异或x就是对root加一个x的lazy标志,每次pushDown时如果lazy的这 ...

随机推荐

  1. Web调试工具之调试方法

    转载于: http://toutiao.com/news/6242781162012410370/ 一.Firefox 插件之 Firebug, 火狐调试利器[初学必备] 为什么要第一个提到火狐呢?因 ...

  2. ssm 关于mybatis启动报Result Maps collection already contains value for ...的问题总结

    Result Maps collection already contains value for com.zhaike.mapping.ChapterMapper.BaseResultMap Err ...

  3. jsp安全问题及其解决建议

    jsp编程语言自从推出之日起,由于它的快速.平台无关.可扩展.面向对象等特性得到了越来越广泛的应用,越来越多的厂家开发出了各种各样的支持平台如IBM 公司的WebSphere.BEA公司的WebLog ...

  4. 5月28日 python学习总结 CSS学习(一)

    1. CSS是什么 层叠样式表 --> 给HTML添加样式的 2. CSS的语法 选择器 { 属性1:值1; 属性2:值2; } 3. CSS引入方式 1. 直接写在HTMl标签里面 <p ...

  5. 关于TP框架

    TP的特性有哪些? 1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作. 2.融合了smarty模板,使前后台分离 3.支持多种缓存技术,尤其对memcache技术支持非常好 4. ...

  6. centos 7环境下安装部署zookeeper

    近一直在看zookeeper的知识,有所收获,打算写些一些关于zookeeper的博客,也当做是自己的复习和笔记. 在上一篇 博客中简单地介绍了centos 7 下如何安装jdk,这一篇将介绍如何在c ...

  7. .NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

    什么是.NET?什么是.NET Framework? 本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要 ...

  8. 深入理解FIFO(包含有FIFO深度的解释)

    FIFO: 一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令. 1.什么是FIFO? FIFO是 ...

  9. 8.5_线性控制器设计_轨迹跟踪(Follow a Desired Path)

    平衡点时所有的导数都为0 simulink中建立状态方程模型

  10. volist标签的各种属性

    volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出. 在控制器中首先对模版赋值: $User = ...