QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#376871#2173. What's Our Vector, Victor?ucup-team1209TL 81ms9976kbC++204.7kb2024-04-04 17:56:332024-04-04 17:56:35

Judging History

This is the latest submission verdict.

  • [2024-04-04 17:56:35]
  • Judged
  • Verdict: TL
  • Time: 81ms
  • Memory: 9976kb
  • [2024-04-04 17:56:33]
  • Submitted

answer

#include <bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
cs int N = 500 + 5; 
using ll = long long ; 
using pi = pair <int, int> ;

mt19937 rnd(1232435);

int d, n; 
double x[N][N], v[N], r[N];
double base[N][N];
double a[N][N];
double X[N];
using db = double;
using sol = std::vector<db>;
using vd = sol;
int bc = 0;
void getans() {
    sol init(bc);
    vd z(d + 1);
    for(int i = 0;i <= d;++i) z[i] = X[i];
    auto eval = [&](sol x) {
        vd vec = z;
        for(int i = 0;i < bc;++i) {
            for(int j = 0;j <= d;++j) {
                vec[j] += base[i][j] * x[i];
            }
        }
        db sum = 0;
        for(int i = 0;i < d;++i) {
            sum += vec[i] * vec[i];
        }
        sum -= vec[d];
        return sum;
    };
    db rate = 1e5;
    for(int i = 0;i < bc;++i) {
        db sum = 0;
		for(int k = 0;k < i;++k) {
			db sdot = 0;
			for(int j = 0;j < d;++j) {
				sdot += base[i][j] * base[k][j];
			}
			for(int j = 0;j <= d;++j) {
				base[i][j] -= sdot * base[k][j];
			}
		}
        for(int j = 0;j < d;++j) {
            sum += base[i][j] * base[i][j];
        }
        sum = sqrt(sum);
        for(int j = 0;j <= d;++j) {
            base[i][j] /= sum;
        }
    }
	std::mt19937 gen;
    for(int i = 0;i < 100000;++i) {
        // std::cerr << init[0] << ' ' << eval(init) << '\n';
        if(i % 17 == 0 && eval(init) < -1) break;
        sol grad(bc);
        vd vec = z;
        for(int i = 0;i < bc;++i) {
            for(int j = 0;j <= d;++j) {
                vec[j] += base[i][j] * init[i];
            }
        }
        for(int i = 0;i < bc;++i) {
            for(int j = 0;j < d;++j) {
                grad[i] += vec[j] * 2 * base[i][j];
            }
            grad[i] -= base[i][d];
        }
        db sg = 0;
        for(int j = 0;j < bc;++j) {
            sg += grad[j] * grad[j];
        }
        sg = sqrt(sg);
        for(int j = 0;j < bc;++j) {
            init[j] -= grad[j] / sg * rate;
        }
        rate *= 0.99;
    }
    sol l = init, r = init;
    for(;eval(r) < 0;) {
        for(int j = 0;j < bc;++j) {
            r[j] += l[j] + 1;
        }
    }
    for(int i = 0;i < 500;++i) {
        sol mid = l;
        for(int j = 0;j < bc;++j) {
            mid[j] = (mid[j] + r[j]) / 2;
        }
        if(eval(mid) >= 0) {
            r = mid;
        } else {
            l = mid;
        }
    }
    vd vec = z;
    for(int i = 0;i < bc;++i) {
        for(int j = 0;j <= d;++j) {
            vec[j] += base[i][j] * l[i];
        }
    }
    // std::cerr << eval(l) << '\n';
    for(int i = 0;i < d;++i) {
        printf("%.10lf%c", vec[i], " \n"[i == d - 1]);
    }

    // for(int i = 0;i < n;++i) {
    //     db sum = 0;
    //     for(int k = 0;k <= d;++k) {
    //         sum += vec[k] * a[i][k];
    //     }
    //     printf("%.10lf\n", sum - a[i][d + 1]);
    // }
     for(int i = 0;i < n;++i) {
         db ans = 0;
         for(int k = 0;k < d;++k) {
             ans += (vec[k] - x[i][k]) * (vec[k] - x[i][k]);
         }
      
     //    printf("%.10lf\n", std::sqrt(ans) - ::r[i]);
     }
    
}

int main() {
    #ifdef zqj
    freopen("1.in", "r", stdin);
    #endif
    ios :: sync_with_stdio(0), cin.tie(0);
    cin >> d >> n; 
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < d; j++) cin >> x[i][j]; 
        cin >> r[i];
        for(int j = 0; j < d; j++) a[i][j] = - 2 * x[i][j];
        a[i][d] = 1; 
        a[i][d + 1] = r[i] * r[i];
        for(int j = 0; j < d; j++) 
            a[i][d + 1] -= x[i][j] * x[i][j];
    }
    // for(int z = 0; z < n; z++) {
    //     for(int t = 0; t <= d + 1; t++) {
    //         cout << a[z][t] << ' ';
    //     }
    // cout << endl;
    // }
    vector<int> free;
    using pr = std::pair<int, int>;
    vector<pr> other;
    for(int i = 0, r = 0; i <= d; i++) {
        double mx = 0; 
        int k = r; 
        for(int j = r; j < n; j++) {
            if(abs(a[j][i]) > mx) {
                mx = abs(a[j][i]), k = j; 
            }
        }
        if(mx < 1e-5) {
            free.push_back(i);
            continue;
        }
        other.emplace_back(r, i);
        swap(a[r], a[k]);
        for(int j = 0; j < n; j++) if(j != r) {
            double c = a[j][i] / a[r][i];
            for(int k = i; k <= d + 1; k++)
                a[j][k] -= a[r][k] * c; 
        }
        r += 1;
    }
    for(int i : free) {
        base[bc][i] = 1;
        for(auto [pj, j] : other) {
            base[bc][j] = -a[pj][i] / a[pj][j];
        }
        ++bc;

    }
    for(auto [pi, i] : other) {
        X[i] = a[pi][d + 1] / a[pi][i];
    }
    getans();
    return 0; 
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 80ms
memory: 9968kb

