牛客练习赛65(C 思维 )

题目链接

C-二维动点

思维,一道简单题,实现处理出问题,细节处理方面还是不够优秀。

去掉(0,0)的点,若目标点 存在一条直线直接到达,答案是1

否则 n>=3 答案一定是2

n==2 则判断是否是平行四边形。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define maxn 1005
#define inf 1e9
#define pb push_back
#define mk make_pair
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=5e5+10;
ll n,q,X[N],Y[N];
pair<ll,ll> t;
map<pair<ll,ll> ,int >mp;

pair<ll,ll> cal(ll x,ll y)
{
    if(x==0) return make_pair(0,1);

    if(y==0) return make_pair(1,0);

    ll gc=gcd(x,y);x=x/gc,y=y/gc;
    if(y<0) x=-x,y=-y;

    return make_pair(x,y);
}

int main()
{
    n=read(),q=read();

    rep(i,1,n) {
        X[i]=read(),Y[i]=read();
        if(X[i]==0&&Y[i]==0) {
            i--,n--;
            continue;
        }
        t=cal(X[i],Y[i]);
        mp[cal(X[i],Y[i])]++;
    }



    while(q--)
    {
        ll x=read(),y=read();

        if(x==0&&y==0){puts("0");continue;}

        if(mp[cal(x,y)]) {puts("1");continue;}


        if(mp[cal(X[1],Y[1])]==n){puts("-1");continue;}

        if(n==2){
            if(X[1]+X[2]==x&&Y[1]+Y[2]==y) puts("3");
            else puts("2");
        }
        else puts("2");

    }
}
/*
2 100
2 0
1 0

*/

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/106736624
今日推荐