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 ...
随机推荐
- AJPFX总结抽象类和接口的区别
/* * 抽象类和接口的区别 * 1.成员的区别 * ...
- websocket 加layim实现在线聊天系统
实现流程: 1.浏览器连接服务器时保存所有用户id以及对应的唯一session(session用户用户消息推送). 1.1:判断登录用户是否有离线消息(个人消息以及群消息),有则将离线消息进行推送给登 ...
- Spring-bean(零)
内容提要:红为1,黄2,绿3 -----配置形式:基于xml文件的方式:基于注解的方式 -----Bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法&实例工厂方法),Facto ...
- Android里的 ART、JIT、AOT、Dalvik之间有什么关系?
ART.JIT.AOT.Dalvik之间有什么关系? JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编译技术", ...
- checking for gcc... no
./configure 后显示checking for gcc... nochecking for cc... nochecking for cl.exe... noconfigure.sh:erro ...
- 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复
源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...
- es5/6数组遍历以及常用的一些方法
数组的遍历方法 1...for(var i=0;i<arr.length;i++){ } ---------------------------------------------------- ...
- 为什么ABAP整型的1转成string之后,后面会多个空格
有同事问这个问题:lv_s是从int4转过来的,长度为2,和硬编码的lv_s2(长度为1)相比,后面多了个空格. 为什么?查SAP ABAP的编程帮助F1 help. 帮助文档说的很清楚了:如果赋值操 ...
- js文件下载代码 import downloadjs from 'downloadjs'
function logDownload(contribution_id) { setTimeout(function () { $.ajax({ url: "/ajax/Wallpaper ...
- Element UI tree 回显问题
Part.1 问题 写项目时遇到一个棘手的问题,在做关于权限功能时,点击修改需要显示角色原本对应的权限.涉及到了 tree 组件回显,但是有一个很尴尬的问题:tree 组件只要父节点选中,那么子节点就 ...