题意:

\(n\)个点,\(q\)个询问,每次问包含询问点的直角三角形有几个

思路:

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 8000 + 10;
typedef long long ll;
const ll mod = 998244353;
typedef unsigned long long ull;
struct Point{
ll x, y;
int flag;
}be[maxn], p[maxn];
int Qua(Point a){
if(a.x > 0 && a.y >= 0) return 1;
if(a.x <= 0 && a.y > 0) return 2;
if(a.x < 0 && a.y <= 0) return 3;
if(a.x >= 0 && a.y < 0) return 4;
}
int cmp1(Point a, Point b) {
ll d = a.x * b.y - b.x * a.y;
if(d == 0) {
return a.x < b.x;
}
else{
return d > 0;
}
}
bool cmp(const Point &a, const Point &b){
int qa = Qua(a), qb = Qua(b);
if(qa == qb){
return cmp1(a, b);
}
return qa < qb;
}
int angle(Point a, Point b){ //爆ll
ull now = (ull)(a.x - b.x) * (a.x - b.x) + (ull)(a.y - b.y) * (a.y - b.y);
ull exc = a.x * a.x + a.y * a.y + b.x * b.x + b.y * b.y;
if(now == exc) return 0; //直角
if(now < exc) return -1; //锐角
return 1; //钝角
}
ll cross(Point a, Point b){
return a.x * b.y - a.y * b.x;
}
ll ans[maxn];
int main(){
int n, q;
scanf("%d%d", &n, &q);
int cnt = 0;
for(int i = 1; i <= n; i++){
cnt++;
scanf("%lld%lld", &be[cnt].x, &be[cnt].y);
be[cnt].flag = 0;
p[cnt] = be[cnt];
}
for(int i = 1; i <= q; i++){
cnt++;
scanf("%lld%lld", &be[cnt].x, &be[cnt].y);
be[cnt].flag = i;
p[cnt] = be[cnt];
} for(int i = n + 1; i <= cnt; i++){
p[0] = be[i]; //直角点
int tot = 0;
for(int j = 1; j <= n; j++){
p[j].x = be[j].x - be[i].x;
p[j].y = be[j].y - be[i].y;
p[j].flag = be[j].flag;
}
sort(p + 1, p + n + 1, cmp);
for(int j = 1; j <= n; j++){
p[j + n] = p[j];
} int R = 2;
for(int L = 1; L <= n; L++){
while(R <= 2 * n){
if(cross(p[L], p[R]) < 0) break;
if(angle(p[L], p[R]) >= 0) break;
R++;
}
int tR = R;
while(tR <= 2 * n){
if(cross(p[L], p[tR]) <= 0) break;
if(angle(p[L], p[tR]) != 0) break;
ans[be[i].flag]++;
tR++;
}
}
} for(int i = 1; i <= n; i++){
p[0] = be[i]; //非直角点
int tot = 0;
for(int j = 1; j <= cnt; j++){
if(j == i) continue;
tot++;
p[tot].x = be[j].x - be[i].x;
p[tot].y = be[j].y - be[i].y;
p[tot].flag = be[j].flag;
}
sort(p + 1, p + tot + 1, cmp);
for(int j = 1; j <= tot; j++){
p[j + tot] = p[j];
} int R = 2;
for(int L = 1; L <= tot; L++){
while(R <= 2 * tot){
if(cross(p[L], p[R]) < 0) break;
if(angle(p[L], p[R]) >= 0) break;
R++;
}
int tR = R;
while(tR <= 2 * tot){
if(cross(p[L], p[tR]) <= 0) break;
if(angle(p[L], p[tR]) != 0) break;
if(p[L].flag && p[tR].flag == 0){
ans[p[L].flag]++;
}
else if(p[L].flag == 0 && p[tR].flag){
ans[p[tR].flag]++;
}
tR++;
}
}
} for(int i = 1; i <= q; i++) printf("%lld\n", ans[i]); return 0;
}

