【BZOJ4660】Crazy Rabbit

Description

兔子们决定在自己的城堡里安排一些士兵进行防守。给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个兔子,使得它们两两所在的直线都不与圆相交。兔子们希望知道最多能选出多少兔子

Input

第一行两个整数 N 和 R, 表示兔子的个数和圆的半径接下来 N 行,每行两个整数 xi 和 yi ,表示第 i 只兔子的坐标保证每只兔子都严格在障碍外部,且两两的所在的直线不与圆相切。
对于 100% 的测试数据, 1 <= n <= 2000; 1 <= R, xi, yi <= 5000

Output

输出一行一个整数, 表示最多能选出多少兔子

Sample Input

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

Sample Output

4
【样例1解释】
选择第 1, 2, 6, 4 只兔子即可。

题解:神题,先%一发达哥的题解:http://www.cnblogs.com/liu-runda/p/6701557.html。

下面只说如何处理区间不包含。先将所有区间按l排序,然后枚举左端点i,将所有li<lj<ri的区间j都拿出来,然后求出这些区间关于r的最长上升子序列即可。最长上升子序列可以采用基于upper_bound的nlogn的做法,详见代码。

烦人的是,这是一个环,在环上比较大小是一件十分捉鸡的事情。。。还是详见代码吧。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#define pi acos(-1.0)
using namespace std;
const int maxn=2010;
struct qj
{
double l,r;
}p[maxn];
int n,m,ans;
double R;
double q[maxn],sta[maxn];
bool cmp(const qj &a,const qj &b)
{
return (a.l==b.l)?(a.r<b.r):(a.l<b.l);
}
int LIS()
{
int top=0,i;
sta[++top]=q[1];
for(i=2;i<=m;i++)
{
if(q[i]>sta[top]) sta[++top]=q[i];
else
{
int t=upper_bound(sta+1,sta+top+1,q[i])-sta;
sta[t]=q[i];
}
}
return top;
}
int main()
{
scanf("%d%lf",&n,&R);
int i,j;
for(i=1;i<=n;i++)
{
double a,b,c,d;
scanf("%lf%lf",&a,&b);
c=atan2(b,a),d=acos(R/sqrt(a*a+b*b));
p[i].l=c-d,p[i].r=c+d;
if(p[i].l<=-pi) p[i].l+=2*pi;
if(p[i].r>pi) p[i].r-=2*pi;
if(p[i].l>p[i].r) swap(p[i].l,p[i].r);
}
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;i++)
{
for(m=0,j=i+1;j<=n;j++) if(p[j].l<=p[i].r&&p[j].r>p[i].r) q[++m]=p[j].r;
ans=max(ans,LIS()+1);
}
printf("%d",ans);
return 0;
}

【BZOJ4660】Crazy Rabbit 结论+DP的更多相关文章

  1. hdu 5325 Crazy Bobo (树形dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Crazy Bobo Time Limit: 6000/3000 MS (Java ...

  2. 【BZOJ3425】Poi2013 Polarization 猜结论+DP

    [BZOJ3425]Poi2013 Polarization Description 给定一棵树,可以对每条边定向成一个有向图,这张有向图的可达点对数为树上有路径从u到达v的点对(u,v)个数.求最小 ...

  3. AtCoder Regular Contest 066 E - Addition and Subtraction Hard (结论+DP)

    Time limit : 2sec / Memory limit : 256MB Score : 900 points Problem Statement Joisino has a formula ...

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

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

  5. bzoj 4660 Crazy Rabbit——LIS解决“相交”限制的思想

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4660 想到一个点可以用它与圆的两个切点表示.并想到可以把切点极角排序,那么就变成环上的一些区 ...

  6. P3897 [湖南集训]Crazy Rabbit

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

  7. bzoj3663/4660CrazyRabbit && bzoj4206最大团

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

  8. (转)dp和dip是同一个单位

    原文地址:http://blog.csdn.net/chenyufei1013/article/details/8363619 摘要 本文介绍了android单位dp,dip的概念,并给出了它的确切含 ...

  9. 区间DP石子合并问题 & 四边形不等式优化

    入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...

随机推荐

  1. unity3d一个物体围绕另一个物体旋转

    可以使用RotateAround,代码如下: transform.RotateAround (Sun.transform.position, Vector3.down, ); 其中第一个参数是要围绕哪 ...

  2. Python selenium -- cookie处理

    转自:http://www.cnblogs.com/fnng/p/3269450.html 本节重点: driver.get_cookies() 获得cookie信息 add_cookie(cooki ...

  3. 企业信息系统集成框架(设计思路)C模式

    1.客户端.h文件 #pragma once #include<stdlib.h> //A程序员定义接口形式和调用模式 //初始化句柄 typedef int(*Init_Socket)( ...

  4. C语言 文件操作

    /** *@author cody *@date 2014-08-09 *@description copy text file * FILE *fopen(filename,openmode) * ...

  5. 查询MySql数据库架构信息:数据库,表,表字段

    /*1.查询所有数据库*/ show databases;  /*2.查询所有数据表*/ select * from information_schema.tables where table_sch ...

  6. zookeeper程序员指南

    1 简介本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息.本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooK ...

  7. html-loldemo

    百度版lol百科小样 <!DOCTYPE html> <html lang="en"> <head> <title>英雄联盟百科&l ...

  8. MySQL 记录中包含换行符

    换行符: \r\n \r CHAR(10) 处理方法: REPLACE(str,from_str,to_str); 如:REPLACE('aaa\nbbb','\n','');

  9. javascript深入理解js闭包【手动加精】

    http://www.jb51.net/article/24101.htm 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.   一.变量的作用 ...

  10. linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)

    1707 许多初学者都有比较大的疑惑,电脑是怎么识别我们写的代码并进行处理的呢?其实这个问题对我们初学者来说是很重要的,只有了解机器的运行原理,我们才能真正地学号留下.那么今天我就以此为题为大家略讲一 ...