QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#376730#2173. What's Our Vector, Victor?ucup-team1209WA 84ms9940kbC++204.5kb2024-04-04 15:54:222024-04-04 15:54:22

Judging History

This is the latest submission verdict.

  • [2024-04-04 15:54:22]
  • Judged
  • Verdict: WA
  • Time: 84ms
  • Memory: 9940kb
  • [2024-04-04 15:54:22]
  • 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 = 1;
    for(int i = 0;i < bc;++i) {
        db sum = 0;
        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;
        }
    }
    for(int i = 0;i < 10000;++i) {
        //std::cerr << eval(init) << '\n';
        if(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.997;
    }
    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 < 200;++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; 
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 84ms
memory: 9940kb

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:

63541.1398121036 -15.7615961962 -55162.1341175280 -163362.9882686100 44608.9605903998 1356.0767813533 129200.6859137677 53059.2704582530 -20700.4391456966 22116.9329802562 -33887.5505961732 -34625.6367664165 -110031.5144349713 61694.4404735544 -20575.0333210795 -17715.6919564238 -3172.1470532763 -46...

result:

wrong answer distance to vector 1 should be 1769.53592263014638775 but is 993149.56258294335566461, error 560.24860189714456737