HNOI2019 鱼 fish
本来想写个改题记录的然后想了想改不完所以就分开写了= =
https://www.luogu.org/problemnew/show/P5286
显然枚举A,D,然后鱼头和鱼身分开来考虑。
鱼身:先枚举B,C,那么BC的中点一定在线段AD(不包含端点)上,对于每一条直线维护一个vector存所有的点,将这个BC的中点插入进线段BC的垂直平分线的vector,然后对于一组AD,鱼身的方案数是vector上AD中间的点数,可以用upper_bound求。
鱼尾:枚举D,对所有其他点极角排序,用双指针扫一遍所有点即可。具体难以描述请直接看代码
这题细节巨多,考场上一看就会写,写了3h还没拍上以为暴力写挂走了,结果水到40分,如果没被卡常有60,然后今天又调了一个上午才过的= =说不定还有bug只是数据太水= =
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define rg register
#define vd void
#define ll long long
il int gi(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f^=ch=='-',ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n;
template<class T>il T gcd(T a,T b){return b?gcd(b,a%b):a;}
struct number{
ll x,y;
number(){}
number(const ll&a,const ll&b){
ll g=gcd(llabs(a),llabs(b));
x=a/g,y=b/g;
if(y<0)x=-x,y=-y;
}
};
il bool operator<(const number&a,const number&b){
if(a.x^b.x)return a.x<b.x;
return a.y<b.y;
}
il bool operator!=(const number&a,const number&b){return a.x!=b.x||a.y!=b.y;}
struct line{number k,b;};
il bool operator<(const line&a,const line&b){
if(a.k!=b.k)return a.k<b.k;
return a.b<b.b;
}
std::map<line,int>M;int cnt;
int x[1010],y[1010];
struct yyb{int i;double at2;}s[2010];
il bool operator<(const yyb&a,const yyb&b){return a.at2<b.at2;}
std::vector<int>vec[1000010];
il ll getdist(int a,int b){
return 1ll*(x[a]-x[b])*(x[a]-x[b])+1ll*(y[a]-y[b])*(y[a]-y[b]);
}
int tail[1010][1010];
std::map<ll,int>mmp;
int res,nowi;
const double eps=1e-10,pi=acos(-1);
il vd insert(int x){res+=mmp[getdist(nowi,x)]++;}
il vd delet(int x){res-=--mmp[getdist(nowi,x)];}
int main(){
//freopen("fish.in","r",stdin);
//freopen("fish.out","w",stdout);
n=gi();
for(int i=1;i<=n;++i)x[i]=gi(),y[i]=gi();
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
if(y[i]==y[j]){
if(x[i]+x[j]&1)continue;
number k=(number){1,0},b=(number){(x[i]+x[j])/2,1};
if(M.find((line){k,b})==M.end())M[(line){k,b}]=++cnt;
vec[M[(line){k,b}]].push_back(y[i]*2);
}else{
number k=(number){x[i]-x[j],y[j]-y[i]},b=(number){-1ll*(x[i]-x[j])*(x[i]+x[j])+1ll*(y[j]-y[i])*(y[j]+y[i]),2ll*(y[j]-y[i])};
if(M.find((line){k,b})==M.end())M[(line){k,b}]=++cnt;
vec[M[(line){k,b}]].push_back(x[i]==x[j]?x[i]*2:y[i]+y[j]);
}
for(int i=1;i<=n;++i){
int m=0;
for(int j=1;j<=n;++j)if(j!=i)s[++m]=(yyb){j,atan2(y[j]-y[i],x[j]-x[i])};
std::sort(s+1,s+m+1);
for(int i=1;i<=m;++i)s[i+m]=s[i],s[i+m].at2+=pi*2;
mmp.clear();
res=0;nowi=i;
for(int j=1,p=0,q=0;j<=m;++j){
while(s[p+1].at2+eps<s[j].at2+1.5*pi)insert(s[++p].i);
while(s[q+1].at2<s[j].at2+0.5*pi+eps)delet(s[++q].i);
tail[s[j].i][i]=res;
}
}
for(int i=1;i<=cnt;++i)std::sort(vec[i].begin(),vec[i].end());
ll ans=0;
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j){
int xa=y[i],xb=y[j];
if(xa==xb)xa=x[i],xb=x[j];
if(xa>xb)std::swap(xa,xb);
number k,b;
if(x[i]==x[j])k=(number){1,0},b=(number){x[i],1};
else k=(number){y[i]-y[j],x[i]-x[j]},b=(number){-1ll*x[i]*(y[i]-y[j])+1ll*y[i]*(x[i]-x[j]),x[i]-x[j]};
if(M.find((line){k,b})==M.end())continue;
int veci=M[(line){k,b}];
ans+=(std::upper_bound(vec[veci].begin(),vec[veci].end(),xb*2-1)-std::upper_bound(vec[veci].begin(),vec[veci].end(),xa*2))*(tail[i][j]+tail[j][i]);
}
printf("%lld\n",ans*4);
return 0;
}
HNOI2019 鱼 fish的更多相关文章
- [HNOI2019]鱼
Luogu5286 \(2019.4.14\),新生第一题,改了\(3\)个小时 题解-租酥雨,和出题人给的正解一模一样 枚举\(AD\),分别考虑鱼身\(BC\)和鱼尾\(EF\) 到\(E\),\ ...
- [HNOI2019]鱼(计算几何)
看到数据范围n<=1000,但感觉用O(n^2)不现实,所以考虑方向应该是O(n^2logn). 一种暴力做法:用vector存到1点相同的2点和到2点相同的1点,然后枚举A,枚举BC,再枚举D ...
- luogu P5286 [HNOI2019]鱼
传送门 这题真的牛皮,还好考场没去刚( 这题口胡起来真的简单 首先枚举D点,然后对其他所有点按极角排序,同时记录到D的距离.然后按照极角序枚举A,那么鱼尾的两个点的极角范围就是A关于D对称的那个向量, ...
- 【洛谷5286】[HNOI2019] 鱼(计算几何)
点此看题面 大致题意: 给你\(n\)个点,让你求鱼形图的数量. 核心思路 首先,考虑到\(n\)这么小,我们可以枚举线段\(AD\),再去找符合条件的\(BC,EF\). 然后,不难发现\(BC\) ...
- 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解
一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...
- 人工鱼群算法超详细解析附带JAVA代码
01 前言 本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧. 02 人工鱼群算法 2.1 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到 ...
- 第三十篇 面向对象的三大特性之继承 supre()
继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和 多继承. # 定义父类 class ParentClass ...
- Unity基础:AR(增强现实)的学习
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- 【loj3054】【hnoi2019】鱼
题目 描述 难以描述.......慢慢看..: https://loj.ac/problem/3054 范围 $6 \le n \le 1000 , 1 \le |x| , |y| \ ...
随机推荐
- LaTeX:图形的填充(生成阴影图形)
将内网和外网看到的综合整理. 韦恩图Venn \documentclass{standalone} \usepackage{tikz} %导出为图片需要安装imagemagick %https://t ...
- python变量的命名空间
首先必须要提一下python程序执行过程中变量的查找规则 较官方的查找机制是: 局部作用域--外部函数作用域--全局作用域--内建函数作用域 其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是 ...
- wx python 基本控件
一.静态文本控件 wx.StaticText(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, n ...
- ORACLE11g下如何利用SQL DEVELOPER连接上数据库
最近在学习数据库的相关内容,在sqlplus敲了几天命令行窗口后,想尝试一下用sql developer 连接上数据库但一直没有实现.在网上查询了相关资料后现在终于弄好了,就来写下此篇博文与大家分享! ...
- [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt
[20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt --//上午翻看以前我的发的帖子,发现链接:http://www.itpub.net/thread-2066758- ...
- Django日志信息路径的设置
django日志信息路径的设置, 因为我们经常在代码业务上线时候 需要进行调试,查看代码的后台运行情况,就需要设置django项目的具体的日志信息运维的路径了 LOGGING = { 'version ...
- windows7+apache2.4+sql server+php7.0
参考文献:https://blog.csdn.net/blueheart20/article/details/76186218 https://blog.csdn.net/phpservice/art ...
- 路由交换01-----ICMP协议
路由交换协议------ICMP ICMP协议 ICMP (InternetControl Message Protocol)协议是TCP/IP协议簇的核心协议之一,用来在网络设备之间传递各种差错和控 ...
- hadoop系列 第二坑: hive hbase关联表问题
关键词: hive创建表卡住了 创建hive和hbase关联表卡住了 其实针对这一问题在info级别的日志下是看出哪里有问题的(为什么只能在debug下才能看见呢,不太理解开发者的想法). 以调试模式 ...
- 【转】这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...