【HDOJ6731】Angle Beats(极角排序)
题意:二维平面上给定n个整点,q个询问
每个询问给定另外的一个整点,问其能与n个整点中任意取2个组成的直角三角形的个数
保证所有点位置不同
n<=2e3,q<=2e3,abs(x[i],y[i])<=1e9
思路:
对于每个询问点q,分两类讨论
一:q为直角顶点
以q为原点,求出它到n个点的向量,极角排序
枚举一个向量,其贡献为平行于该向量逆时针转90度的向量的个数
二:q不为直角顶点
枚举直角顶点i作为原点,求出它到另外n-1个点的向量,极角排序
对于q,其贡献为:设t为i到q的向量,平行于t逆时针或顺时针转90度的向量的个数
用upper_bound-lower_bound计算个数
极度卡时,在HDOJ上TLE,在gym上4s时限3sA的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 4100
#define M 2000010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9;
int dx[]={-,,,};
int dy[]={,,-,}; struct P
{
int x,y;
P()=default;
P(int x,int y):x(x),y(y){}
P rot90(){return P(-y,x);} //逆时针转90度
P _rot90(){return P(y,-x);} //顺时针转90度
}p[N],t[N]; bool operator^(P a,P b) //叉积
{
return (1ll*a.x*b.y-1ll*a.y*b.x)>;
} int quadrant(P a) //象限
{
if(a.x>&&a.y>=) return ;
else if(a.x<=&&a.y>) return ;
else if(a.x<&&a.y<=) return ;
else if(a.x>=&&a.y<) return ;
} bool operator<(P a,P b) //极角排序
{
int qa=quadrant(a),qb=quadrant(b);
if(qa!=qb) return qa<qb;
return a^b;
} P operator-(P a,P b)
{
return P(a.x-b.x,a.y-b.y);
} int ans[N],n,q; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void solve()
{
rep(i,,q) ans[i]=;
int m=n+q;
rep(i,n+,m)
{
int top=;
rep(j,,n)
{
top++;
t[top]=p[j]-p[i];
}
sort(t+,t+top+);
rep(j,,n)
{
P tmp=t[j].rot90();
int num=upper_bound(t+,t+top+,tmp)-lower_bound(t+,t+top+,tmp);
ans[i-n]+=num;
}
}
rep(i,,n)
{
int top=;
rep(j,,n)
if(j!=i)
{
top++;
t[top]=p[j]-p[i];
}
sort(t+,t+top+);
rep(j,n+,m)
{
P tmp=p[j]-p[i];
P t1=tmp.rot90();
ans[j-n]+=upper_bound(t+,t+top+,t1)-lower_bound(t+,t+top+,t1);
P t2=tmp._rot90();
ans[j-n]+=upper_bound(t+,t+top+,t2)-lower_bound(t+,t+top+,t2);
}
}
rep(i,,q) printf("%d\n",ans[i]);
} int main()
{
while(scanf("%d%d",&n,&q)!=EOF)
{
rep(i,,n+q) p[i].x=read(),p[i].y=read();
solve();
}
return ;
}
【HDOJ6731】Angle Beats(极角排序)的更多相关文章
- Angle Beats Gym - 102361A(计算几何)
Angle Beats \[ Time Limit: 4000 ms \quad Memory Limit: 1048576 kB \] 题意 给出 \(n\) 个初始点以及 \(q\) 次询问,每次 ...
- Educational Codeforces Round 1 C. Nearest vectors 极角排序
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/problem/ ...
- poj 2007 Scrambled Polygon 极角排序
/** 极角排序输出,,, 主要atan2(y,x) 容易失精度,,用 bool cmp(point a,point b){ 5 if(cross(a-tmp,b-tmp)>0) 6 retur ...
- Space Ant(极角排序)
Space Ant http://poj.org/problem?id=1696 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- codeforces 598C C. Nearest vectors(极角排序)
题目链接: C. Nearest vectors time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- LA-4356&&hdu-2469 (极角排序+扫描线)
题目链接: Fire-Control System Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- codeforces 1284E. New Year and Castle Construction(极角排序+扫描枚举)
链接:https://codeforces.com/problemset/problem/1284/E 题意:平面上有n个点,问你存在多少组四个点围成的四边形 严格包围某个点P的情况.不存在三点共线. ...
- POJ 1696 Space Ant 【极角排序】
题意:平面上有n个点,一只蚂蚁从最左下角的点出发,只能往逆时针方向走,走过的路线不能交叉,问最多能经过多少个点. 思路:每次都尽量往最外边走,每选取一个点后对剩余的点进行极角排序.(n个点必定能走完, ...
- Space Ant---poj1696(极角排序)
题目链接:http://poj.org/problem?id=1696 题意:给你n个点,然后我们用一条线把它们连起来,形成螺旋状: 首先找到左下方的一个点作为起点,然后以它为原点进行极角排序,找到极 ...
随机推荐
- Sql 把Xml字符串转换成一张表
分享一个Sql技巧,把xml字符串转换成一个表格 DECLARE @IdHandel INT EXEC sp_xml_preparedocument @IdHandel OUTPUT, @Bar_Ip ...
- 使用 java.util.Properties 读取配置文件中的参数
配置文件格式 如下的配置参数格式都支持: Key = ValueKey = Key:ValueKey :Value 用法 getProperty方法的返回值是String类型. //读取配置文件 Fi ...
- Java基础语法—数据输入
我们可以通过 Scanner 类来获取用户的输入.使用步骤如下: 1.导包.Scanner 类在java.util包下,所以需要将该类导入.导包的语句需要定义在类的上面. import java.ut ...
- 华南理工大学“三七互娱杯” D HRY and array
https://ac.nowcoder.com/acm/contest/874/D 题目大意是给定两个数组A和B 数组的元素可以打乱重新排列 然后求∑ni=1 AiBi 的期望 我是这么理解的: 由于 ...
- 【Linux-设备树】.dtb文件的反汇编
在使用设备树时我们将**.dts文件利用dtc编译器编译为**.dtb文件. 在已知**.dtb文件的情况下我们有两种方法可以得到dts源码: 方法一:使用fdtdump工具进行反汇编 使用命令:ro ...
- 分布式事务解决方案汇总:2PC、3PC、消息中间件、TCC、状态机+重试+幂等(转)
数据一致性问题非常多样,下面举一些常见例子.比如在更新数据的时候,先更新了数据库,后更新了缓存,一旦缓存更新失败,此时数据库和缓存数据会不一致.反过来,如果先更新缓存,再更新数据库,一旦缓存更新成功, ...
- application详解
Application对象是HttpApplicationState类的一个实例,Application状态是整个应用程序全局的.本文主要详细介绍Application对象的用法. 一.全局应用程序类 ...
- 自己制作 Android Vector Asset 矢量图
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/c5138891/article/deta ...
- 利用 TCMalloc 优化 Nginx 的性能
TCMalloc 全称为 Thread-Caching Malloc,是谷歌的开源工具 google-perftools 的成员,它可以 在内存分配效率和速度上高很多,可以很大程度提高服务器在高并发情 ...
- CentOS上安装Git及配置远程仓库
首先登陆CentOS服务器,连接上服务器之后我们使用yum remove git 命令删除已安装的Git,若之前没安装过Git则不需要这一步.注意前提是你的CentOS服务器上安装了yum,这是Cen ...