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