Submission #95260

#TimeUsernameProblemLanguageResultExecution timeMemory
95260andy627Simurgh (IOI17_simurgh)C++17
51 / 100
180 ms5340 KiB
#include "simurgh.h"
#include <bits/stdc++.h>

using namespace std;

int G[505][505];
int T[505][505];
int N;
bool vst[505];
int E[505][505];
vector<int> Q;
int P[505];
vector<int> ans;
int S[505][505];
int I;
bool C[505];

void maketree(int now) {
    vst[now] = true;
    for(int i = 0; i < N; i++) {
        if(vst[i]) continue;
        if(G[now][i] == -2) continue;
        T[now][i] = T[i][now] = 1;
        Q.push_back(E[now][i]);
        P[i] = now;
        maketree(i);
    }
}
void sib() {
    for(int i = 0; i < N; i++) {
        int now = i;
        while(now != -1) {
            S[now][i] = 1;
            now = P[now];
        }
    }
}
/*
void connect(int now, int par) {
    C[now] = 1;
    for(int i = 0; i < N; i++) {
        if(!T[now][i] || i == par) continue;
        if(G[now][i] == 1) connect(i, now);
    }
}*/

void dfs(int now, int par) {
    for(int i = 0; i < N; i++) {
        if(i == par) continue;
        if(T[now][i]) dfs(i, now);
    }
    if(!now) return;

    int idx;
    for(int i = 0; i < Q.size(); i++) if(Q[i] == E[now][par]) idx = i;

    for(int i = 0; i < N; i++) {
        if(S[now][i] || i == par) continue;
        if(G[now][i] != -1) continue;

        Q[idx] = E[now][i];
        int tmp = count_common_roads(Q);
        if(tmp < I) {
            G[now][par] = G[par][now] = 1;
            G[now][i] = G[i][now] = 0;
        }
        if(tmp > I) {
            G[now][par] = G[par][now] = 0;
            G[now][i] = G[i][now] = 1;
        }
    }
    Q[idx] = E[now][par];

    for(int i = 0; i < N; i++) {
        if(S[now][i] || i == par) continue;
        if(G[now][i] == -1) G[now][i] = G[i][now] = G[now][par];
    }

    if(G[now][par] == -1) {
        //for(int i = 0; i < N; i++) C[i] = 0;
        //connect(now, par);

        int x = -1, y = -1;
        for(int i = 0; i < N; i++) {
            if(!S[now][i] || i == now) continue;
            for(int j = 0; j < N; j++) {
                if(S[now][j] || G[i][j] != 1) continue;
                x = i, y = j;
            }
        }
        //printf("%d %d\n", x,y);
        if(x == -1) G[now][par] = G[par][now] = 1;
        else {
            Q[idx] = E[x][y];
            int tmp = count_common_roads(Q);
            if(tmp < I) G[now][par] = G[par][now] = 1;
            else if(tmp > I) G[now][par] = G[par][now] = 0;
            else G[now][par] = G[par][now] = G[x][y];
            Q[idx] = E[now][par];
        }

        for(int i = 0; i < N; i++) {
            if(S[now][i] || i == par) continue;
            if(G[now][i] == -1) G[now][i] = G[i][now] = G[now][par];
        }
    }
}

std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
    N = n;

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            G[i][j] = -2;
        }
    }
    for(int i = 0; i < u.size(); i++) {
        G[u[i]][v[i]] = G[v[i]][u[i]] = -1;
        E[u[i]][v[i]] = E[v[i]][u[i]] = i;
    }

    P[0] = -1;
    maketree(0);
    sib();
    I = count_common_roads(Q);
    dfs(0, -1);
/*
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N;j++) {
            printf("%d ", G[i][j]);
        }
        puts("");
    }*/

    for(int i = 0; i < N; i++) {
        for(int j = i + 1; j < N; j++) {
            if(G[i][j] == 1) ans.push_back(E[i][j]);
        }
    }
    return ans;
}

Compilation message (stderr)

simurgh.cpp: In function 'void dfs(int, int)':
simurgh.cpp:55:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < Q.size(); i++) if(Q[i] == E[now][par]) idx = i;
                    ~~^~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:117:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < u.size(); i++) {
                    ~~^~~~~~~~~~
simurgh.cpp: In function 'void dfs(int, int)':
simurgh.cpp:54:9: warning: 'idx' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int idx;
         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...