题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4660

想到一个点可以用它与圆的两个切点表示。并想到可以把切点极角排序,那么就变成环上的一些区间之间的问题。

发现了一个区间和另一个区间可以共存,当且仅当它们相交。不知怎的没看到题面的 “直线” ,以为包含也可以。

所有区间都两两相交,考虑枚举一个点作为所有区间都经过的点。但发现因为是环,可以有区间是首部相交一些区间、尾部相交一些区间的。

然后就不会了。

其实考虑没有那种首部相交一些、尾部相交一些的情况,除了枚举一个所有区间都经过的点,还可以考虑用 LIS 做。

就是枚举一个区间,把 “左端点在自己区间里,与自己是相交关系” 的区间拿出来,按左端点排序,对右端点求 LIS 。

有那种情况的话,考虑把那种区间首尾交换一下,就可以像原来那样做了!!!

求切点极角,令 \( len * cos( s ) = R , len * cos( g ) = x \) ,即 s 是 “该点到原点连线” 与 “切点到原点连线” 的夹角, g 是 “该点到原点连线” 与 “x轴” 的夹角,那么两个切点的极角就是 s-g 和 s+g 。

求 LIS 的时候,把各种点的值改成与当前区间左端点的距离就很方便了。

注意是 “直线” 所以是可以相交但不能包含。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #define db double
  6. using namespace std;
  7. int rdn()
  8. {
  9. int ret=;bool fx=;char ch=getchar();
  10. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  11. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  12. return fx?ret:-ret;
  13. }
  14. int Mx(int a,int b){return a>b?a:b;}
  15. const int N=; const db pi2=*acos(-);
  16. int n,R,tot,ans;db f[N];
  17. struct Node{
  18. db l,r;
  19. Node(db l=,db r=):l(l),r(r) {}
  20. bool operator< (const Node &b)const
  21. {return l<b.l;}
  22. }a[N],b[N];
  23. db Dis(int x,int y){return sqrt((db)x*x+(db)y*y);}
  24. bool chk(db x,db l,db r)
  25. { if(l<r)return x>l&&x<r; else return x>l||x<r;}
  26. db cal(db x,db y)
  27. { if(x<y)return y-x; else return pi2-(x-y);}
  28. void get(int cr)
  29. {
  30. sort(b+,b+tot+); int cd=;
  31. for(int i=;i<=tot;i++)
  32. {
  33. if(b[i].r>f[cd])f[++cd]=b[i].r;
  34. int l=,r=cd,p=;
  35. while(l<=r)
  36. {
  37. int mid=l+r>>;
  38. if(f[mid]>=b[i].r)p=mid,r=mid-;
  39. else l=mid+;
  40. }
  41. f[p]=b[i].r;
  42. }
  43. ans=Mx(ans,cd+);//+1 for i
  44. }
  45. int main()
  46. {
  47. n=rdn();R=rdn();
  48. for(int i=;i<=n;i++)
  49. {
  50. int x=rdn(), y=rdn(); db len=Dis(x,y);
  51. db s=acos(R/len), g=acos(x/len); if(y<)g=pi2-g;
  52. a[i].l=g-s; a[i].r=g+s;
  53. if(a[i].l<)a[i].l+=pi2; if(a[i].r>pi2)a[i].r-=pi2;
  54. }
  55. for(int i=;i<=n;i++)
  56. {
  57. tot=;
  58. for(int j=;j<=n;j++)
  59. {
  60. if(j==i)continue;
  61. if(chk(a[j].l,a[i].l,a[i].r)&&!chk(a[j].r,a[i].l,a[i].r))
  62. b[++tot]=Node(cal(a[i].l,a[j].l),cal(a[i].l,a[j].r));
  63. else if(chk(a[j].r,a[i].l,a[i].r)&&!chk(a[j].l,a[i].l,a[i].r))
  64. b[++tot]=Node(cal(a[i].l,a[j].r),cal(a[i].l,a[j].l));
  65. }
  66. get(i);
  67. }
  68. printf("%d\n",ans);
  69. return ;
  70. }

