LOJ#3054. 「HNOI 2019」鱼

https://loj.ac/problem/3054

题意

  • 平面上有n个点,问能组成几个六个点的鱼。(n<=1000)

分析

鱼题,劲啊。

  • 容易想到先枚举这个\(D\),然后极角序排一下,我们枚举\(A\),对\(B,E,F\)分别统计。
  • 枚举\(A\)的过程中用一个指针维护\(E,F\)的范围,对答案贡献是一个\(\sum\binom{x}{2}\)的形式,容易维护。
  • 然后现在要求\(B\)的方案数,可以发现符合条件的\(BC\)一定满足线段\(AD\)垂直平分线段\(BC\)。
  • 不难想到,预处理出来每条类似\(BC\)这样的线段,求出他们被垂直平分时那个直线的\(a,b,c\),同时因为\(AD,BC\)应有交,还需要存一个中点横坐标\(X_{mid}\),然后枚举\(A\)时用\([L=X_A,R=X_D]\)算一下这之间有多少个点。然后可能有横坐标相等的情况,所以我又预处理的每条线段中点的纵坐标的信息。
  • 然后就做完了,注意一下精度。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
using namespace std;
#define N 2050
typedef double f2;
typedef long long ll;
const f2 eps=1e-10;
const f2 pi=acos(-1);
ll ans;
int c[N],n,lb,len[N];
ll rlen[N],V[N];
ll pf(ll x) {return x*x;}
ll gcd(ll x,ll y) {return y?gcd(y,x%y):x;}
struct Point {ll x,y;Point(){}Point(ll x_,ll y_) {x=x_,y=y_;}Point turn90(const Point &p) const {Point re,t=*this-p;re.x=-t.y;re.y=t.x;return re+p;}void prt() {printf("%lld %lld\n",x,y);}Point operator + (const Point &u) const {return Point(x+u.x,y+u.y);}Point operator - (const Point &u) const {return Point(x-u.x,y-u.y);}Point operator / (const ll &rate) const {return Point(x/rate,y/rate);}ll operator | (const Point &u) const {return (x*u.y-y*u.x);}ll operator & (const Point &u) const {return (x*u.x+y*u.y);}
}a[N];
struct Pop {Point p; f2 k;Pop() {}Pop(Point p_,f2 k_) {p=p_,k=k_;}bool operator < (const Pop &u) const {return k<u.k;}
}b[N<<1];
struct B {ll a,b,c,x;void prt() {printf("%lld %lld %lld %lld\n",a,b,c,x);}bool operator < (const B &u) const {if(a==u.a) {if(b==u.b) {if(c==u.c) {return x<u.x;}else return c<u.c;}else return b<u.b;}else return a<u.a;}
};
ll Abs(ll x) {return x>0?x:-x;}
vector<B> S,T;
B calc(Point p1,Point p2) {ll dy=p2.y-p1.y,dx=p2.x-p1.x;ll ta=-dy,tb=dx;ll d=gcd(Abs(ta),Abs(tb));if(d!=1) ta/=d,tb/=d;if(ta<0) ta=-ta,tb=-tb;if(ta==0) tb=Abs(tb);ll tc=ta*p1.x+tb*p1.y;return (B){ta,tb,tc,0};
}
int main() {scanf("%d",&n);int i,j;for(i=1;i<=n;i++){scanf("%lld%lld",&a[i].x,&a[i].y); a[i].x<<=1, a[i].y<<=1;}for(i=1;i<=n;i++) {for(j=1;j<=n;j++) if(i!=j) {Point mid=(a[i]+a[j])/2;B tmp=calc(a[i].turn90(mid),a[j].turn90(mid));tmp.x=(a[i].x+a[j].x)/2;S.push_back(tmp);tmp.x=(a[i].y+a[j].y)/2;T.push_back(tmp);//printf("%d %d %lld %lld %lld\n",i,j,tmp.a,tmp.b,tmp.c);}}sort(S.begin(),S.end());sort(T.begin(),T.end());for(i=1;i<=n;i++) {Point o=a[i];lb=0;for(j=1;j<=n;j++) if(i!=j) b[++lb]=Pop(a[j],atan2(a[j].y-a[i].y,a[j].x-a[i].x));sort(b+1,b+lb+1);for(j=1;j<=lb;j++) b[j+lb]=b[j],b[j+lb].k+=2*pi;int ln=lb<<1;int l=0,r=0;for(j=1;j<=lb;j++) {rlen[j]=pf(o.x-b[j].p.x)+pf(o.y-b[j].p.y);V[j]=rlen[j];}sort(V+1,V+lb+1);int lv=unique(V+1,V+lb+1)-V-1;for(j=1;j<=lb;j++) len[j]=lower_bound(V+1,V+lv+1,rlen[j])-V;for(j=1;j<=lb;j++) len[j+lb]=len[j];for(j=1;j<=lv;j++) c[j]=0;ll ans1=0,ans2=0;for(j=1;j<=lb;j++) {for(;r<=ln&&b[r+1].k+eps<b[j].k+1.5*pi;) r++,ans1+=c[len[r]],c[len[r]]++;for(;l<=ln&&b[l+1].k<b[j].k+0.5*pi+eps;) l++,c[len[l]]--,ans1-=c[len[l]];B t=calc(o,b[j].p),tl=t,tr=t;if(o.x==b[j].p.x) {tl.x=o.y, tr.x=b[j].p.y;if(tl.x>tr.x) swap(tl.x,tr.x);ans2=lower_bound(T.begin(),T.end(),tr)-upper_bound(T.begin(),T.end(),tl);}else {tl.x=o.x, tr.x=b[j].p.x;if(tl.x>tr.x) swap(tl.x,tr.x);ans2=lower_bound(S.begin(),S.end(),tr)-upper_bound(S.begin(),S.end(),tl);}ans2=max(ans2,0ll);//printf("%lld %lld\n",ans1,ans2);ans+=ans1*ans2;}}printf("%lld\n",ans<<1);
}

转载于:https://www.cnblogs.com/suika/p/10676145.html

LOJ#3054. 「HNOI 2019」鱼相关推荐

  1. LOJ #6672. 「XXOI 2019」惠和惠惠和惠惠惠(生成函数,整式递推)

    题目 没有latex就没有推式子的动力怎么破? 设 f i , j f_{i,j} fi,j​表示在前 j j j个回合里,血量为 0 0 0了 i i i个回合且第 j j j个回合血量为 0 0 ...

  2. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  3. LOJ 2288「THUWC 2017」大葱的神力

    LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...

  4. #3144. 「APIO 2019」奇怪装置

    #3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...

  5. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列 题目描述 给定 nnn 个整数 a1,a2,-,an(0≤ai≤n),以及 nnn 个整数 w1,w2,-,wn.称 a1,a2,-,an 的一个 ...

  6. 【LOJ #6617】「THUPC 2019」摆家具 / furniture(DP / BSGS / 矩阵快速幂)

    传送门 首先显然k=lognk=lognk=logn 显然对于每个iii我们只用关注有多少位与询问的数字不同 考虑分成两个部分 先对每个数字iii求出与他有jjj位不同的数字价值之和 再求出ttt轮后 ...

  7. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

    题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...

  8. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...

  9. loj #3086. 「GXOI / GZOI2019」逼死强迫症

    背景: 好像也没什么. 题目传送门: https://loj.ac/problem/3086 题意: 给一个2∗n2*n2∗n的矩阵,现在要用2∗(n−1)2*(n-1)2∗(n−1)的矩形和222块 ...

最新文章

  1. python3语法手册_Python3 学习手册每日更新
  2. 使用Cydia Substrate Hook Android Java世界
  3. 第四次作业——黄渗茹
  4. Yii设置响应数据的样式与内容
  5. git 生成ssh key_ubuntu git生成ssh key (公钥私钥)配置github或者码云
  6. 源码分析:Java对象的内存分配
  7. swift ... .._Swift 2.0是开源的,ApacheCon:大数据,还有更多开源新闻
  8. 养老金中除以139是什么意思?
  9. QQ聊天记录恢复深度研究
  10. vscode设置字体
  11. Duplicate Net Names Wire Net......
  12. centos卸载nvidia驱动_nvidia驱动的卸载和重新安装
  13. 视频流(自适应算法)
  14. python 随机分组
  15. matlab鼠标中键不能放大缩小,proe鼠标中键不能缩放如何解决
  16. 笔记本护眼设置——全面攻略(保护视力)(笔者倾情奉献+强烈推荐)
  17. YAPI 重点功能使用介绍
  18. java中美元符号的作用_$美元符号在配置文件中的意义
  19. 基于ubuntu的ARM开发环境搭建
  20. 域名解析中TTL是什么意思?

热门文章

  1. 严冬欲御寒增强体质 首当养肾
  2. 前端安全中的 cookie 防护 - 加速乐(jsl)
  3. 信息资源管理【四】之 信息资源内容管理
  4. Excel打开CSV格式,大数字乱码情况
  5. oracle shared pool size,oracle 关于设置shared pool及sga大小
  6. 「推荐」自由职业摄影师 Plus 视频课程
  7. 初学搜索之关键字选择
  8. video JS实现多视频循环播放
  9. 为什么 C++ 中成员函数指针是 16 字节?
  10. 任务管理器结束任务进程