NJUST(夕阳下的奔跑)

http://icpc.njust.edu.cn/Contest/36/H/

id:xs2014team_164(833779)

1.终点向量即斜率。

2.数据范围是long long。

3.细心推公式即可。

****************************************

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=110000;

int n;
long long x11,y11;
long long sum[maxn],z[maxn];

int find(long long x)
{
    int l=1,r=n;
    while(l<=r)
    {
        int m=(l+r)/2;
        if(z[m]>=x)r=m-1;
        else l=m+1;
    }
    return l;
}

int main()
{
    while(~scanf("%lld%lld",&x11,&y11))
    {
        double num=sqrt(1.0*(x11*x11)+1.0*(y11*y11));
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            long long a,b;
            scanf("%lld%lld",&a,&b);
            z[i]=y11*a-x11*b;
        }
        sort(z+1,z+1+n);
        sum[0]=0.0;
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+z[i];
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            long long x0,y0;
            scanf("%lld%lld",&x0,&y0);
            long long c=x11*y0-y11*x0;
            int p=find(-c);
            printf("%.2lf ",(sum[n]-2*sum[p-1]+(n-2*p+2)*c)/num);
        }
    }
    return 0;
}

****************************************

原文地址:https://www.cnblogs.com/MobileRobot/p/3774383.html