几何+lis

很巧妙。直接做很困难,那么我们转化一下,把每个点能看见的圆弧画出来。只有这些圆弧相交时才满足条件。

那么也就是找出圆上尽量多两两相交的区间。

所以我们先按左端点极角排序,然后固定一个必须选的区间,找出所有和它相交的区间,按右端点做lis就行了。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
const double pi = acos(-);
struct data {
double l, r;
int id;
} x[N], a[N];
int n, ans;
double R;
int tree[N << ], dp[N];
void update(int l, int r, int x, int pos, int t)
{
if(l == r)
{
tree[x] = t;
return;
}
int mid = (l + r) >> ;
if(pos <= mid)
update(l, mid, x << , pos, t);
else
update(mid + , r, x << | , pos, t);
tree[x] = max(tree[x << ], tree[x << | ]);
}
int query(int l, int r, int x, int a, int b)
{
if(l > b || r < a)
return ;
if(l >= a && r <= b)
return tree[x];
int mid = (l + r) >> ;
return max(query(l, mid, x << , a, b),
query(mid + , r, x << | , a, b));
}
int lis(int t)
{
if(!t) return ;
int ans = ;
dp[] = ;
memset(tree, , sizeof(tree));
update(, n, , x[].id, dp[]);
for(int i = ; i <= t; ++i)
{
dp[i] = query(, n, , , x[i].id) + ;
ans = max(ans, dp[i]);
update(, n, , x[i].id, dp[i]);
}
return ans;
}
bool cp1(data x, data y)
{
return x.r < y.r;
}
bool cp(data x, data y)
{
return x.l < y.l;
}
int main()
{
scanf("%d%lf", &n, &R);
for(int i = ; i <= n; ++i)
{
double x, y; scanf("%lf%lf", &x, &y);
double degx = atan2(y, x);
double degc = acos(R / sqrt(x * x + y * y));
a[i].l = degx - degc;
a[i].r = degx + degc;
while(a[i].l <= -pi)
a[i].l += * pi;
while(a[i].r >= pi)
a[i].r -= * pi;
if(a[i].l > a[i].r)
swap(a[i].l, a[i].r);
}
sort(a + , a + n + , cp1);
for(int i = ; i <= n; ++i)
a[i].id = i;
sort(a + , a + n + , cp);
for(int i = ; i <= n; ++i)
{
int t = ;
for(int j = i + ; j <= n; ++j)
if(a[j].l <= a[i].r && a[j].r >= a[i].r)
x[++t] = a[j];
ans = max(ans, lis(t) + );
}
printf("%d\n", ans);
return ;
}

bzoj3663的更多相关文章

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

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

  2. Bzoj3663/4660 CrazyRabbit

    题意:给定平面上一个圆和一堆圆外的点,要求选出尽可能多的点使得它们之间两两连线都不和圆相交.保证任意两点连线不和圆相切.点数<=2000 这题是很久以前在某张课件上看见的.看了题解还搞了三小时, ...

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

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

随机推荐

  1. 05网页<div></div>块内容

    网页<div></div>块内容 <header>此处为新 header 标签的内容</header> <navigation>此处为新 n ...

  2. EasyUI_datagrid

    案例一丶jquery.easyui.min.js:10631 Uncaught TypeError: this.renderEmptyRow is not a function 解决方法:datagr ...

  3. 继 S-HR之代码创建临时表并插入数据 完整功能之员工职业信息变更报表

    目的示例1: 制作员工职业信息报表[S-HR系统的报表其实就是列表o.0,醉了] EcirrWithPP.js shr.defineClass("shr.custom.EcirrWithPP ...

  4. Linux kernel memory-faq.txt

    ## Linux kernel memory-faq.txt What is some existing documentation on Linux memory management? Ulric ...

  5. printf函数压栈(i++/i--,++i/--i) 终极解密

    #include <stdio.h> void main() { ; printf("%d %d %d %d\n", i, --i, i, i--); } 输出是“3 ...

  6. x shell 连接不上本地虚拟机

    登陆虚拟机服务器 输入ipconfig查看ip 地址(如果提示命令不存在,输入 ip addr) 输出结果中看标记处是否出现ip地址.我的打开后这里是没有地址的 然后输入 vi /etc/syscon ...

  7. PAT 1121 Damn Single

    "Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...

  8. 【Codeforces 411A】Password Check

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 傻逼模拟题 [代码] import java.io.*; import java.util.*; public class Main { st ...

  9. HXY烧情侣(洛谷 2194)

    题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...

  10. rpm 命令的使用

    rpm -ivh    xv-3.10a-13.i386.rpm 在Terminal中,基本的安装指令如下: rpm -i    xv-3.10a-13.i386.rpm 如果你的连网速度足够快,也可 ...