题面

直线

题解

注意到题目没有给什么特殊的性质,除了直线随机生成。

所以考虑随机化算法或均摊算法。

有一种很神奇的分块做法:

考虑将整个平面分成 B×BB\times BB×B 块,每块大小 109B×109B\dfrac{10^9}{B}\times\dfrac{10^9}{B}B109​×B109​,而且每一个块记录一下有哪些直线经过它,询问的时候直接枚举经过询问点所在块内的所有直线并判断统计。

分析一下时间复杂度:

首先是预处理,对于每一条直线,它经过的块数大约为 BBB,所以这部分的时间复杂度是 O(nB)O(nB)O(nB)。

其次是询问时枚举当前块内的所有直线。刚刚我们得出了所有直线经过的块数为 O(nB)O(nB)O(nB) 级别的,那么每一块均摊下来经过直线条数约是:nBB2=nB\dfrac{nB}{B^2}=\dfrac{n}{B}B2nB​=Bn​,所以这部分的时间复杂度是 O(qnB)O(q\dfrac{n}{B})O(qBn​)。

总时间复杂度 O(nB+qnB)O(nB+q\dfrac{n}{B})O(nB+qBn​),取 B=nB=\sqrt{n}B=n​ 即可。

代码如下:

#include<bits/stdc++.h>#define SN 350
#define N 100010
#define eps 1e-6using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^'0');ch=getchar();}return x*f;
}int n,q,x[N][2],y[N][2];
int block,len;vector<int>v[SN][SN];bool compare(double a,double b)
{if(fabs(a-b)<eps) return 0;return (a<b?-1:1);
}int get(double x)
{if(!compare(x,(int)x))return ((int)x-1)/len+1;return ((int)ceil(x)-1)/len+1;
}int main()
{n=read(),q=read();block=sqrt(n);len=1e9/block;while(block*len<1e9) len++;int check=1;get(check);for(int i=1;i<=n;i++){x[i][0]=read(),y[i][0]=read(),x[i][1]=read(),y[i][1]=read();if(x[i][0]==x[i][1]){int b=get(x[i][0]);for(int j=1;j<=block;j++)v[b][j].push_back(i);}else if(y[i][0]==y[i][1]){int b=get(y[i][0]);for(int j=1;j<=block;j++)v[j][b].push_back(i);}else{double k=1.0*(y[i][1]-y[i][0])/(x[i][1]-x[i][0]);double b=1.0*y[i][0]-k*x[i][0];double l=min(1e9,max(1.0,(1e9-b)/k)),r=max(1.0,min(1e9,(1-b)/k));if(l>r) swap(l,r);int xlb=get(l),xrb=get(r);for(int j=xlb;j<=xrb;j++){double xl=max(l,1.0*(j-1)*len+1),xr=min(r,1.0*j*len);double yl=k*xl+b,yr=k*xr+b;if(yl>yr) swap(yl,yr);int ylb=get(yl),yrb=get(yr);for(int k=ylb;k<=yrb;k++)v[j][k].push_back(i);}}}while(q--){int xx=read(),yy=read();int xb=get(xx),yb=get(yy),ans=0;for(int i=0,size=v[xb][yb].size();i<size;i++){int k=v[xb][yb][i];ans+=(1ll*(y[k][1]-y[k][0])*(xx-x[k][1])==1ll*(yy-y[k][1])*(x[k][1]-x[k][0]));}printf("%d\n",ans);}return 0;
}

【XSY3904】直线(分块)相关推荐

  1. [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  2. BZOJ-2002-Bounce弹飞绵羊-分块

    描述 Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知 ...

  3. CF436F Banners(分块/凸包/单调队列)

    CF436F Banners 首先有n个物品分别有ai和bi,然后定义价值为 c∗w+p∗(ai大于p且bi小于c的用户个数)c*w+p*(ai大于p且bi小于c的用户个数)c∗w+p∗(ai大于p且 ...

  4. 洛谷-P3203 弹飞绵羊 分块

    题目 题目链接 题意 据说这道题要用一道叫做LCT的数据结构,然而我不会... 一排有n个弹簧装置,从第iii个可一往后跳k[i]" role="presentation" ...

  5. 空间中的语义直线检测_直线检测

    作者:张远学; 陶青川; 王维 期刊:<现代计算机> 为了限制河岸场景下不文明.违规的垂钓行为,提出一种融入深度学习的垂钓行为检测方法.首先使用基于CNN开发的语义分割模型deeplabV ...

  6. #广搜,分块#jzoj 3974 CH #46A 磁力块

    题目 主人公一开始在一个位置用磁铁吸引其它磁铁,当磁铁的质量≤\leq≤磁力就会吸到主人公手里,不在主人公手里的磁铁不会互相吸引,主人公可以更换磁铁,但是只能原地不动,问主人公最多能吸到多少块磁铁 分 ...

  7. 「分块系列」公主的朋友 解题报告

    公主的朋友 Description Problem 由于\(Wulala\)在上个问题中的精彩表现,公主认为\(Wulala\)是一个很棒的人,就把\(Wulala\)留在 了\(X\)国.这时正好公 ...

  8. HYSBZ - 2002 :Bounce 弹飞绵羊 (分块算法)

    Bounce 弹飞绵羊 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  9. 分块 公主的朋友

    问题 B: 公主的朋友 时间限制: 1 Sec  内存限制: 256 MB 题目描述 由于 Wulala 在上个问题中的精彩表现,公主认为 Wulala 是一个很棒的人,就把 Wulala 留在了 X ...

最新文章

  1. python最大公约数和最小公倍数的求法_最大公约数和最小公倍数的求法分析
  2. ZooKeeper 的典型应用场景
  3. VC使用CRT调试功能来检测内存泄漏
  4. 让Oracle SQL Developer显示的时间包含时分秒
  5. 查看CentOS的版本信息
  6. js一键批量打印_js批量打印文件夹
  7. golang json数组拼接
  8. python搭建环境教程_python教程(一)·python环境搭建
  9. 教大家查看、使用Untiy内部库和方法
  10. 学生信息管理系统优化问题汇总
  11. 分区桌面 壁纸(正在做,常用,之后在做,临时存)
  12. win10怎么改管理员名字_中控智慧考勤门禁_机器直连软件及清除管理员
  13. layui图标显示不正常,显示成方块
  14. 案例分享:如何通过数据分析进行活动效果评估
  15. 软件项目管理案例复习题
  16. rm ,rm -rf , rm -f 以及rm 命令的其他参数命令
  17. linux下常用vi操作命令
  18. mkdir: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initia
  19. YOLOv3源码解析2-数据预处理Dataset()
  20. 奥运会运动项目名称汇总

热门文章

  1. 微博,要再造一个“微博”?
  2. unity 卡通风格渲染
  3. git上传代码简单方法 简单git上传代码工具
  4. HTTP状态 500 - 内部服务器错误java.lang.NullPointerException
  5. 计算机资料室英语翻译,资料英文怎么说_资料的英文怎么写 - 沪江英语
  6. Oracle中根据中文获取拼音首字母
  7. 10个必须掌握的SQL常用语句
  8. 如何知道当前路由从哪个路由跳过来?(vue)
  9. JavaScript内置对象(对象/数组/)
  10. CDS视图的基本语法,函数以及数量,货币类型转换