Submission #42097253


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for (ll i=a;i<(ll)(n);i++)
#define per(i,a,n) for (ll i=n;i-->(ll)(a);)
ll read(){ll r;scanf("%lld",&r);return r;}
ll gcd(ll a,ll b) {
  if(b<0) b=-b;
  return (b == 0)?a:gcd(b,a%b);
}
using frac=pair<ll,ll>; // {a,b} = a/b
using point=array<frac,3>;
using direct=array<frac,3>;
using line=pair<point,direct>;
const frac ZERO{0,1};

frac norm(const frac&a){
  auto [t,b]=a;
  if(t==0) return {0,1};
  if(t < 0) {
    t=-t;
    b=-b;
  }
  ll m = gcd(t,b);
  return {t/m,b/m};
}

frac operator+(const frac&a,const frac&b){
  return norm({a.first*b.second+a.second*b.first,a.second*b.second});
}
frac operator-(const frac&a,const frac&b){
  return norm({a.first*b.second-a.second*b.first,a.second*b.second});
}
frac operator*(const frac&a,const frac&b){
  return norm({a.first*b.first,a.second*b.second});
}

frac operator/(const frac&a,const frac&b){
  assert(b.first != 0);
  return norm({a.first*b.second,a.second*b.first});
}

pair<bool,array<frac,3> > cross(const line&l0,const line&l1){
  // pl(l0);
  // pl(l1);
  auto [p0,a0] = l0; // [x,y,z] = p0 + a0 t0
  auto [p1,a1] = l1; // [x,y,z] = p1 + a1 t1
  vector A(3,vector<frac>(3)); // 增广矩阵
  rep(i,0,3){
    A[i][0] = a0[i];
    A[i][1] = ZERO - a1[i];
    A[i][2] = p1[i]-p0[i];
  }
  // 高斯消元
  rep(c,0,2) { // col and row
    rep(i,c,3) if(A[i][c] != ZERO) {
      swap(A[i],A[c]);
      break;
    }
    if(A[c][c] == ZERO) return {false, {}};
    per(j,c,3) A[c][j] = A[c][j] / A[c][c]; // 单位化
    rep(i,0,3) if(i!=c) per(j,c,3) A[i][j] = A[i][j] - A[c][j] * A[i][c];
  }
  if(A[2][2] != ZERO) return {false,{}};
  frac t0 = A[0][2];
  frac x = p0[0] + t0 * a0[0];
  frac y = p0[1] + t0 * a0[1];
  frac z = p0[2] + t0 * a0[2];
  return {true,{x,y,z}};
}

int main(){
  vector<point> xyz;
  int n=read();
  rep(i,0,n) {
    frac x=norm({read(),1});
    frac y=norm({read(),1});
    frac z=norm({read(),1});
    xyz.push_back({x,y,z});
  }
  auto cmp= [&](auto &a,auto &b){
      rep(t,0,size(a)) if(a[t] != b[t]) return (a[t]-b[t]).second < 0;
      return false;
  };
  sort(begin(xyz),end(xyz),cmp);
  int ans = n;
  auto arrow=[&](const point&a,const point&b) -> direct {
    frac dx=b[0]-a[0];
    frac dy=b[1]-a[1];
    frac dz=b[2]-a[2];
    assert(dx != ZERO);
    dz = dz/dx;
    dy = dy/dx;
    dx = dx/dx;
    return {dx,dy,dz};
  };
  // 多点共线
  rep(i,0,n) rep(j,i+1,n) if(xyz[i][0] != xyz[j][0]){
    direct i2j = arrow(xyz[i],xyz[j]);
    int cnt = 2;
    rep(k,j+1,n) if(i2j == arrow(xyz[i],xyz[k])) cnt ++ ;
    ans = min(ans, n - (cnt-1));
  }
  auto count=[&](const point&p){
    int rm = 0;
    vector<direct> arrows;
    rep(i,0,n) arrows.push_back(arrow(p,xyz[i]));
    sort(begin(arrows),end(arrows),cmp);
    rep(i,1,size(arrows)) if(arrows[i] == arrows[i-1]) rm++;
    ans = min(ans,n-rm);
  };
  // 两线交点 i->j, k->l
  rep(i,0,n) rep(j,i+1,n) if(xyz[i][0] != xyz[j][0]) {
    line i2j = {xyz[i], arrow(xyz[i],xyz[j])};
    rep(k,i+1,n) if(k!=j) rep(l,k+1,n) if(l != j) if(xyz[k][0] != xyz[l][0]){
      line k2l = {xyz[k], arrow(xyz[k],xyz[l])};
      auto [ok, p] = cross(i2j,k2l);
      if(ok and p[0].second < 0) count(p);
    }
  }
  printf("%d\n",ans);
  return 0;
}