bzoj 4660 Crazy Rabbit——LIS解决“相交”限制的思想的更多相关文章

  1. 【BZOJ4660】Crazy Rabbit 结论+DP

    [BZOJ4660]Crazy Rabbit Description 兔子们决定在自己的城堡里安排一些士兵进行防守.给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个 ...

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

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

  3. P3897 [湖南集训]Crazy Rabbit

    \(\color{#0066ff}{ 题目描述 }\) 兔子们决定在自己的城堡里安排一些士兵进行防守. 给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个兔子,使得它 ...

  4. BZOJ 1046 上升序列(LIS变形)

    要保证长度为L的序列下标字典序最小,当然要尽量选前面的数. 如何判断前面的数是否满足条件?,只需要知道这个数开头的递增序列的最长长度是多少,如果不小于L,那么必然可以加入这个数.还需判断一下它是否大于 ...

  5. BZOJ - 3757 树上莫队解决离线路径问题 & 学习心得

    题意:给你一棵树,求u,v最短路径的XXX(本题是统计权值种类) 今天课上摸鱼学了一种有意思的处理路径方式(其实是链式块状树翻车了看别的),据说实际运行跑的比XX记者还快 大概就是像序列莫队那样 首先 ...

  6. BZOJ 2127: happiness(最小割解决集合划分)

    Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2350  Solved: 1138[Submit][Status][Discuss] Descript ...

  7. 用DFS 解决全排列问题的思想详解

    首先考虑一道奥数题目: □□□ + □□□ = □□□,要将数字1~9分别填入9个□中,使得等式成立.例如173+286 = 459.请输出所有合理的组合的个数. 我们或许可以枚举每一位上所有的数,然 ...

  8. 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务

    在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...

  9. bzoj 4765: 普通计算姬 主席树+替罪羊树思想

    题目大意: 给定一棵\(n\)个节点的带权树有根树,设\(sum_p\)表示以点\(p\)为根的这棵子树中所有节点的权 计算姬支持下列两种操作: 给定两个整数\(u,v\),修改点\(u\)的权值为\ ...

随机推荐

  1. L249 语法

    Even when homeless individuals manage to find a shelter that will give them three meals a day and a ...

  2. TensorFlow函数:tf.truncated_normal

    tf.truncated_normal函数 tf.truncated_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, ...

  3. shell脚本实例-批量检查多个网站地址是否正常

    #!/usr/bin/bash [ -f /etc/init.d/functions ] && . /etc/init.d/functions array=( http://www.w ...

  4. DOM中offsetLeft与style.left的区别

    offsetLeft 获取的是相对于父对象的左边距 left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距 如果父div的position定义为relat ...

  5. 1--Jmeter4.0连接Oracle数据库

    一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...

  6. CentOS7下-bash: nano: command not found

    由于安装的是纯净版系统,运行nano命令是提示没有找到该命令,以下是解决方法,用root权限的用户运行以下命令安装nano: yum install nano 遇到询问时一路点y即可. 安装好后运行: ...

  7. Java并发容器和框架

    ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率近100%.因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环 ...

  8. Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 配置校验器

    Spring4新特性——泛型限定式依赖注入 Spring4新特性——核心容器的其他改进 Spring4新特性——Web开发的增强 Spring4新特性——集成Bean Validation 1.1(J ...

  9. JavaScript中的内置对象-8--1.Array(数组)-Array构造函数; 数组的栈方法; 数组的转换方法; 数组的操作方法; 删除-插入-替换数组项; ECMAScript为数组实例添加的两个位置方法;

    JavaScript内置对象-1Array(数组) 学习目标 1.掌握任何创建数组 2.掌握数值元素的读和写 3.掌握数组的length属性 如何创建数组 创建数组的基本方式有两种: 1.使用Arra ...

  10. Go parameter passing

    package main import ( "fmt" ) func main() { fmt.Println("Hello, playground") var ...