167962025-05-13 12:48:45BucsMateKülönböző katicákcpp17Wrong answer 0/10092ms14900 KiB
#include <iostream>
#include <vector>

using namespace std;

const int INF = 1000*1000*1000;

vector<vector<int>> adj;
vector<pair<int, int>> intervals;
vector<int> parity, depth;

void DFS1(int node, int parent)
{
    for(int i = 0; i < adj[node].size(); i++){
        int newNode = adj[node][i];
        depth[newNode] = depth[node] + 1;

        DFS1(newNode, node);

        intervals[node].first = max(intervals[node].first, intervals[newNode].first-1);
        intervals[node].second = min(intervals[node].second, intervals[newNode].second+1);
        if(intervals[node].first > intervals[node].second || (parity[node] != -1 && parity[node] == parity[newNode])){
            cout << "NEM";
            exit(0);
        }
        if(parity[newNode] != -1){
            parity[node] = 1 - parity[newNode];
        }
    }
}

void DFS2(int node, int parent)
{
    intervals[node].first = max(intervals[parent].first, intervals[parent].first-1);
    intervals[node].second = min(intervals[parent].second, intervals[parent].second+1);
    if(intervals[node].first > intervals[node].second || (parity[node] != -1 && parity[node] == parity[parent])){
        cout << "NEM";
        exit(0);
    }
    if(parity[parent] != -1){
        parity[node] = 1 - parity[parent];
    }
    for(int i = 0; i < adj[node].size(); i++){
        int newNode = adj[node][i];
        DFS2(newNode, node);
    }
}

int main()
{
    int N;
    cin >> N;
    adj.resize(N+1);
    for(int i = 1; i <= N; i++){
        int p;
        cin >> p;
        adj[p].push_back(i);
    }
    intervals.assign(N+1, {0, INF});
    parity.assign(N+1, -1);
    for(int i = 1; i <= N; i++){
        int val;
        cin >> val;
        if(val != -1){
            intervals[i] = {val, val};
            parity[i] = val%2;
        }
    }

    depth.assign(N+1, -1);
    depth[1] = 1;

    DFS1(1, 0);
    DFS2(1, 0);
    cout << "IGEN\n";
    if(intervals[1].first == 1 && intervals[1].second == INF){
        for(int i = 1; i <= N; i++){
            cout << depth[i] << " ";
        }
    }
    else{
        for(int i = 1; i <= N; i++){
            if(intervals[i].first == 0 && parity[i] == 1){
                cout << 1 << " ";
            }
            else{
                cout << intervals[i].first << " ";
            }
        }
    }
    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Wrong answer1ms316 KiB
2Accepted1ms316 KiB
3Wrong answer74ms5592 KiB
subtask20/10
4Wrong answer64ms4916 KiB
5Wrong answer71ms5428 KiB
6Wrong answer75ms5940 KiB
7Wrong answer85ms6452 KiB
subtask30/15
8Accepted71ms14592 KiB
9Accepted70ms14392 KiB
10Wrong answer92ms14900 KiB
11Wrong answer87ms14644 KiB
12Wrong answer85ms14268 KiB
13Wrong answer85ms14640 KiB
14Wrong answer79ms13876 KiB
subtask40/35
15Wrong answer2ms512 KiB
16Accepted1ms316 KiB
17Accepted1ms508 KiB
18Wrong answer2ms508 KiB
19Wrong answer1ms316 KiB
20Wrong answer2ms332 KiB
21Wrong answer1ms316 KiB
22Wrong answer2ms316 KiB
subtask50/40
23Wrong answer76ms5916 KiB
24Accepted65ms5944 KiB
25Accepted68ms6260 KiB
26Wrong answer76ms5940 KiB
27Wrong answer76ms5932 KiB
28Wrong answer82ms6196 KiB
29Wrong answer81ms6256 KiB
30Wrong answer78ms6092 KiB
31Wrong answer76ms6056 KiB
32Wrong answer79ms6084 KiB
33Wrong answer86ms6452 KiB