Submission Info

Submission Time
Task G - Worst Picture
User cromarmot
Language C++ (GCC 9.2.1)
Score 600
Code Size 3277 Byte
Status AC
Exec Time 3849 ms
Memory 3772 KiB

Compile Error

./Main.cpp: In function ‘ll read()’:
./Main.cpp:6:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    6 | ll read(){ll r;scanf("%lld",&r);return r;}
      |                ~~~~~^~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 62
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All hand.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, random_30.txt, random_31.txt, random_32.txt, random_33.txt, random_34.txt, random_35.txt, random_36.txt, random_37.txt, random_38.txt, random_39.txt, random_40.txt, random_41.txt, random_42.txt, random_43.txt, random_44.txt, random_45.txt, random_46.txt, random_47.txt, random_48.txt, random_49.txt, random_50.txt, random_51.txt, random_52.txt, random_53.txt, random_54.txt, random_55.txt, random_56.txt, random_57.txt, random_58.txt, random_59.txt, sample_01.txt, sample_02.txt
Case Name Status Exec Time Memory
hand.txt AC 3696 ms 3688 KiB
random_01.txt AC 3 ms 3592 KiB
random_02.txt AC 2 ms 3740 KiB
random_03.txt AC 2 ms 3696 KiB
random_04.txt AC 2 ms 3768 KiB
random_05.txt AC 2 ms 3652 KiB
random_06.txt AC 2 ms 3744 KiB
random_07.txt AC 2 ms 3640 KiB
random_08.txt AC 2 ms 3684 KiB
random_09.txt AC 3 ms 3764 KiB
random_10.txt AC 2 ms 3704 KiB
random_11.txt AC 2 ms 3684 KiB
random_12.txt AC 2 ms 3620 KiB
random_13.txt AC 3 ms 3688 KiB
random_14.txt AC 3 ms 3720 KiB
random_15.txt AC 2 ms 3640 KiB
random_16.txt AC 1802 ms 3624 KiB
random_17.txt AC 3 ms 3704 KiB
random_18.txt AC 1826 ms 3748 KiB
random_19.txt AC 4 ms 3724 KiB
random_20.txt AC 1814 ms 3688 KiB
random_21.txt AC 5 ms 3672 KiB
random_22.txt AC 1799 ms 3712 KiB
random_23.txt AC 298 ms 3716 KiB
random_24.txt AC 701 ms 3712 KiB
random_25.txt AC 171 ms 3772 KiB
random_26.txt AC 716 ms 3672 KiB
random_27.txt AC 13 ms 3768 KiB
random_28.txt AC 730 ms 3656 KiB
random_29.txt AC 103 ms 3768 KiB
random_30.txt AC 725 ms 3604 KiB
random_31.txt AC 107 ms 3620 KiB
random_32.txt AC 496 ms 3672 KiB
random_33.txt AC 2 ms 3720 KiB
random_34.txt AC 1171 ms 3772 KiB
random_35.txt AC 446 ms 3656 KiB
random_36.txt AC 978 ms 3752 KiB
random_37.txt AC 361 ms 3672 KiB
random_38.txt AC 1386 ms 3704 KiB
random_39.txt AC 811 ms 3692 KiB
random_40.txt AC 360 ms 3632 KiB
random_41.txt AC 530 ms 3732 KiB
random_42.txt AC 3849 ms 3624 KiB
random_43.txt AC 1949 ms 3708 KiB
random_44.txt AC 2812 ms 3708 KiB
random_45.txt AC 1906 ms 3640 KiB
random_46.txt AC 2700 ms 3748 KiB
random_47.txt AC 1753 ms 3688 KiB
random_48.txt AC 4 ms 3764 KiB
random_49.txt AC 2 ms 3764 KiB
random_50.txt AC 3 ms 3596 KiB
random_51.txt AC 5 ms 3596 KiB
random_52.txt AC 2 ms 3604 KiB
random_53.txt AC 2 ms 3724 KiB
random_54.txt AC 2 ms 3624 KiB
random_55.txt AC 2 ms 3724 KiB
random_56.txt AC 2 ms 3640 KiB
random_57.txt AC 3 ms 3628 KiB
random_58.txt AC 3 ms 3720 KiB
random_59.txt AC 2 ms 3596 KiB
sample_01.txt AC 2 ms 3716 KiB
sample_02.txt AC 3 ms 3692 KiB