济南学校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 }

 

posted on 2016-11-07 14:21  gryzy  阅读(227)  评论(0编辑  收藏  举报

导航