제출 #163430

#제출 시각아이디문제언어결과실행 시간메모리
163430davitmarg게임 (IOI14_game)C++17
15 / 100
5 ms504 KiB
/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <bitset>
#include <stack>
#include <cassert>
#include <iterator>
#include <fstream>
#define mod 1000000007ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(), v.end()
using namespace std;

#ifndef death
#include "game.h"
#endif

const int N = 5003;

int n, msk, sk, dp[(1 << 6) + 10][(1 << 6) + 10], used[(1 << 6) + 10][(1 << 6) + 10], ind[7][7], k;
vector<pair<int, int>> p;

bool connected(int mask)
{
    vector<vector<int>> g(n + 5);
    vector<int> u(n + 5);
    for (int i = 0; i < k; i++)
        if ((1 << i) & mask)
        {
            int a = p[i].first;
            int b = p[i].second;
            g[a].PB(b);
            g[b].PB(a);
        }
    queue<int> q;
    q.push(0);
    u[0] = 1;
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        for (int i = 0; i < g[v].size(); i++)
        {
            int to = g[v][i];
            if (u[to])
                continue;
            u[to] = 1;
            q.push(to);
        }
    }
    for (int i = 0; i < n; i++)
        if (u[i] == 0)
            return 0;
    return 1;
}

bool norm(int mask, int s)
{
    return (!connected(s) && connected(s | (((1 << k) - 1) ^ mask)));
}

void dfs(int mask, int s)
{
    if (used[mask][s])
        return;
    used[mask][s] = 1;
    if (norm(mask, s) == 0)
        return;
    dp[mask][s] = 1;
    for (int i = 0; i < k; i++)
    {
        if ((1 << i) & mask)
            continue;
        int newmask = mask | (1 << i);
        dfs(newmask, s);
        dfs(newmask, s | (1 << i));
        if (dp[newmask][s] == 0 && dp[newmask][s | (1 << i)] == 0)
        {
            dp[mask][s] = 0;
            break;
        }
    }
}

void initialize(int x)
{
    n = x;
    k = n * (n - 1) / 2;
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
        {
            ind[i][j] = ind[j][i] = p.size();
            p.PB(MP(i, j));
        }
    for (int mask = 0; mask < (1 << k); mask++)
    {
        dp[(1 << k) - 1][mask] = 1;
        used[(1 << k) - 1][mask] = 1;
    }
    dfs(0, 0);
}

int hasEdge(int u, int v)
{
    int x = ind[u][v];
    msk |= (1 << x);
    if (dp[msk][sk] == 1)
        return 0;
    sk |= (1 << x);
    return 1;
}

#ifdef death

int main()
{
    int N;
    cin >> N;
    initialize(N);
    N = N * (N - 1) / 2;
    while (N--)
    {
        int a, b;
        cin >> a >> b;
        cout << hasEdge(a, b) << endl;
    }
    return 0;
}

#endif

/*


*/

컴파일 시 표준 에러 (stderr) 메시지

game.cpp: In function 'bool connected(int)':
game.cpp:53:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < g[v].size(); i++)
                         ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...