计蒜客NOIP模拟赛D2T2 直线的交点
2017-09-17 18:51
176 查看
伦伦刚刚在高中学习了解析几何,学会了计算两条直线的交点。这天,老师给她布置了一道作业。在平面上有 nnn 条直线,他们之间有若干交点。给定一对平板(两条平行的直线),问这有多少对直线,他们的交点在这一对平板之间(注意 (i, j) 和 (j, i) 只算一对)。
第二行一个整数 n。
接下来 n行每行两个整数 ki,bii,bi 表示第 iii 条直线的方程 y=kix+biy=k_ix+b_iy=kix+bi。
对于 100%的数据,n≤100000。
为了简单起见,输入数据保证,没有直线和平板平行,没有两条直线的交点在平板上。
只有 y=−x+10这条直线和 y=x,y=2x,y=−2x 这三条直线的交点在区域内。
输入格式
第一行三个整数 k,a,b 表示平板的两条平行直线的方程为 y=kx+a 和 y=kx+b,保证 a<b。第二行一个整数 n。
接下来 n行每行两个整数 ki,bii,bi 表示第 iii 条直线的方程 y=kix+biy=k_ix+b_iy=kix+bi。
输出格式
一个整数,表示有多少对直线,他们的交点在平板之间。数据范围与约定
对于 30%的数据,n≤5000。对于 100%的数据,n≤100000。
为了简单起见,输入数据保证,没有直线和平板平行,没有两条直线的交点在平板上。
样例解释
只有 y=−x+10这条直线和 y=x,y=2x,y=−2x 这三条直线的交点在区域内。
样例输入
0 3 50 5 1 0 2 0 -1 0 -2 0 -1 10
样例输出
3
[b]我们要用到以下观察,若两条直线的交点在平板内部。 则他们与下方平板和上方平板的交点横坐标大小关系相反。 这表明,如果将所有直线按照他们与下方平板的交点的横坐标排序, 将他们上方平板交点的横坐标作为关键字。 则平板内交点个数等于在排序后的序列中关于关键字的逆序对个数。 于是用归并排序来计算逆序对个数即可[/b]
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Line { double x1,x2; }line[100001],t[100001]; int n; double k1,a1,b1; double k,b; long long ans; bool cmp(Line a,Line b) { return a.x1<b.x1; } void partition(int l,int r) { if (l>=r) return; int mid=(l+r)/2; partition(l,mid); partition(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(line[i].x2>line[j].x2) { ans=(ans+mid-i+1); t[k]=line[j]; k++; j++; } else { t[k]=line[i]; k++; i++; } } while(i<=mid) { t[k]=line[i]; k++; i++; } while(j<=r) { t[k]=line[j]; k++; j++; } for(i=l; i<=r; i++) line[i]=t[i]; } int main() {int i; cin>>k1>>a1>>b1; cin>>n; for (i=1;i<=n;i++) { scanf("%lf%lf",&k,&b); line[i].x1=(b1-b)/(k-k1); line[i].x2=(a1-b)/(k-k1); } sort(line+1,line+n+1,cmp); partition(1,n); cout<<ans; }
相关文章推荐
- 直线与平面求交点
- 用矢量变换的方法求两条直线的交点
- 空间2直线交点算法
- hdu 1466 计算直线的交点数
- 求直线交点
- 点到直线的垂直交点坐标 和 距离计算
- 1466 计算直线的交点数
- POJ 1408 Fishnet(几何--叉积求面积 + 求直线的交点坐标)
- c++求两条直线的交点
- 求直线交点 叉积
- 算法之美——求两直线交点(三维叉积)——求四边形面积(二维叉积)
- hdu1466 计算直线的交点数
- 杭电ACM-HDOJ1466计算直线的交点数(动态规划)
- 一般方法编程求直线与圆交点
- POJ 1039 Pipe(直线和线段相交判断,求交点)
- poj 1269 判断直线相交,并求交点
- 使用投影计算两条直线交点
- hdu 1466 计算直线的交点数(动态规划)
- hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)
- 判断两条直线 共线或 平行 或相交 求交点 叉乘的应用 poj 1269 Intersecting Lines