题意

给出平面上N个点的坐标,和一个半径为R的圆心在原点的圆.对于两个点,它们之间有连边,当且仅当它们的连线与圆不相交.求此图的最大团.
点数<=2000,坐标的绝对值和半径<=5000.
注意这里的连线指的是直线而不是线段.保证所有点都在圆外(不会落在圆的边界上).保证任意两个点的连线不会与圆相切.

分析

半年前写过题解.bzoj3663&&bzoj4660 Crazy Rabbit
因为最近联考考了这道题,然后发现我当时的题解写得一塌糊涂...于是重写一遍,顺便给当时看过我的题解的朋友道歉.
(捂脸熊.jpg)
首先对于圆外的点A,我们可以过它作两条圆的切线,找出两个切点之间的圆弧,这代表着从A放一个点光源时光线能照到的圆上的区间(也就是从点A能够"看到"的一段圆弧).我们可以用原点到切点的向量的极角来表示区间的端点.比如从点(0,sqrt(2))向半径为1的单位圆引切线,对应的区间就是[pi/4,3*pi/4].
关于"从某个点能够看到的一段圆弧",我们有一个至关重要的性质:
两个点所连的直线和圆没有交点,当且仅当这两个点分别"看到"的两端圆弧有公共部分但并不相互包含.
为了理解这个性质,可以自己在纸上画个圆,观察以下3条性质.

  1. 如果两个点"看到"的圆弧没有公共部分,那么它们之间连一条线段会和圆相交.
  2. 如果两个点"看到"的圆弧完全相互包含,那么它们之间连一条直线会和圆相交.
  3. 如果两个点"看到"的圆弧不满足(1)(2),那么它们之间连一条直线不和圆相交.
    这里本来想画个圆,不过比较懒就没有画

求出"看见"的区间只需要用基本的计算几何和一些三角函数.这一部分细节见代码.
那么问题至此转化为:在圆上选出一些区间使得它们两两有公共部分且不能相互包含.
我们发现,两个区间是否"有公共部分且不相互包含"只与这区间的端点有关,与区间代表的是端点划分出的优弧还是劣弧无关.
上一句话可能比较难理解.我画画图.

为了看起来方便,我们把圆周画得比较有宽度,把一些区间画在圆周内侧和外侧,实际上这些区间都是放在没有宽度的圆周上.
上面的红色区间和绿色区间满足"相交且不包含",但是红色区间和紫色区间也满足,绿色区间和蓝色区间也满足,蓝色区间和紫色区间也满足.
也就是说:我们随便把一些区间变成每个区间在圆上对应的互补区间,"相交且不包含"的关系是不变的.
如果这个结论比较难理解,可以考虑我们是怎样判断两个区间是否"相交且不包含".因为任意两点连线和圆不相切所以不会出现区间端点相同的情况.那么第一个区间的两个端点中必然一个被第二个区间包含,一个不被第二个区间包含.显然,这里我们把哪一个区间变成其在圆上的互补区间都不会对答案有任何影响.
这个性质的用处在于把环上的问题变成链上的问题.我们随便找一个点,从那个地方把圆断开为链(方便起见不如取x轴负半轴和圆的交点).如果有的区间跨过来这个断点,只需把那个区间变成它在圆上的互补区间.
现在问题转化为直线上有一些区间,选出尽量多的区间使得它们两两之间"相交但不包含"
考虑选出来的任意两个区间[l1,r1],[l2,r2],假如l1<l2,那么由于"相交且不包含"的限制,必然有r1<r2.也就是说,把所有的区间按照左端点排序之后,选出来的区间一定是右端点递增的.因此我们naive地猜想,答案是不是对所有区间按照左端点排个序,再按照排序之后的顺序把右端点拿出来跑LIS呢?通过看数据范围我们发现不是这样.因为这样选出来的一些区间虽然满足不会相互包含,却不一定满足两两有公共部分.考虑最终方案中选出来的所有区间中左端点最小的一个,因为区间两两之间有公共部分所以这个区间内必须包含其他所有区间的左端点.那么我们枚举这个左端点最小的区间,只把其他区间中左端点在这个区间内的区间拿出来,按左端点排序后对右端点跑LIS,就可以保证选出来的区间有公共部分而且不包含.复杂度为O(n^2logn).

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1505;
const double pi=acos(-1);
const double eps=1e-10;
int cmp(double x){return x<-eps?-1:x>eps;
}
struct point{double x,y;point(){}point(double a,double b){x=a;y=b;}void read(){scanf("%lf%lf",&x,&y);}
}P[maxn];int n,r;
double L[maxn],R[maxn],ori[maxn];
double dot(const point &A,const point &B){return A.x*B.x+A.y*B.y;
}
point operator -(const point &A,const point &B){return point(A.x-B.x,A.y-B.y);
}
double length(const point &A){return sqrt(dot(A,A));
}
double arg(double x,double y){return atan2(y,x);
}//the angle of vector(x,y),from(-pi,pi] ,arg(-1,0)=pi,arg(1,0)=0 arg(0,1)=pi/2
int tot,seq[maxn];
bool inside(double l,double r,double x){if(l<r){return cmp(l-x)*cmp(r-x)==-1;}else{return cmp(l-x)*cmp(r-x)==1;}
}
bool inter(int i,int j){return inside(L[i],R[i],L[j])^inside(L[i],R[i],R[j]);
}
bool cmp1(const int &a,const int &b){return cmp(L[a]-L[b])==-1;
}
double m[maxn];
double v[maxn];
int f[maxn];
int binary(double x){int l=0,r=tot;while(l<=r){int mid=(l+r)>>1;if(m[mid]<x)l=mid+1;else r=mid-1;}return l-1;
}
int lis(){for(int i=0;i<=tot;++i)m[i]=1e10;m[0]=-1e10;for(int i=1;i<=tot;++i)v[i]=R[seq[i]];int ans=0;for(int i=1;i<=tot;++i){f[i]=binary(v[i])+1;if(f[i]>ans)ans=f[i];if(v[i]<m[f[i]])m[f[i]]=v[i];}return ans;
}
int main(){int tests;scanf("%d",&tests);while(tests--){scanf("%d%d",&n,&r);for(int i=1;i<=n;++i)P[i].read();for(int i=1;i<=n;++i)ori[i]=arg(P[i].x,P[i].y);for(int i=1;i<=n;++i){double dlt=acos(r/length(P[i]));L[i]=ori[i]-dlt;R[i]=ori[i]+dlt;if(L[i]<-pi)L[i]+=2*pi;if(R[i]>pi)R[i]-=2*pi;if(L[i]>R[i])swap(L[i],R[i]);}//    for(int i=1;i<=n;++i)printf("%.3f %.3f\n",L[i],R[i]);int ans=0;for(int i=1;i<=n;++i){//enum start pointtot=0;for(int j=1;j<=n;++j){if(j==i)continue;if(cmp(L[i]-L[j])==-1&&inter(i,j)){seq[++tot]=j;}}sort(seq+1,seq+tot+1,cmp1);int tmp=lis()+1;if(tmp>ans)ans=tmp;}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/liu-runda/p/6701557.html

bzoj3663/4660CrazyRabbit bzoj4206最大团相关推荐

  1. 2022-2028年中国团购行业投资分析及前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了团购行业相关概述.中国团购行业运行环境.分析了中国团购行业的现状.中 ...

  2. 消息延迟队列处理拼团时间到期

    1.RabbitMqConfig /*** * 延时队列交换机* * 注意这里的交换机类型:CustomExchange* ** * @return* */ @Bean public CustomEx ...

  3. 飞桨领航团 x Datawhale联合Meetup来了!杭州的小伙伴可以见面了!

    Datawhale线下 主办:百度飞桨,Datawhale 飞桨领航团是飞桨开发者的兴趣社区,为开发者们提供丰富的本地技术沙龙.Meetup.及线上交流平台,面向所有对人工智能及深度学习领域感兴趣的开 ...

  4. 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...

    刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...

  5. HDU1530(最大团问题)

    1定义: 其中,形式参数t表示第t个顶点,Place(t)用来判断第t个顶点能否放入团里.二维数组a[][]是图的邻接矩阵.一维数组x[]记录当前解.搜索到第t层时,从第1 个顶点用第t-1个顶点的状 ...

  6. 解题报告:luogu P2423 [HEOI2012]朋友圈【最大团转最大点独立集(匈牙利算法+时间戳优化)】

    图的最大团:"任意两点之间都有一条边相连"的子图被称为无向图的团,点数最多的团为图的最大团 朋友圈中任意两个点之间都有关系,既是图中的团. 答案就是图中的最大团. 我们如果把B国的 ...

  7. 某程序员揭秘“开水团”大厂真实福利:工位拥挤,没有食堂!公司防员工跟防贼一样,特别是纸巾和插排都粘到桌子上!...

    坊间都说美团福利差,差到只提供白开水,还因此喜提了"开水团"美称.但美团好歹也是个互联网大厂,它的福利待遇真有传说中那么不靠谱吗?不少人对此存疑,觉得可能有所夸张. 百闻不如一见, ...

  8. 人民日报点名批评互联网社区团购,各种“买菜”软件要黄?程序员们:感觉白加班了!...

    最近互联网社区团购赛道大热,众多互联网巨头纷纷砸钱进去.美团优选.多多买菜.橙心优选.叮咚买菜.每日优鲜. 兴盛优选.淘宝买菜等买菜软件层出不穷,还有网友兴致勃勃地发帖问大家看好哪家公司. 但互联网资 ...

  9. 苏宁“砍价团”高可用、高并发架构实践

    " 苏宁拼购 808 的火爆见证了砍价团的成功,作为一种新兴的购物营销玩法,砍价团展现出了巨大的商业潜力.不同于传统购物流程的单一模式,砍价团凝练了购物玩法和社群营销的精髓. 来自:51ct ...

最新文章

  1. java解压文件、复制文件、删除文件代码示例
  2. 无条件跳转页面的代码
  3. 文件编码和RandomAccessFile文件流的使用--IO学习笔记(一)
  4. [js] localStorage什么时候过期?
  5. 竟然被awk生成的随机数给整蒙了,也谈随机数生成种子
  6. linux新建用户不显示,linux系统无法添加用户帐号的原因分析
  7. vscode-background插件“卸载“以及“禁用“失效
  8. [leetcode]1185. 一周中的第几天
  9. nohup命令简单的使用
  10. acrobat dc和9 pro哪个好_荣耀Play4 Pro和荣耀V30有什么区别?选哪个?
  11. JavaWeb网上购物系统项目源码+论文
  12. 给js对象定义属性的方法
  13. 完全背包问题(详细解答)
  14. javascript飞机大战
  15. 从零学习node爬虫
  16. Linux查看CPU和内存使用情况
  17. HGAME 2022 week1 个人部分WP
  18. c++ stl栈容器stack用法介绍
  19. (转载)图像语义分割
  20. 解决Connections could not be acquired from the underlying database!

热门文章

  1. 徐志摩的诗,读了第一篇我就感动了!!!
  2. Android关于虚拟控件、全面屏及悬浮球机型适配时遇到的问题
  3. 从“中国之光”到倒闭破产,北大方正做错了什么?
  4. smt贴片加工行业常见术语及知识汇总
  5. 拓商:拼多多客服回复慢,到底应该怎么解决?
  6. 【渝粤教育】电大中专跨境电子商务理论与实务 (6)作业 题库
  7. 小黄鸭坤坤(Python高还原绘图)
  8. Java获取播放文件的时长
  9. 21/4/25 项目二:客户信息管理软件
  10. c语言情书大赛,计算机科学与技术学院“C语言情书大赛”