计蒜客NOIP模拟赛 直线的交点
来源:互联网 发布:ubuntu 调整分辨率 编辑:程序博客网 时间:2024/06/05 11:53
题面
既然题目中只求在区域内的交点个数,不妨只考虑区域内的情况。
由于题目说明了给出的直线不与区域边界直线平行,那么每条直线必然与边界直线各有一个交点。只把区域内的情况画出来应该像下图的样子。
从这里可以明显看出,如果把每条直线与左右边界的交点分别记作
求出左右交点的时间复杂度为
#include<stdio.h>#include<algorithm>#define ll long long#define MAXN 100005#define dd doubleusing namespace std;inline ll _R(){ char s=getchar();ll v=0,sign=0; while((s!='-')&&(s>57||s<48))s=getchar(); if(s=='-')sign=1,s =getchar(); for(;s>47&&s<58;s=getchar())v=v*10+s-48; if(sign)v=-v; return v;}ll K,A,B,N,k[MAXN],b[MAXN],Ans;struct node{dd L,R;}line[MAXN];bool operator<(node a,node b){ return a.L<b.L;}dd Hash[MAXN];ll C[MAXN];ll GetSum(ll x){ ll i,sum=0; for(i=x;i;i^=(i&-i))sum+=C[i]; return sum;}void Modify(ll x){ ll i; for(i=x;i<=N;i+=(i&-i))C[i]++;}int main(){ int i,j; dd tmp; K=_R();A=_R();B=_R(); N=_R(); for(i=1;i<=N;i++)k[i]=_R(),b[i]=_R(); for(i=1;i<=N;i++) { tmp=1.0*(B-b[i])/(k[i]-K); line[i].L=tmp; tmp=1.0*(A-b[i])/(k[i]-K); line[i].R=tmp; Hash[i]=tmp; } sort(line+1,line+N+1); sort(Hash+1,Hash+N+1); for(i=1;i<=N;i++) { j=lower_bound(Hash+1,Hash+N+1,line[i].R)-Hash; Ans+=i-1-GetSum(j-1); Modify(j); } printf("%lld",Ans);}
阅读全文
0 0
- 计蒜客NOIP模拟赛 直线的交点
- 直线的交点公式
- 直线的交点
- 计算直线的交点数
- 求两直线的交点
- 计算直线的交点数
- 求两直线的交点
- 直线和平面的交点
- c++求两条直线的交点
- POJ 1269(直线的交点)
- 计算直线的交点数
- hdu 计算直线的交点
- 计算直线的交点数
- 直线与抛物线的交点
- 计算直线的交点数
- 计算直线的交点数
- 使用点斜式求两直线的交点
- 求两直线的交点
- 用construct2制作ghost shooter
- leetcode DFS
- codeforces gym 101142G Gangsters in Central City
- 求出0~999之间的所有“水仙花数”并输出。“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
- Attribute,appendChild,insertbefore,removeChild随笔
- 计蒜客NOIP模拟赛 直线的交点
- C++基础知识
- 仙人掌[cactus]
- poj 3678 Katu Puzzle && POJ 3207 Ikki's Story IV
- Java在进行网络传输的过程中的奇技淫巧
- Unity中Shader LOD控制
- MATLAB中图像的种类及基础知识
- 快捷键 java
- 校正网络的设计