답안 #824405

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
824405 2023-08-14T05:33:27 Z 이성호(#10360) 로봇 골프 (ROI19_golf) C++17
0 / 100
3 ms 4948 KB
#include <iostream>
#include <set>
#include <numeric>
#include <vector>
#define int long long
using namespace std;

int get_half(vector<int> vc)
{
    int N = (int)vc.size();
    if (N == 1) return 0;
    set<int> s1;
    for (int j = 0; j < (1 << (N / 2)); j++) {
        int tmp = 0;
        for (int k = 0; k < N / 2; k++) {
            if (j >> k & 1) tmp += vc[k];
        }
        s1.insert(tmp);
    }
    int tot = accumulate(vc.begin(), vc.end(), 0LL);
    int ret = 1e18;
    int rst = N - N / 2;
    for (int j = 0; j < (1 << rst); j++) {
        int tmp = 0;
        for (int k = 0; k < rst; k++) {
            if (j >> k & 1) tmp += vc[k+N/2];
        }
        auto it = s1.lower_bound((tot+1)/2 - tmp);
        if (it != s1.end()) {
            int pv = *it + tmp;
            if (abs(2 * ret - tot) > abs(2 * pv - tot)) {
                ret = pv;
            }
        }
        if (it != s1.begin()) {
            --it;
            int pv = *it + tmp;
            if (abs(2 * ret - tot) > abs(2 * pv - tot)) {
                ret = pv;
            }
        }
    }
    return ret;
}

int sz[200005];
vector<int> g[200005];
int a[200005], p[200005];
int N;

void getSize(int v, int p)
{
    sz[v] = a[v];
    for (int i:g[v]) if (i != p) {
        getSize(i, v);
        sz[v] += sz[i];
    }
}

int getCent(int v, int p, int tot)
{
    for (int i:g[v]) if (i != p) {
        if (sz[i] > tot/2) return getCent(i, v, tot);
    }
    return v;
}

signed main()
{
    freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);
    cin >> N;
    for (int i = 1; i <= N; i++) cin >> a[i];
    for (int i = 2; i <= N; i++) {
        int q; cin >> q;
        g[q].push_back(i); g[i].push_back(q);
    }
    getSize(1, 0);
    int cent = getCent(1, 0, sz[1]);
    vector<int> vc;
    int tot = sz[1];
    getSize(cent, 0);
    for (int i:g[cent]) vc.push_back(sz[i]);
    int x = get_half(vc);
    int ans = x * (sz[cent] - a[cent] - x);
    ans += a[cent] * (sz[cent] - a[cent]);
    for (int i = 1; i <= N; i++) ans += a[i] * (a[i] - 1);
    for (int i = 1; i <= N; i++) {
        if (i != cent) ans += a[i] * (sz[i] - a[i]);
    }
    cout << ans << '\n';
    return 0;
}

Compilation message

golf.cpp: In function 'int main()':
golf.cpp:80:9: warning: unused variable 'tot' [-Wunused-variable]
   80 |     int tot = sz[1];
      |         ^~~
golf.cpp:70:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |     freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
golf.cpp:70:43: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |     freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);
      |                                    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -