4206: 最大团

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 91  Solved: 36
[Submit][Status][Discuss]

Description

给出平面上N个点的坐标,和一个半径为R的圆心在原点的圆。对于两个点,它们之间有连边,当且仅当它们的连线与圆不相交。
求此图的最大团。

Input

第一行两个整数N和R, 表示点数和圆的半径。
接下来N 行,每行两个整数xi 和yi,表示第i个点的坐标
保证每个点都严格在园外,且两两直线不与圆相切。

Output

输出一个整数:最大团的大小。

Sample Input

6 3
0 6
-7 -4
-3 -2
7 -5
-2 3
8 -3

Sample Output

4

HINT

对于100%的数据,1≤N≤2000,|xi|,|yi|,R≤5000

Source

分析:

考虑什么样子的两个点确定的直线是合法的...

我们从每个点向圆做两条切线...这两条切线之间有一段弧...如果两个点确定的直线可以选择,当且仅当这两个点对应的弧相交并且不包含...

现在我们把圆切开展成一条线段,我们把弧覆盖这个切点的点的弧取反...并不会影响答案...

现在我们得到了若干区间,我们要找的是包含区间最多的合法序列使得其满足:

$l_1<l_2<l_3<......<l_n<r_1<r_2<r_3<......<r_n$

现在我们枚举第一个区间是什么,这样我们就确定了可选的$l_i$的范围,我们把可选的区间提取出来,按照$l$排序,然后求$r$的最长上升子序列就好了...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
//by NeighThorn
using namespace std; const int maxn=2000+5;
const double pi=acos(-1.0),inf=1e8; int n,ans,cas;
double r,tmp[maxn],posx[maxn],posy[maxn]; struct M{ double x,y;
int del; inline void init(void){
del=0;
} friend bool operator < (M a,M b){
if(a.del!=b.del) return a.del<b.del;
if(a.x!=b.x) return a.x<b.x;
if(a.y!=b.y) return a.y<b.y;
} }no[maxn]; signed main(void){
scanf("%d%lf",&n,&r);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&posx[i],&posy[i]),no[i].init();
for(int i=1,x,y;i<=n;i++){
double len=sqrt(posx[i]*posx[i]+posy[i]*posy[i]);
if(len<=r){
no[i].del=1;break;
}
double ang1=atan2(posy[i],posx[i]),ang2=acos(r/len);
no[i].x=ang1-ang2;no[i].y=ang1+ang2;
if(no[i].y>pi) no[i].y-=2*pi,swap(no[i].x,no[i].y);
if(no[i].x<-pi) no[i].x+=2*pi,swap(no[i].x,no[i].y);
}
sort(no+1,no+n+1);ans=0;
while(no[n].del==1) n--;
for(int i=1;i<=n;i++){
double x=no[i].x,y=no[i].y;
for(int j=0;j<n;j++) tmp[j]=inf;
for(int j=i+1;j<=n&&no[j].x<y;j++){
if(no[j].y>no[i].y)
*lower_bound(tmp,tmp+n,no[j].y)=no[j].y;
}
ans=max(ans,(int)(lower_bound(tmp,tmp+n,inf)-tmp)+1);
}
printf("%d\n",ans);
return 0;
}

  


By NeighThorn

BZOJ 4206: 最大团的更多相关文章

  1. bzoj 4206 最大团 几何+lis

    最大团 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 142  Solved: 65[Submit][Status][Discuss] Descrip ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. bzoj 3632: 外太空旅行 最大团

    3632: 外太空旅行 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 389  Solved: 129[Submit][Status] Descript ...

  4. 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)

    2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...

  5. BZOJ 3632 外太空旅行(最大团)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3632 [题目大意] 求图中的最大团. [题解] 最大团问题是npc问题,因此可以考虑随 ...

  6. BZOJ - 2744 朋友圈 (二分图上的最大团)

    [题目大意] 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两 ...

  7. 三倍经验——bzoj3663、4660、4206 Crazy Rabbit/最大团

    题目描述: 3663 4660 4206 题解: 第一眼:不成立的互相连边,然后用网络流求解无向图最小点覆盖! 好吧我不会. 正解: 每个点对应圆上的一段圆弧,长这样: 设对应圆弧$(l,r)$. 若 ...

  8. BZOJ平推计划

    学习VFK大神推BZOJ,记录一下学习的东西 1004: burnside:一个置换群的等价计数=(每个置换的置换后等价情况数)/置换总数,每个置换的置换后等价情况数就是置换后没变的数 模意义下的除法 ...

  9. [BZOJ 1006] [HNOI2008] 神奇的国度 【弦图最小染色】

    题目链接: BZOJ - 1006 题目分析 这道题是一个弦图最小染色数的裸的模型. 弦图的最小染色求法,先求出弦图的完美消除序列(MCS算法),再按照完美消除序列,从后向前倒着,给每个点染能染的最小 ...

随机推荐

  1. PIC32MZ 通过USB在线升级 -- USB CDC bootloader

    了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...

  2. 深度学习(deep learning)优化调参细节(trick)

    https://blog.csdn.net/h4565445654/article/details/70477979

  3. 【数据结构】 List 简单实现

    public class XList<T> : IEnumerable, IEnumerator { #region List 简单实现 /// <summary> /// 存 ...

  4. FJOI 2019 游记

    (FJOI 2019 滚粗记) Day 0 早上刷了一些水题,然后就上路了. (画图3D好好玩) 来得晚只有十几分钟时间看考场,于是连试机题都没有Ak. Day 1 果然我还是太菜了 走过来的时候再讨 ...

  5. 【转】用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

    原文链接:https://www.cnblogs.com/cgzl/p/9165388.html 本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/901 ...

  6. 七天入门C++

  7. C#故事

    C# 在腾讯的发展 <先定个小目标, 使用C# 开发的千万级应用> Xamarin 携程使用.Net技术 分布式高并发redis MQ dubbo kafka zookeeper

  8. phpStoram破解方法

  9. lintcode-101-删除排序数组中的重复数字 II

    101-删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 标签 数组 两根指针 脸书 思路 参照上一篇博客lintcode-100 ...

  10. Java集合(2)——深入理解ArrayList、Vector和LinkedList

    回顾 Java集合主要分为两个体系结构,Collection和Map.这篇博客主要介绍Collection子接口List下的三个经常使用的实现类:ArrayList.Vector和LinkedList ...