Submission

Status:
----------

Score: 0

User: Jokul

Problemset: สมดุลย์

Language: c

Time: 0.002 second

Submitted On: 2025-03-19 18:22:52

#include <stdio.h>

#define MAX_N 1000
#define MAX_WEIGHT 200

typedef struct {
    int A, L, B, R; // A, L for left side; B, R for right side
} Stick;

Stick sticks[MAX_N];
double weights[MAX_N];
double added_weights[MAX_N];

double calculate_weights(int idx) {
    double left_weight = 0;
    double right_weight = 0;

    // Left side
    if (sticks[idx].A == 1) { // Left side is a weight
        left_weight += sticks[idx].L;
    } else { // Left side is another stick
        left_weight += calculate_weights(sticks[idx].L - 1);
    }

    // Right side
    if (sticks[idx].B == 1) { // Right side is a weight
        right_weight += sticks[idx].R;
    } else { // Right side is another stick
        right_weight += calculate_weights(sticks[idx].R - 1);
    }

    // Store the total weight for the current stick
    weights[idx] = left_weight + right_weight;
    return weights[idx];
}

double balance_mob(int N) {
    double total_added_weight = 0;

    // Calculate weights for each stick
    calculate_weights(0);

    for (int i = 0; i < N; i++) {
        double left_weight = 0;
        double right_weight = 0;

        if (sticks[i].A == 1) {
            left_weight += sticks[i].L;
        } else {
            left_weight += weights[sticks[i].L - 1];
        }

        if (sticks[i].B == 1) {
            right_weight += sticks[i].R;
        } else {
            right_weight += weights[sticks[i].R - 1];
        }

        if (left_weight > right_weight) {
            added_weights[i] = left_weight - right_weight;
        } else {
            added_weights[i] = right_weight - left_weight;
        }

        total_added_weight += added_weights[i];
    }

    return total_added_weight;
}

int main() {
    int N;
    scanf("%d", &N);

    for (int i = 0; i < N; i++) {
        scanf("%d %d %d %d", &sticks[i].A, &sticks[i].L, &sticks[i].B, &sticks[i].R);
    }

    double result = balance_mob(N);
    printf("%.1f\n", result);

    return 0;
}