几何+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. 15Microsoft SQL Server 数据库维护

    Microsoft SQL Server 数据库维护 2.6.1数据库联机与脱机 --联机:该状态为数据库正常状态,也就是我们常看到的数据库的状态,该状态下的数据库处于可操作状态,可以对数据库进行任何 ...

  2. git学习(3)----git 新建分支并提交本地代码到远程分支

    一.步骤 1.在gitlab上创建一个issue,issue一般来说是版本发布说明.比如本次更新了什么功能,修复了什么bug什么的. 2.然后在本地创建一个branch,或者直接在gitlab上申请m ...

  3. ionic3开发环境搭建与配置(win10系统)

    1.安装nodeJS(不会的自行百度) 2.安装ionic和cordova,执行以下命令: npm install -g ionic cordova 3.安装Java JDK: 下载地址:http:/ ...

  4. 网络配置:IP+NETMASK+GATEWAY+DNS

    1.  IP IP地址(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网际协议地址.常见的IP地址,分为IPv4与IPv6两大类. IP ...

  5. Linux之iptables(五、firewall命令及配置)

    firewalld服务 firewalld是CentOS 7.0新推出的管理netfilter的工具 firewalld是配置和监控防火墙规则的系统守护进程.可以实现iptables,ip6table ...

  6. iframe使用大全

    <iframe src=”you page’s url” width=”100″ height=”30″ frameborder=”no” border=”0″ marginwidth=”0″ ...

  7. java Beanutils.copyProperties( )用法

    这是一篇开发自辩甩锅稿~~~~ 昨天测试小姐姐将我的一个bug单重开了,emmmm....内心OS:就调整下对象某个属性类型这么简单的操作,我怎么可能会出错呢,一定不是我的锅!!but再怎么抗拒,bu ...

  8. Spring AOP 学习(五)

    1. 使用动态代理实现AOP package com.atguigu.spring.aop; import java.lang.reflect.InvocationHandler; import ja ...

  9. 【Codeforces 369C】 Valera and Elections

    [链接] 我是链接,点我呀:) [题意] 给你一棵树 让你选择若干个修理点. 这些修理点被选中之后,节点i到1号节点之间的所有"坏路"都会被修好 问最少需要选择多少个点才能将所有的 ...

  10. java之比较两个日期大小----https://blog.csdn.net/dongfangbaiyun/article/details/51225469

    https://blog.csdn.net/dongfangbaiyun/article/details/51225469 java之比较两个日期大小 最近又用到两个日期大小的比较,因此记录在此,方便 ...