bzoj 4660 Crazy Rabbit——LIS解决“相交”限制的思想
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4660
想到一个点可以用它与圆的两个切点表示。并想到可以把切点极角排序,那么就变成环上的一些区间之间的问题。
发现了一个区间和另一个区间可以共存,当且仅当它们相交。不知怎的没看到题面的 “直线” ,以为包含也可以。
所有区间都两两相交,考虑枚举一个点作为所有区间都经过的点。但发现因为是环,可以有区间是首部相交一些区间、尾部相交一些区间的。
然后就不会了。
其实考虑没有那种首部相交一些、尾部相交一些的情况,除了枚举一个所有区间都经过的点,还可以考虑用 LIS 做。
就是枚举一个区间,把 “左端点在自己区间里,与自己是相交关系” 的区间拿出来,按左端点排序,对右端点求 LIS 。
有那种情况的话,考虑把那种区间首尾交换一下,就可以像原来那样做了!!!
求切点极角,令 \( len * cos( s ) = R , len * cos( g ) = x \) ,即 s 是 “该点到原点连线” 与 “切点到原点连线” 的夹角, g 是 “该点到原点连线” 与 “x轴” 的夹角,那么两个切点的极角就是 s-g 和 s+g 。
求 LIS 的时候,把各种点的值改成与当前区间左端点的距离就很方便了。
注意是 “直线” 所以是可以相交但不能包含。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
const int N=; const db pi2=*acos(-);
int n,R,tot,ans;db f[N];
struct Node{
db l,r;
Node(db l=,db r=):l(l),r(r) {}
bool operator< (const Node &b)const
{return l<b.l;}
}a[N],b[N];
db Dis(int x,int y){return sqrt((db)x*x+(db)y*y);}
bool chk(db x,db l,db r)
{ if(l<r)return x>l&&x<r; else return x>l||x<r;}
db cal(db x,db y)
{ if(x<y)return y-x; else return pi2-(x-y);}
void get(int cr)
{
sort(b+,b+tot+); int cd=;
for(int i=;i<=tot;i++)
{
if(b[i].r>f[cd])f[++cd]=b[i].r;
int l=,r=cd,p=;
while(l<=r)
{
int mid=l+r>>;
if(f[mid]>=b[i].r)p=mid,r=mid-;
else l=mid+;
}
f[p]=b[i].r;
}
ans=Mx(ans,cd+);//+1 for i
}
int main()
{
n=rdn();R=rdn();
for(int i=;i<=n;i++)
{
int x=rdn(), y=rdn(); db len=Dis(x,y);
db s=acos(R/len), g=acos(x/len); if(y<)g=pi2-g;
a[i].l=g-s; a[i].r=g+s;
if(a[i].l<)a[i].l+=pi2; if(a[i].r>pi2)a[i].r-=pi2;
}
for(int i=;i<=n;i++)
{
tot=;
for(int j=;j<=n;j++)
{
if(j==i)continue;
if(chk(a[j].l,a[i].l,a[i].r)&&!chk(a[j].r,a[i].l,a[i].r))
b[++tot]=Node(cal(a[i].l,a[j].l),cal(a[i].l,a[j].r));
else if(chk(a[j].r,a[i].l,a[i].r)&&!chk(a[j].l,a[i].l,a[i].r))
b[++tot]=Node(cal(a[i].l,a[j].r),cal(a[i].l,a[j].l));
}
get(i);
}
printf("%d\n",ans);
return ;
}
bzoj 4660 Crazy Rabbit——LIS解决“相交”限制的思想的更多相关文章
- 【BZOJ4660】Crazy Rabbit 结论+DP
[BZOJ4660]Crazy Rabbit Description 兔子们决定在自己的城堡里安排一些士兵进行防守.给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个 ...
- 三倍经验——bzoj3663、4660、4206 Crazy Rabbit/最大团
题目描述: 3663 4660 4206 题解: 第一眼:不成立的互相连边,然后用网络流求解无向图最小点覆盖! 好吧我不会. 正解: 每个点对应圆上的一段圆弧,长这样: 设对应圆弧$(l,r)$. 若 ...
- P3897 [湖南集训]Crazy Rabbit
\(\color{#0066ff}{ 题目描述 }\) 兔子们决定在自己的城堡里安排一些士兵进行防守. 给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个兔子,使得它 ...
- BZOJ 1046 上升序列(LIS变形)
要保证长度为L的序列下标字典序最小,当然要尽量选前面的数. 如何判断前面的数是否满足条件?,只需要知道这个数开头的递增序列的最长长度是多少,如果不小于L,那么必然可以加入这个数.还需判断一下它是否大于 ...
- BZOJ - 3757 树上莫队解决离线路径问题 & 学习心得
题意:给你一棵树,求u,v最短路径的XXX(本题是统计权值种类) 今天课上摸鱼学了一种有意思的处理路径方式(其实是链式块状树翻车了看别的),据说实际运行跑的比XX记者还快 大概就是像序列莫队那样 首先 ...
- BZOJ 2127: happiness(最小割解决集合划分)
Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 2350 Solved: 1138[Submit][Status][Discuss] Descript ...
- 用DFS 解决全排列问题的思想详解
首先考虑一道奥数题目: □□□ + □□□ = □□□,要将数字1~9分别填入9个□中,使得等式成立.例如173+286 = 459.请输出所有合理的组合的个数. 我们或许可以枚举每一位上所有的数,然 ...
- 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务
在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...
- bzoj 4765: 普通计算姬 主席树+替罪羊树思想
题目大意: 给定一棵\(n\)个节点的带权树有根树,设\(sum_p\)表示以点\(p\)为根的这棵子树中所有节点的权 计算姬支持下列两种操作: 给定两个整数\(u,v\),修改点\(u\)的权值为\ ...
随机推荐
- 2019-03-07-day006-小数据池
01 昨日内容回顾 字典: 映射,{} 键值对的形式存储,容器型数据类型,key 唯一的,可哈希的,value任意数据类型,对象. 3.6之前无序的, 3.6之后,有序的(第一次创建字典的顺序) 特点 ...
- c++下基于windows socket的多线程服务器(基于TCP协议)
之前用c++实现过基于windows socket的单线程TCP服务器(http://www.cnblogs.com/jzincnblogs/p/5170230.html),今天实现了一个多线程的版本 ...
- HDU 6038 17多校1 Function(找循环节/环)
Problem Description You are given a permutation a from 0 to n−1 and a permutation b from 0 to m−1. D ...
- vuejs 在移动端调起键盘并触发‘前往’按钮
<template> <div class="display"> <form @submit.prevent> <input @keyup ...
- 清除chrome浏览器HSTS缓存
如果你的网站启用了HSTS 在chrome中会用缓存效果,即使你的站点取消了HSTS,下次访问时,仍旧会自动给你重定向到HSTS. 那么如何清除 HSTS呢? chrome://net-interna ...
- Samsung_tiny4412(驱动笔记05)----Makefile,open,read,write,lseek,poll,ioctl,fasync
/*********************************************************************************** * * Makefile,op ...
- Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC
/**************************************************************************** * * ASM with C,MMU,Exc ...
- multi-thread debug
1.不要去解锁一个未被加锁的mutex锁: 2.不要一个线程中加锁而在另一个线程中解锁: 3.使用mutex锁用于保护临界资源,严格按照“加锁-->写入/读取临界资源-->解锁”的流程执行 ...
- MySQL中的存储过程和函数使用详解
一.对待存储过程和函数的态度 在实际项目中应该尽量少用存储过程和函数,理由如下: 1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了. 2.调试麻烦,在db中报一个错误和在 ...
- 区块链与Git版本工具的比较
区块链与Git版本工具的比较 来源:http://www.jianshu.com/p/b96b98983df6 作者: 梁波林 相同点: 1. 分布式存储方案 2. 链式数据 3. 去中心化 4. ...