| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 765562 | DmitryKh | Deblo (COCI18_deblo) | C++14 | 402 ms | 65536 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <list>
#include <map>
using namespace std;
using ll = long long;
ll DFS(int v,
       const vector<vector<int>>& E,
       const vector<ll>& A,
       vector<bool>& VIS,
       ll maxBitMask,
       vector<ll>& R) {
    ll rr = 0;
    VIS[v] = true;
    map<int, vector<ll>> RN;
    for (int i = 0; i < E[v].size(); i++) {
        int u = E[v][i] ;
        if (!VIS[u]) {
            RN[i].resize(16*sizeof(ll));
            rr += DFS(u, E, A, VIS, maxBitMask, RN[i]);
        }
    }
    //cout << "v[" << v << "]:\n";
    for (int i = 0; i < 8*sizeof(ll) - 1; i++) {
        bool bit_on = (A[v]>>i) & ll(0x1);
        for (int j = 0; j < RN.size(); j++) {
            if (!RN[j].empty()) {
                if (bit_on) {
                    R[2*i + 1] += RN[j][2*i];
                    R[2*i] += RN[j][2*i + 1];
                } else {
                    R[2*i + 1] += RN[j][2*i + 1];
                    R[2*i] += RN[j][2*i];
                }
            }
        }
        ll r0 = R[2*i];
        ll r1 = R[2*i + 1];
        if (bit_on) {
            R[2*i + 1]++;
        } else {
            if (i <= maxBitMask) {
                R[2*i]++;
            }
        }
        ll arc1 = 0;
        for (int j = 0; j < RN.size(); j++) {
            if (!RN[j].empty()) {
                if (bit_on) {
                    if (RN[j][2*i + 1] && RN[j][2*i + 1]*(r0 - RN[j][2*i + 1]) > 0) {
                        arc1 += RN[j][2*i + 1]*(r0 - RN[j][2*i + 1]);
                    }
                    if (RN[j][2*i] && RN[j][2*i]*(r1 - RN[j][2*i]) > 0) {
                        arc1 += RN[j][2*i]*(r1 - RN[j][2*i]);
                    }
                } else {
                    if (RN[j][2*i] && RN[j][2*i]*(r1 - RN[j][2*i + 1]) > 0) {
                        arc1 += RN[j][2*i]*(r1 - RN[j][2*i + 1]);
                    }
                    if (RN[j][2*i + 1] && RN[j][2*i + 1]*(r0 - RN[j][2*i]) > 0) {
                        arc1 += RN[j][2*i + 1]*(r0 - RN[j][2*i]);
                    }
                }
            }
        }
        rr += R[2*i + 1]*(ll(1)<<i) + (arc1/2)*(ll(1)<<i);
        /*if (arc1)
            cout << "\tarc" << i << "=" << ((arc1/2)*(ll(1)<<i)) << '\n';
        if (R[2*i])
            cout << "\t" << i << "(0)=" << R[2*i] << '\n';
        if (R[2*i + 1])
            cout << "\t" << i << "(1)=" << R[2*i + 1] << '\n';*/
    }
    
    //cout << "v[" << v << "] = " << rr << '\n';
    return rr;
}
int main(int argc, char* argv[]) {
    int n;
    cin >> n;
    vector<ll> A(n + 1);
    ll maxBitMask = 0;
    for (int i = 1; i <= n; i++) {
        cin >> A[i];
        for (int j = 0; j < 8*sizeof(ll) - 1; j++) {
            if (((A[i]>>j) & ll(0x1)) && j > maxBitMask) {
                maxBitMask = j;
            }
        }
    }
    vector<vector<int>> E(n + 1);
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        E[u].push_back(v);
        E[v].push_back(u);
    }
    {
        //cout << '\n';
        vector<ll> R(16*sizeof(ll));
        {
            vector<bool> VIS(n + 1);
            cout << DFS(1, E, A, VIS, maxBitMask, R) << '\n';
        }
    }
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
