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
*/