Submission #857984

# Submission time Handle Problem Language Result Execution time Memory
857984 2023-10-07T08:40:42 Z danikoynov Newspapers (CEOI21_newspapers) C++14
8 / 100
281 ms 524288 KB
#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 1010;

int n, m;
void solve_chain()
{
  if (n == 1)
    {
        cout << "YES" << endl;
        cout << 1 << endl;
        cout << 1 << endl;
        return;
    }
    if (n == 2)
    {
        cout << "YES" << endl;
        cout << 2 << endl;
        cout << 1 << " " << 1 << endl;
        return;
    }
    cout << "YES" << endl;
    cout << (n - 2) * 2 << endl;
    for (int i = 2; i < n; i ++)
        cout << i << " ";
    for (int i = n - 1; i > 1; i --)
        cout << i << " ";
    cout << endl;
}

vector < int > adj[maxn];

const int maxmask = (1 << 21);
int dp[maxmask], from[maxmask], last[maxmask];

int transition_mask(int mask, int ver)
{
    int new_mask = 0;
    if ((mask & (1 << (ver - 1))) > 0)
        mask -= (1 << (ver - 1));

    for (int v = 1; v <= n; v ++)
    {
        if ((mask & (1 << (v - 1))) == 0)
            continue;

        for (int u : adj[v])
            new_mask |= (1 << (u - 1));
    }

    return new_mask;
}

int used[maxn];
bool cycle;
void dfs(int v, int p)
{
    used[v] = 1;
    for (int u : adj[v])
    {
        if (used[u] && u != p)
            cycle = true;
        if (!used[u])
            dfs(u, v);
    }
}

int depth[maxn], md[maxn];
void calc(int v, int p)
{
    md[v] = depth[v];
    for (int u : adj[v])
    {
        if (u == p)
            continue;
        depth[u] = depth[v] + 1;
        calc(u, v);
        md[v] = max(md[v], md[u]);
    }
}
void check_bad()
{
    for (int v = 1; v <= n; v ++)
    {
        for (int i = 1; i <= n; i ++)
            depth[i] = md[i] = 0;
        calc(v, - 1);
        int cnt = 0;
        for (int u : adj[v])
        {
            if (md[u] >= 3)
                cnt ++;
        }
        if (cnt > 2)
        {
            cout << "NO" << endl;
            exit(0);
        }
    }
}
void solve()
{
    srand(time(NULL));
    cin >> n >> m;
    if (n == 1)
    {
        cout << "YES" << endl;
        cout << 1 << endl;
        cout << 1 << endl;
        return;
    }
    for (int i = 1; i <= m; i ++)
    {
        int v, u;
        cin >> v >> u;
        //u = i + 1;
        //v = rand() % (i) + 1;
        //cout << v << " " << u << endl;
        adj[v].push_back(u);
        adj[u].push_back(v);
    }

    dfs(1, -1);
    check_bad();
    if (cycle)
    {
        cout << "NO" << endl;
        return;
    }
    if (n > 20)
    {
        solve_chain();
        return;
    }

    int base_mask = (1 << n) - 1;

    for (int mask = 0; mask < (1 << n); mask ++)
        dp[mask] = -1;

    dp[base_mask] = 0;
    queue < int > q;
    q.push(base_mask);
    while(!q.empty())
    {

        int mask = q.front();
        q.pop();

        for (int i = 0; i < n; i ++)
        {
            int next_mask = transition_mask(mask, i + 1);
            if (dp[next_mask] == -1 )
            {
                dp[next_mask] = dp[mask] + 1;
                from[next_mask] = i + 1;
                last[next_mask] = mask;
                q.push(next_mask);
            }
        }
    }

    if (dp[0] == -1)
    {
        cout << "NO" << endl;
        return;
    }

    vector < int > ord;
    int cur = 0;
    while(cur != base_mask)
    {
        ///cout << "step " << cur << " " << from[cur] << endl;
        ord.push_back(from[cur]);
        cur = last[cur];
    }

    reverse(ord.begin(), ord.end());
    cout << "YES" << endl;
    cout << ord.size() << endl;
    for (int cur : ord)
        cout << cur << " ";
    cout << endl;



}
int main()
{
    solve();
    return 0;
}
/**
8 7
1 2
2 3
1 4
4 5
1 6
6 7
6 8

10 9
1 2
1 3
1 4
2 5
2 6
3 7
3 8
4 9
4 10

20
19
1 2
2 3
2 4
1 5
5 6
5 7
6 8
7 9
8 10
5 11
8 12
6 13
12 14
14 15
2 16
12 17
4 18
9 19
2 20

10 9
1 2
2 4
1 5
5 6
5 7
6 8
7 9
8 3
9 10


*/
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4440 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4440 KB Output is correct
7 Runtime error 281 ms 524288 KB Execution killed with signal 9
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4444 KB Output is correct
11 Correct 9 ms 344 KB Output is correct
12 Correct 3 ms 348 KB Output is correct
13 Correct 4 ms 348 KB Output is correct
14 Correct 5 ms 348 KB Output is correct
15 Correct 5 ms 348 KB Output is correct
16 Correct 9 ms 344 KB Output is correct
17 Correct 9 ms 348 KB Output is correct
18 Correct 9 ms 348 KB Output is correct
19 Correct 9 ms 600 KB Output is correct
20 Correct 9 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4440 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4440 KB Output is correct
7 Runtime error 281 ms 524288 KB Execution killed with signal 9
8 Halted 0 ms 0 KB -