求半径d<=50000的圆(不含边界)内n<=50000条直线有多少交点,给直线的解析式。

一开始就想,如果能求出直线交点与原点距离<d的条件,那么从中不重复地筛选即可。然而两个kx+b联立起来加勾股定理特别丑。。

换个想法,一条线在圆上就截了两个点。把这些点做极角排序后(即从y轴正半轴的射线顺时针扫一圈,把依次遇到的点排下来)后,每条直线就可以两个点表示。设其极角排序后,序较小的那个点叫A,另一个叫B。

其实就是:对所有(Ai,Bi),求有多少j满足Aj<Ai且Ai<Bj<Bi,其中小于号是极角序比较。

这就好比:给若干线段,求有多少对线段相交而不包含。也就是对所有Li,Ri,求有多少Lj<Li并且Li<Rj<Ri。也就是,把原来一条直线看成两个点,两个点按极角序编号,两个点间的弧的交拉直成线段交,求这些线段有多少对交,就变成很裸的扫描线。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
//#include<iostream>
using namespace std; int n,d;
#define maxn 100011
const double eps=1e-,inf=1e15;
struct Line
{
double k,b;
}a[maxn];
struct Point
{
double x,y,t;int k,id;
bool operator < (const Point &b) const
{return k<b.k || (k==b.k && t>b.t);}
bool operator == (const Point &b) const
{return fabs(x-b.x)<eps && fabs(y-b.y)<eps;}
bool operator != (const Point &b) const {return !(*this==b);}
}p[maxn];int lp=;
double x,y,z;
#define LL long long
void addp(double x,double y,int id)
{
Point &e=p[++lp];
e.x=x;e.y=y;e.id=id;
e.t=x?y/x:inf;
if (x>= && y>) e.k=;
else if (x> && y<=) e.k=;
else if (x<= && y<) e.k=;
else e.k=;
}
void makep(int x)
{
if (a[x].k==inf)
{
if (a[x].b-d>eps || a[x].b+d<-eps) return;
addp(a[x].b,sqrt(1.0*d*d-a[x].b*a[x].b),x);
addp(a[x].b,-sqrt(1.0*d*d-a[x].b*a[x].b),x);
}
else
{
double u=a[x].k*a[x].k+,v=*a[x].k*a[x].b,w=a[x].b*a[x].b-d*d;
if (v*v-*u*w<-eps) return;
double tmp=(-v+sqrt(v*v-*u*w))/(*u);
addp(tmp,a[x].k*tmp+a[x].b,x);
tmp=(-v-sqrt(v*v-*u*w))/(*u);
addp(tmp,a[x].k*tmp+a[x].b,x);
}
}
struct BIT
{
int a[maxn],n;
void clear(int n) {memset(a,,sizeof(a));this->n=n;}
void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;}
int query(int x) {int ans=;for (;x;x-=x&-x) ans+=a[x];return ans;}
}t;
struct seg
{
int l,r;
bool operator < (const seg &b) const {return l<b.l;}
}b[maxn];
bool vis[maxn];
int main()
{
scanf("%d%d",&n,&d);
for (int i=;i<=n;i++)
{
scanf("%lf%lf%lf",&x,&y,&z);
a[i].k=y?-x/y:inf;
a[i].b=y?-z/y:-z/x;
makep(i);
}
sort(p+,p++lp);
memset(vis,,sizeof(vis));
p[lp+].x=inf;p[lp+].y=inf;
int cnt=,last=;
for (int i=;i<=lp+;i++) if (p[i]!=p[i-])
{
cnt++;
for (int &j=last;j<i;j++)
if (vis[p[j].id]) b[p[j].id].r=cnt;
else vis[p[j].id]=,b[p[j].id].l=cnt;
}
for (int i=;i<=n;i++) if (!vis[i]) b[i].l=b[i].r=0x3f3f3f3f;
sort(b+,b++n);
LL ans=;last=;
t.clear(cnt);
for (int i=;i<=(lp>>)+;i++) if (b[i].l!=b[i-].l)
{
for (int j=last;j<i;j++)
ans+=t.query(b[j].r-)-t.query(b[j].l);
for (int &j=last;j<i;j++)
t.add(b[j].r,);
}
printf("%lld\n",ans);
return ;
}

BZOJ1573: [Usaco2009 Open]牛绣花cowemb的更多相关文章

  1. 【树状数组 离散化】bzoj1573: [Usaco2009 Open]牛绣花cowemb

    解方程题! Description Bessie学会了刺绣这种精细的工作.牛们在一片半径为d(1 <= d <= 50000)的圆形布上绣花. 它们一共绣了N (2 <= N < ...

  2. NOIP2018 - 暑期博客整理

    暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ3403: [Usaco2009 Open]Cow Line 直线上的牛

    3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 48  Solved: 41[S ...

  5. BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛( deque )

    直接用STL的的deque就好了... ---------------------------------------------------------------------- #include& ...

  6. 3403: [Usaco2009 Open]Cow Line 直线上的牛

    3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 62[S ...

  7. 【BZOJ】3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3404 裸的双端队列.. #include <cstdio> #include <c ...

  8. B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque

    deque真的秀,queue和stack...没啥用了啊.操作差不多,就是在前面加一个front||back_就行了. 题干: 题目描述 题目描述     约翰的N只奶牛(编为1到N号)正在直线上排队 ...

  9. BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)

    直接双端队列模拟,完了= = CODE: #include<cstdio>#include<algorithm>#include<iostream>#include ...

随机推荐

  1. 人物丨让小三吐血,让原配泣血——24K渣男郎咸平

    http://url.cn/5swgmythttps://www.toutiao.com/i6650650793743483395人物丨让小三吐血,让原配泣血——24K渣男郎咸平 人物丨让小三吐血,让 ...

  2. objectbox基础

    objectbox基础 参考链接 官网地址 http://objectbox.io github地址 https://github.com/objectbox/objectbox-java https ...

  3. mysql出错排查

    1,例如:Can't connect to local MySQL server through socket '/tmp/mysql-5.5.37.sock' (2) Mysql链接出错,请配置/A ...

  4. General mistakes in parallel computing

    这是2013年写的一篇旧文,放在gegahost.net上面  http://raison.gegahost.net/?p=97 March 11, 2013 General mistakes in ...

  5. 借助tween.js小球沿div四边跑的动画效果

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. 洛谷 P1832 A+B Problem(再升级)

    题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛滥趋势 ·以上纯属个人吐槽 ·给定一个正整数n ...

  7. Git 版本控制系统的基本使用、常用操作

    以Ubuntu16.04操作系统为例(其他系统类似),主要记录常用的.基本操作: 0. 安装Git 分散型版本控制系统(CVS): sudo apt-get install git 1. 初始化本地配 ...

  8. Windows程序设计2(消息机制、菜单)

    一 .小记; PostQuitMessage(0); 产生WM_QUIT消息给进程队列,且立即返回,同时使得消息循环退出,使得进程终止.(其实它通过PostMessage(hWnd,WM_QUIT,0 ...

  9. python之路——函数进阶

    阅读目录   楔子 命名空间和作用域 函数嵌套及作用域链 函数名的本质 闭包 本章小结 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x> ...

  10. easyui权限管理

    在easyui上实现权限的管理 所谓权限:指的是系统中的资源,资源包括菜单资源(学习情况报表,账号审核...)以及按钮资源所谓角色:指的是系统中的权限集合(每一个角色对应着哪些权限集合) 1.一星权限 ...