济南学校D1T3_hahaha
【问题描述】
小Q对计算几何有着浓厚的兴趣。他经常对着平面直角坐标系发呆,思考一些有趣的问题。今天,他想到了一个十分有意思的题目:
首先,小Q会在轴正半轴和轴正半轴分别挑选个点。随后,他将轴的点与轴的点一一连接,形成条线段,并保证任意两条线段不相交。小Q确定这种连接方式有且仅有一种。最后,小Q会给出个询问。对于每个询问,将会给定一个点,请回答线段OP与条线段会产生多少个交点?
小Q找到了正在钻研数据结构的你,希望你可以帮他解决这道难题。
【输入格式】
第行包含一个正整数,表示线段的数量;
第行包含个正整数,表示小Q在轴选取的点的横坐标;
第行包含个正整数,表示小Q在轴选取的点的纵坐标;
第4行包含一个正整数,表示询问数量;
随后行,每行包含两个正整数,表示询问中给定的点的横、纵坐标。
【输出格式】
共行,每行包含一个非负整数,表示你对这条询问给出的答案。
【样例输入】
3
4 5 3
3 5 4
2
1 1
3 3
【样例输出】
0
3
【样例解释】
然后塔里啥都没有。
【数据规模与约定】
对于的数据50%,n,m<=2000。
对于的数据100%,n,m<=200000,坐标范围<=100000000。
_______________________________________________________________
简单的二分答案
_______________________________________________________________
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 int a[200010],b[200010]; 8 int n,m; 9 int x,y; 10 void readint(int &x) 11 { 12 char c=getchar(); 13 for(;c>'9'||c<'0';c=getchar()); 14 x=0; 15 for(;c<='9'&&c>='0';c=getchar())x=x*10+c-'0'; 16 } 17 bool pd(int cur) 18 { 19 double yy=(double)(a[cur]-x)*b[cur]/a[cur]; 20 return yy-y<=0.0000001; 21 } 22 int main() 23 { 24 freopen("hahaha.in","r",stdin); 25 freopen("hahaha.out","w",stdout); 26 readint(n); 27 for(int i=0;i<n;i++)readint(a[i]); 28 sort(a,a+n); 29 for(int i=0;i<n;i++)readint(b[i]); 30 sort(b,b+n); 31 readint(m); 32 for(int i=0;i<m;i++) 33 { 34 readint(x);readint(y); 35 int l=0,r=n-1,ans=-1; 36 while(l<=r) 37 { 38 int mid=(l+r)/2; 39 if(pd(mid)) 40 { 41 ans=mid; 42 l=mid+1; 43 } 44 else r=mid-1; 45 } 46 printf("%d\n",ans+1); 47 } 48 fclose(stdin); 49 fclose(stdout); 50 return 0; 51 }