BZOJ1573: [Usaco2009 Open]牛绣花cowemb
求半径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的更多相关文章
- 【树状数组 离散化】bzoj1573: [Usaco2009 Open]牛绣花cowemb
解方程题! Description Bessie学会了刺绣这种精细的工作.牛们在一片半径为d(1 <= d <= 50000)的圆形布上绣花. 它们一共绣了N (2 <= N < ...
- NOIP2018 - 暑期博客整理
暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ3403: [Usaco2009 Open]Cow Line 直线上的牛
3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 48 Solved: 41[S ...
- BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛( deque )
直接用STL的的deque就好了... ---------------------------------------------------------------------- #include& ...
- 3403: [Usaco2009 Open]Cow Line 直线上的牛
3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 71 Solved: 62[S ...
- 【BZOJ】3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)
http://www.lydsy.com/JudgeOnline/problem.php?id=3404 裸的双端队列.. #include <cstdio> #include <c ...
- B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque
deque真的秀,queue和stack...没啥用了啊.操作差不多,就是在前面加一个front||back_就行了. 题干: 题目描述 题目描述 约翰的N只奶牛(编为1到N号)正在直线上排队 ...
- BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)
直接双端队列模拟,完了= = CODE: #include<cstdio>#include<algorithm>#include<iostream>#include ...
随机推荐
- PKU_campus_2018_D Chocolate
思路: 题目链接http://poj.openjudge.cn/practice/C18D/ kruskal过程中使用乘法原理计数. 实现: #include <bits/stdc++.h> ...
- intellij idea 调试 lua程序, 突然崩溃或者xmx不够的情况
将内存各方面的数值都改大一点.都什么时代了,默认数值还这么低... -server-Xms256m-Xmx1024m-XX:ReservedCodeCacheSize=240m-XX:+UseConc ...
- 亲身经历,Java面试题整理
博主在2015年暑期参加过一些Java开发工程师实习的面试和笔试,在此将重点整理出来,以供大家学习. 资料1: 一.单继承 1.1Java类是否支持多重继承? 答:继承的基本原则是: 子类继承父类的所 ...
- anzhuaggeoip
1.因启动geoip模块,需要先安装GeoIP # wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz # tar xv ...
- 秒杀Sublime Text的微软开源代码编辑工具Visual Studio Code
1. 下载链接: https://code.visualstudio.com/ 2. 秒开一个ASP.NET网站源码 3.编辑CSS颜色支持 4.Git支持 5.常用快捷键 Ctrl+Shift+P ...
- How To Build Kubernetes Platform (构建Kubernetes平台方案参考)
Architecture Architecture Diagram Non-Prod Environment Prod Environment Cluster Networking Container ...
- Bootstrap学习笔记之Nestable可拖拽树结构
Nestable是基于Bootstrap的一个可拖拽的树结构表现插件. 下面粗略的介绍一下它的用法,只作为学习参考,如有不合适之处,请各位凑合看. 下图是我在现在系统中用到的Nestable,对系统模 ...
- (转)Spring的bean管理(注解方式)
http://blog.csdn.net/yerenyuan_pku/article/details/69663779 Spring的bean管理(注解方式) 注解:代码中的特殊标记,注解可以使用在类 ...
- 世平信息(W 笔试)
选择题 大题 1.启动Thread的方法有几种 算法题 1.写出冒泡排序算法
- END - 提交当前的事务
SYNOPSIS END [ WORK | TRANSACTION ] DESCRIPTION 描述 END END 提交当前事务. 所有当前事务做的修改都可被其它事务看到并且保证在发生崩溃的情况下的 ...