167982025-05-13 13:01:27BucsMateKülönböző katicákcpp17Elfogadva 100/10093ms15032 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[node].first, intervals[parent].first-1);
    intervals[node].second = min(intervals[node].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 == 0 && 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms320 KiB
2Elfogadva1ms508 KiB
3Elfogadva74ms5684 KiB
subtask210/10
4Elfogadva64ms5044 KiB
5Elfogadva70ms5916 KiB
6Elfogadva78ms6080 KiB
7Elfogadva86ms6708 KiB
subtask315/15
8Elfogadva71ms14388 KiB
9Elfogadva72ms14264 KiB
10Elfogadva93ms15032 KiB
11Elfogadva85ms14900 KiB
12Elfogadva82ms14528 KiB
13Elfogadva85ms14928 KiB
14Elfogadva82ms14388 KiB
subtask435/35
15Elfogadva2ms316 KiB
16Elfogadva1ms508 KiB
17Elfogadva2ms316 KiB
18Elfogadva2ms508 KiB
19Elfogadva2ms316 KiB
20Elfogadva2ms316 KiB
21Elfogadva2ms316 KiB
22Elfogadva1ms316 KiB
subtask540/40
23Elfogadva75ms6104 KiB
24Elfogadva65ms6056 KiB
25Elfogadva68ms6148 KiB
26Elfogadva78ms6112 KiB
27Elfogadva78ms6016 KiB
28Elfogadva82ms6452 KiB
29Elfogadva83ms6548 KiB
30Elfogadva78ms6192 KiB
31Elfogadva78ms6196 KiB
32Elfogadva81ms6196 KiB
33Elfogadva85ms6640 KiB