几何+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. java.lang.NoSuchFieldError: DEFAULT_INCOMPATIBLE_IMPROVEMENTS

    解决方案: 启动类上加@EnableAutoConfiguration(exclude = { FreeMarkerAutoConfiguration.class }) 或者在配置文件添加spring ...

  2. 完善本地搭建的jekyll环境(Windows)

    序:上篇文章虽然在本地搭建好了jekyll环境,但是却存在一些问题,如通过jekyll new创建的站点无法正常跑起来.中文编码有问题.这说明之前搭建的环境有不周之处. PS:因之前自己搭建环境时并未 ...

  3. 四角递推(CF Working out,动态规划递推)

    题目:假如有A,B两个人,在一个m*n的矩阵,然后A在(1,1),B在(m,1),A要走到(m,n),B要走到(1,n),两人走的过程中可以捡起格子上的数字,而且两人速度不一样,可以同时到一个点(哪怕 ...

  4. 【Codeforces 1009D】Relatively Prime Graph

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 1000以内就有非常多组互质的数了(超过1e5) 所以,直接暴力就行...很快就找完了 (另外一开始头n-1条边找1和2,3...n就好 [代 ...

  5. Leetcode 135.分糖果

    分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...

  6. 初次使用Let's encrypt

    wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks ...

  7. MaxScale初探

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mrcto.blog.51cto.com/1923168/1437287 内容预览 ...

  8. noip模拟赛 铺瓷砖

    [问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖, 你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为A/B贴在第二行的每块瓷 ...

  9. hdu 1533KM算法

    #include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #defi ...

  10. 【BZOJ2081】Beads(哈希表)

    题意: 翻转是指其中一段长度为k的子串全部翻转 n<=200000 a[i]<=n 思路:枚举k,直接哈希判充即可 时间复杂度是n/i求和,根据定理可得是O(n log n)级别的 单哈双 ...