input:

500 500
60.00268893933372283 70.35885554610950976 -8.98574176457012186 46.16014112676185732 66.31422279348288384 29.03050764912902082 -35.06996828144599476 -59.10319321730690234 67.85808505028276727 20.30232033048615392 62.38784996896146140 59.92659390534240060 -36.26787439344059294 30.8251981981496...

output:

19.2131420239 6.6116010384 21.4200482705 56.9386478055 -89.7160474683 92.9322890063 70.9576916013 11.4955427802 -48.3685940500 38.6938107212 50.0774292067 7.6286116238 2.2148056501 -37.3139908424 -95.5061214107 -67.7834766726 -6.4342257994 45.2469434077 -27.5157456104 19.9638642430 30.1755275221 12....

result:

ok accepted

Test #2:

score: 0
Accepted
time: 77ms
memory: 9796kb

input:

500 500
-20.46791708061053328 -78.90373004342441732 -47.09421721341704625 49.96697218958462372 48.99528416466444014 -46.87780686216100889 73.68284736943891744 -53.69249802982882613 -92.37158007019175443 -97.95346943385396798 -47.79109018973426259 82.31965483504592385 -72.09718577745493917 -32.376534...

output:

-1.5215345076 4.5693935729 -55.1537400055 -30.8206123075 -4.5300711174 -40.7480490928 -98.0817466389 -70.6794335668 33.7580005787 40.8307871988 -79.9701023663 28.7611061458 74.1169381769 99.2006609739 63.1466615969 13.4872386250 87.8152808995 -79.2485168707 -94.8371768875 -18.8682559047 -7.222065851...

result:

ok accepted

Test #3:

score: 0
Accepted
time: 81ms
memory: 9828kb

input:

500 500
91.75754360584323877 -74.07465057030329092 -30.06919963013949371 -22.45376960826932589 -94.33818252302211249 95.43185666705545600 -35.93139380204742395 -46.28091101025437837 20.25588702053946122 -31.98355965847254367 96.27926708531694544 17.21195108047088240 -16.00480323252260462 -14.1553994...

output:

26.9679740848 -85.5196887592 33.0051525081 56.4491767908 96.2024192054 2.1449649798 46.1593010770 -10.5524772890 95.1878089215 89.0367034668 53.3099139964 47.8109364807 -44.1149361509 -38.6811778858 20.3000464890 -79.5595673824 -83.2187281279 81.0406419621 63.6096929398 -32.5949599087 -3.1428774192 ...

result:

ok accepted

Test #4:

score: 0
Accepted
time: 71ms
memory: 9816kb

input:

500 500
53.59239375857157484 1.29576452891167548 -55.60357761919549802 2.89491049833583247 -72.25117082444128869 -44.92736039007480997 6.81675337705620166 -46.20517542139523925 20.56179110027964896 99.93596620202598046 -30.87710828002636276 60.42621397022924157 79.91458345844398536 94.56182305252031...

output:

25.3319261915 6.0513200265 41.1514606864 -77.2156885794 76.9918318457 80.5690490053 93.0687005370 -33.3878339850 -33.1932708074 -89.2763178528 60.9935608857 21.8236314581 -91.8804470137 76.3755847553 26.4845929193 -41.6773655750 16.2208646187 81.9466267859 29.0695144402 -11.9289031393 65.5465321976 ...

result:

ok accepted

Test #5:

score: 0
Accepted
time: 74ms
memory: 9976kb

input:

500 500
-63.61543927507285190 43.87221058298641196 8.16924114047013461 -34.92232278546450175 91.80142804719758942 -76.82013016900501157 25.06001121373941487 48.24958448628115093 65.82846176112221315 33.19899446519090702 84.05389321600614494 -78.49637158041961982 87.99406312213668002 -60.859516869891...

output:

-0.5237395012 -10.7302221003 -99.8459370546 87.1413921023 4.2783215430 -50.7949355799 -67.3821708508 41.5351118975 67.6586753784 -95.2972443631 62.3913506553 -56.5351652871 -93.7357214687 -0.0784934799 63.4548000759 95.5924900612 93.8974991075 90.0565113185 -1.6842116212 10.6504788217 79.4691340903 ...

result:

ok accepted

Test #6:

score: -100
Time Limit Exceeded

input:

24 114
19.60728784212125220 62.05571106800468328 -77.66722345143722350 83.32150488873739391 85.61849285200199233 -61.26186974500755866 54.01645372221616981 -19.69713224000579999 -10.16958551834513003 -18.69109461054532062 9.59051520125903778 91.21514401069063638 89.60632230190051928 -51.201061482129...

output:


result: