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. Numpy库基础___五

    Numpy数据存取 •NumPy的随机数函数 a = np.random.rand(1,2,3) print(a) #[[[0.03339719 0.72784732 0.47527802] # [0 ...

  2. oracle 11g生成ASH报告操作过程

    1.ASH (Active SessionHistory) ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件.不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成. v ...

  3. 数据库原理 之MySQL

    数据库种类: 关系型数据库: mysql 专注于数据安全 和功能 ,存取时 会有表的结构化操作解析sql语句---- 丢给磁盘存取 ----取出,结构化成表 常用关系型数据库产品介绍oracle数据库 ...

  4. [SHA2017](web) writeup

    [SHA2017](web) writeup Bon Appétit (100) 打开页面查看源代码,发现如下 自然而然想到php伪协议,有个坑,看不了index.php,只能看 .htaccess ...

  5. 利用多个sem信号量在线程通讯

    直接上代码,主要用到sem_trywait & sem_post #include<stdio.h> #include<pthread.h> #include<s ...

  6. C++获取设备 PID,VID 信息

    可直接编译(设置成:使用多字节字符集) 转来的,代码: /* http://www.experts-exchange.com/Programming/Editors_IDEs/Q_24506125.h ...

  7. Vue指令02——v-on指令和v-show的使用

    Vue指令02--v-on指令和v-show的使用 v-on指令 格式1:v-on:事件="方法" 格式2:@事件="方法" 格式3:@事件="方法( ...

  8. HMS Core 机器学习服务6.4.0版本更新啦,文本翻译功能增加10种小语种语言类型!

    近日,HMS Core机器学习服务(ML Kit)文本翻译功能在6.4.0版本更新中增加了10种小语种语言类型,分别是马其他语.马其顿.冰岛.乌尔都语.波斯尼亚语.乌克兰语.加泰罗尼亚语.斯洛文尼亚语 ...

  9. Java8 HashMap扩容时为什么不需要重新hash

    技巧: 与&操作   和   与 n 如8 与,为0  则位置不变 https://blog.csdn.net/zlp1992/article/details/104376309 java8在 ...

  10. 正则-Java注释代码

    今天写了个匹配java中常见的注释,记录一下,以备后用,使用条件将行两边的空格trim掉. (^\/\*.*)|(^\/\/.*)|(^\*.*)