求助奔驰定理做法
查看原帖
求助奔驰定理做法
1122530
elpsconr楼主2024/8/22 15:04

70分求助

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define all(x) x.begin(),x.end()
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define lc rt<<1
#define rc rt<<1|1
const int N=3e5+6,yyx=998244353;
int n,m;
struct node{
    int x,y;
    friend node operator- (node a,node b){
        return {a.x-b.x,a.y-b.y};
    }
    friend node operator+ (node a,node b){
        return {a.x+b.x,a.y+b.y};
    }
    friend bool operator== (node a,node b){
        if(a.x==0&&a.y==0||b.x==0&&b.y==0) return 1;
        int d=__gcd(abs(a.x),abs(a.y)),m=__gcd(abs(b.x),abs(b.y));
        return abs(a.x/d)==abs(b.x/m)&&abs(a.y/d)==abs(b.y/m)&&(a.x/d)*(a.y/d)==(b.x/m)*(b.y/m);
    }
}e[N];
node toin(string &s){
    int x=0,y=0;
    for(int i=0;i<s.size();++i){
        if(s[i]=='('){
            int j=i+1;
            while(j<s.size()&&isdigit(s[j])) j++;
            if(!isdigit(s[j])) j--;
            for(int k=i+1;k<=j;++k) x=x*10+s[k]-48;
        }
        if(s[i]==','){
            int j=i+1;
            while(j<s.size()&&isdigit(s[j])) j++;
            if(!isdigit(s[j])) j--;
            for(int k=i+1;k<=j;++k) y=y*10+s[k]-48;
        }
    }
    return {x,y};
}
int check(int x,int y,node p){
    node a=e[x],b=e[y];
    node v1=p-a,v2=p-b;
   int xx=max(a.x,b.x),yy=max(a.y,b.y);
   int kx=min(a.x,b.x),ky=min(a.y,b.y);
   //cout<<xx<<" "<<yy<<endl;
   //cout<<kx<<" "<<ky<<endl;
   return v1==v2&&p.x>=kx&&p.y>=ky&&p.y<=yy&&p.x<=xx;
}
inline void solve(){
  string s[3];
  for(int i=0;i<3;++i) cin>>s[i];
  for(int i=1;i<=3;++i) e[i]=toin(s[i-1]);
  string st;cin>>st;
  node p=toin(st);
  int x=p.x,y=p.y;
  for(int i=1;i<=3;++i){
    if(e[i].x==x&&e[i].y==y){
        cout<<4<<endl;return;
    }
  }
  //for(int i=1;i<=3;++i) cout<<e[i].x<<" "<<e[i].y<<endl;
  node v1=p-e[1],v2=p-e[2],v3=p-e[3];
  node b=v1+v2+v3;
  if(b.x==0&&b.y==0) cout<<1<<endl;
  else if(check(1,2,p)||check(2,3,p)||check(1,3,p)) cout<<3<<endl;
  else cout<<2<<endl;
// node g={0,2},d={0,5};
// cout<<(g==d)<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}
2024/8/22 15:04
加载中...