Gym102361A Angle Beats(直角三角形 计算几何)题解的更多相关文章

  1. Angle Beats Gym - 102361A(计算几何)

    Angle Beats \[ Time Limit: 4000 ms \quad Memory Limit: 1048576 kB \] 题意 给出 \(n\) 个初始点以及 \(q\) 次询问,每次 ...

  2. Codeforces Gym 102361A Angle Beats CCPC2019秦皇岛A题 题解

    题目链接:https://codeforces.com/gym/102361/problem/A 题意:给定二维平面上的\(n\)个点,\(q\)次询问,每次加入一个点,询问平面上有几个包含该点的直角 ...

  3. hdu6731 Angle Beats(ccpc秦皇岛A,计算几何)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6731 题意: 给出$n$个点,有$q$次询问 每次询问给出一个点$b$,求这$n+1$个点,组成直角 ...

  4. CCPC 2019 秦皇岛 Angle Beats

    题目 给出P个点,然后给出Q个询问,问从P中选出两个点和给的点能组成直角三角形的方法个数.-O2,时间限制5秒. \[2\leqslant P\leqslant 2000,\qquad 1\leqsl ...

  5. Angle Beats Gym - 102361A

    题目链接:https://vjudge.net/problem/Gym-102361A 题意:给定N个点,q次询问每次询问给一个点,问在N个点中取2个和给定点最多可以组成几个直角三角形. 思路:htt ...

  6. 【HDOJ6731】Angle Beats(极角排序)

    题意:二维平面上给定n个整点,q个询问 每个询问给定另外的一个整点,问其能与n个整点中任意取2个组成的直角三角形的个数 保证所有点位置不同 n<=2e3,q<=2e3,abs(x[i],y ...

  7. UVa 1643 Angle and Squares (计算几何)

    题意:有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 析:很容易知道只有所有的正方形的对角形在一条直线时,是最大的,然后根据数学关系,就容易得 ...

  8. 300iq Contest 1 简要题解

    300iq Contest 1 简要题解 咕咕咕 codeforces A. Angle Beats description 有一张\(n\times m\)的方阵,每个位置上标有*,+,.中的一种. ...

  9. jrMz and angles(水题)

    jrMz and angles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

随机推荐

  1. Nacos 服务配置中心

    1.因为项目是微服务分布式项目,每个微服务都需要用到配置中心,所以第一步我们先在common中添加相应的依赖 <dependency> <groupId>com.alibaba ...

  2. MVC和MTV框架模式

    1. MVC: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  3. FLask之视图

    视图 1 FBV def index(): return render_template('index.html') app.add_url_rule('/index', 'index', index ...

  4. Mysql 中写操作时保驾护航的三兄弟!

    这期的文章主要是讲述写操作过程中涉及到的三个日志文件,看过前几期的话可能你或多或少已经有些了解了(或者从别的地方也了解过).比如整个写操作过程中用到的两阶段提交,又或者是操作过程中涉及到的日志文件,但 ...

  5. jmeter跳过验证码登录配置:通过手动添加 Cookie 跳过带验证码的登录接口

    目录 一.基本配置 二.HTTP请求默认值 三.HTTP信息头管理器 四.HTTP Cookie管理器 五.线程组下接口设置 一.基本配置 二.HTTP请求默认值 (1)jmeter的设置: (2)设 ...

  6. C/C++ Lua通信

    C/C++和Lua是如何进行通信的? http://www.luachina.cn/?post=38 2015-12-28 为了实现Lua和其他语言之间的通信,Lua虚拟机为C/C++提供了两个特性: ...

  7. Linux centos7编译源码安装redis

    1.安装准备 ① 由于redis底层用c语言编写的,安装redis需要先将官网下载的源码进行编译,编译依赖make和gcc环境,如果没有则需要安装(一般系统中已经装了了make和gcc,无须再装) 安 ...

  8. loj10173

    炮兵阵地 司令部的将军们打算在 N×M 的网格地图上部署他们的炮兵部队.一个 N×M的地图由 N 行 M 列组成,地图的每一格可能是山地(用 H 表示),也可能是平原(用 P表示),如下图.在每一格平 ...

  9. Html5 部分快捷键

    1:Tab键,快速创建标签 2:ctrl+d,删除光标所在行 3; ctrl+/ 快速添加注释 ctrl+shirt+/ 快速添加多行注释,在js里分别为添加单行注释和多行注释 4; ctrl+alt ...

  10. ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具

    ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具 一.ShowDoc官方文档及说明 1.1 它可以用来做什么 1.2 它都有些什么功能 1.3 使用在线的ShowDoc 1.4 ...