几何+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. 浅谈es6 promise

    本文是借鉴于ac黄的博客. 接触es6也有几个月了,貌似没有系统的去学习过它,总是用到什么,查查什么.今天就说下es6中的promise对象. 先说说promise解决了什么问题? 写前端的同学都经常 ...

  2. Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题

    https://blog.csdn.net/shenpibaipao/article/details/70236657

  3. BNUOJ 19792 Airport Express

    Airport Express Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...

  4. noip模拟赛 enc

    [问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成, 对于每一个字母, 我们将它唯一地映射到另一个字母. 例如考虑映射规则:a->b, b- ...

  5. 【BZOJ3238】差异(后缀数组,单调栈)

    题意: 思路:显然len(t[i])+len(t[j])这部分的和是一定的 那么问题就在于如何快速求出两两之间lcp之和 考虑将它们排名后用SA可以很方便的求出lcp,且对答案没有影响,因为形式都是数 ...

  6. nyoj_68_三点顺序_201404152013

    三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆 ...

  7. Android GIS开发系列-- 入门季(4) GraphicsLayer的点击查询要素

    上一讲中我们学会了如何在MapView中添加Graphic要素,那么在百度或高德地图中,当我们点击要素时,会显示出相应的详细信息.在GraphicsLayer中也提供了这样的方法.下面我们来学习在Gr ...

  8. c++中的set_new_handler和new_handler

    当operator new申请一个内存失败的时候,它会进行如下的处理步骤:    1.如果存在客户指定的处理函数,则调用处理函数(new_handler),如果不存在则抛出一个异常. 2.继续申请内存 ...

  9. 1.3-动态路由协议EIGRP

    EIGRP(Enhanced IGRP) EIGRP的特点: IGRP/EIGRP都是CISCO的私有协议. 1:是唯一的一种LS/DV的混合协议. 2:Rapid convergence EIGRP ...

  10. The return type is incompatible with JspSourceDependent.getDependants():JasperException问题分析与解决方法

    Linux下基于JSP的报表集成到项目中后,显示不出来,查看tomcat的日志.有例如以下报错信息: The return type is incompatible with JspSourceDep ...