167962025-05-13 12:48:45BucsMateKülönböző katicákcpp17Hibás válasz 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz1ms316 KiB
2Elfogadva1ms316 KiB
3Hibás válasz74ms5592 KiB
subtask20/10
4Hibás válasz64ms4916 KiB
5Hibás válasz71ms5428 KiB
6Hibás válasz75ms5940 KiB
7Hibás válasz85ms6452 KiB
subtask30/15
8Elfogadva71ms14592 KiB
9Elfogadva70ms14392 KiB
10Hibás válasz92ms14900 KiB
11Hibás válasz87ms14644 KiB
12Hibás válasz85ms14268 KiB
13Hibás válasz85ms14640 KiB
14Hibás válasz79ms13876 KiB
subtask40/35
15Hibás válasz2ms512 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms508 KiB
18Hibás válasz2ms508 KiB
19Hibás válasz1ms316 KiB
20Hibás válasz2ms332 KiB
21Hibás válasz1ms316 KiB
22Hibás válasz2ms316 KiB
subtask50/40
23Hibás válasz76ms5916 KiB
24Elfogadva65ms5944 KiB
25Elfogadva68ms6260 KiB
26Hibás válasz76ms5940 KiB
27Hibás válasz76ms5932 KiB
28Hibás válasz82ms6196 KiB
29Hibás válasz81ms6256 KiB
30Hibás válasz78ms6092 KiB
31Hibás válasz76ms6056 KiB
32Hibás válasz79ms6084 KiB
33Hibás válasz86ms6452 KiB