[HNOI2019]鱼(计算几何)
看到数据范围n<=1000,但感觉用O(n^2)不现实,所以考虑方向应该是O(n^2logn)。
一种暴力做法:用vector存到1点相同的2点和到2点相同的1点,然后枚举A,枚举BC,再枚举D,然后枚举EF,O(n^4),但复杂度远远不满(符合条件的太少,而且也卡不掉),所以可以获得40pts的好成绩。
正解:
首先可以想到一点:确定A,D两点后,因为鱼身和鱼尾互不影响,可以分开计算鱼身和鱼尾,然后将二者数量相乘即可。鱼尾比较好算,直接把所有点按照极角坐标排序,然后枚举A时转移即可,复杂度O(n^2);鱼身挺难算的,因为BC中点要在AD上,且与AD垂直(即斜率相乘为-1,或一个平行一个竖直),这时候,就要预处理两两点对的中心和斜率,然后查找时二分找出范围。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const double pi=acos(-),eps=1e-;
struct point{
ll x,y;double k;
void cal(){k=atan2(y,x);}
bool operator<(const point&b)const{return k<b.k;}
}a[N],q[N<<];
struct node{
ll a,b,c,d;
bool operator<(const node &t)const{
if(a!=t.a)return a<t.a;
if(b!=t.b)return b<t.b;
if(c!=t.c)return c<t.c;
return d<t.d;
}
}s[N*N];
int n,m,tot,len,num[N];
ll ans,sum,dis[N],b[N];
void add(int x){sum+=num[dis[(x-)%m+]],num[dis[(x-)%m+]]++;}
void del(int x){num[dis[(x-)%m+]]--,sum-=num[dis[(x-)%m+]];}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].y);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
ll x=a[i].x-a[j].x,y=a[i].y-a[j].y,d=abs(__gcd(x,y));
x/=d,y/=d;
if(x<)x=-x,y=-y;
if(!x)y=abs(y);
s[++tot]=(node){x,y,x*(a[i].x+a[j].x)+y*(a[i].y+a[j].y),x*a[i].y-y*a[i].x};
}
sort(s+,s+tot+);
for(int i=;i<=n;i++)
{
m=;
for(int j=;j<=n;j++)if(i!=j)q[++m]=(point){a[j].x-a[i].x,a[j].y-a[i].y},q[m].cal();
sort(q+,q+m+);
for(int j=m+;j<=*m;j++)q[j]=q[j-m],q[j].k+=*pi;
len=;
for(int j=;j<=m;j++)dis[j]=b[++len]=q[j].x*q[j].x+q[j].y*q[j].y;
sort(b+,b+len+);
len=unique(b+,b+len+)-b-;
for(int j=;j<=m;j++)dis[j]=lower_bound(b+,b+len+,dis[j])-b;
sum=;
memset(num,,sizeof num);
for(int j=,qs=,qe=;j<=m;j++)
{
while(q[qs+].k+eps<q[j].k+1.5*pi)add(++qs);
while(q[qe+].k-eps<q[j].k+0.5*pi)del(++qe);
ll x=-q[j].y,y=q[j].x,d=abs(__gcd(x,y));
x/=d,y/=d;
if(x<)x=-x,y=-y;
if(!x)y=abs(y);
ll t=x*(q[j].x+a[i].x+a[i].x)+y*(q[j].y+a[i].y+a[i].y);
ll L=x*a[i].y-y*a[i].x,R=x*(q[j].y+a[i].y)-y*(q[j].x+a[i].x);
if(L>R)swap(L,R);
node xl=(node){x,y,t,L},xr=(node){x,y,t,R};
ans+=sum*(lower_bound(s+,s+tot+,xr)-upper_bound(s+,s+tot+,xl));
}
}
cout<<ans*;
}
[HNOI2019]鱼(计算几何)的更多相关文章
- 【洛谷5286】[HNOI2019] 鱼(计算几何)
点此看题面 大致题意: 给你\(n\)个点,让你求鱼形图的数量. 核心思路 首先,考虑到\(n\)这么小,我们可以枚举线段\(AD\),再去找符合条件的\(BC,EF\). 然后,不难发现\(BC\) ...
- [HNOI2019]鱼
Luogu5286 \(2019.4.14\),新生第一题,改了\(3\)个小时 题解-租酥雨,和出题人给的正解一模一样 枚举\(AD\),分别考虑鱼身\(BC\)和鱼尾\(EF\) 到\(E\),\ ...
- HNOI2019 鱼 fish
本来想写个改题记录的然后想了想改不完所以就分开写了= = https://www.luogu.org/problemnew/show/P5286 显然枚举A,D,然后鱼头和鱼身分开来考虑. 鱼身:先枚 ...
- luogu P5286 [HNOI2019]鱼
传送门 这题真的牛皮,还好考场没去刚( 这题口胡起来真的简单 首先枚举D点,然后对其他所有点按极角排序,同时记录到D的距离.然后按照极角序枚举A,那么鱼尾的两个点的极角范围就是A关于D对称的那个向量, ...
- [LOJ3054] 「HNOI2019」鱼
[LOJ3054] 「HNOI2019」鱼 链接 链接 题解 首先想 \(O(n^3)\) 的暴力,不难发现枚举 \(A\) 和 \(D\) 后, \((B,C)\) 和 \((E,F)\) 两组点互 ...
- 【loj3054】【hnoi2019】鱼
题目 描述 难以描述.......慢慢看..: https://loj.ac/problem/3054 范围 $6 \le n \le 1000 , 1 \le |x| , |y| \ ...
- HNOI2019 摸鱼记
感觉准备省选时有点浮躁,没有准备联赛时那样认真, 希望能将这次省选当做一个教训吧QAQ. Day -inf 基本上把要学的东西都学了,至少做到了自己心里有底. Day 0 乒乓球室没开差评,打隔膜不带 ...
- [日常摸鱼]UVA393 The Doors 简单计算几何+最短路
The Boy Next Doors 题意:给定一个固定大小的房间($x,y$的范围都是$[0,10]$),有$n$个墙壁作为障碍(都与横坐标轴垂直),每个墙壁都有两扇门分别用四个点来描述,起点 ...
- HNOI2019梦游记
\(Day_0\) 十点半开始睡觉,开始了八个小时的不眠之夜,整晚都没睡着,这状态明天肯定挂了 \(Day_1\) 开局一条鱼,计算几何只会\(20\) 还是\(T2\)的\(20\)纯暴力好打,\( ...
随机推荐
- Web前端工程师需要注意的开发规范有哪些?
从事web前端开发工作我们就需要了解web前端开发的规范,这样才能保证高效快速的完成工作,本篇就和大家分享一下web前端开发工程师需要注意的web前端开发规范有哪些,希望对小伙伴们有所帮助. web前 ...
- Flink与Spark Streaming在与kafka结合的区别!
本文主要是想聊聊flink与kafka结合.当然,单纯的介绍flink与kafka的结合呢,比较单调,也没有可对比性,所以的准备顺便帮大家简单回顾一下Spark Streaming与kafka的结合. ...
- POJ 3970:Party
Party Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status ...
- QMainWindow的空间布局结构
简单讲一下Qt的QMainWindow的结构,Qt的顶级窗口有三种类型,首先是万恶之源(...应该说是大部分控件的父类...)的QWidget,然后是QMainWidget和QDialog,后面两者也 ...
- MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程
Prim算法很好理解,特别是学完了迪杰斯特拉算法之后,更加能理解Prim的算法思想 和迪杰斯特拉算法差不多,由于最后要形成连通图,故任意指定一个点,作为初始点,遍历所有点,以当前最小权值的点(和迪杰斯 ...
- requests.get()///post函数///base64函数
1.requests.get() 一般的用法:r=requests.get(url) 或者是用上session: r=requests.session() r=r.get(url) get()收集的是 ...
- JOIN US | 京东云诚聘技术精英
清新的办公区域感受自然的气息,温馨的团队为你我放飞青春的理想 上有天文下有地理的阅读区域 各类图书提供借阅 绿植环绕生机勃勃的会客区域洋溢青春 [高级Java工程师] 职位描述: 参与云计算相关平台/ ...
- Python说文解字_杂谈05
1. isinstance和type: is和==符号,is指的是内存地址,是不是一个对象,ID知否相同 集成链 class A: pass class B(A): pass b = B() prin ...
- priority_queue(优先队列)的用法(包括pbds)
置顶!!! 有时候在定义的时候,不要把两个<>连在一起写,以免被编译器错误理解!!!! 头文件 #include <queue> queue的一般用法不再叙述 类型名 prio ...
- JAVA中常用的异常处理情况
1.java.lang.nullpointerexception程序遇上空指针 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者 ...