Submission #789689

# Submission time Handle Problem Language Result Execution time Memory
789689 2023-07-21T19:02:30 Z benjaminkleyn Werewolf (IOI18_werewolf) C++17
15 / 100
4000 ms 86604 KB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<int> g[200000];

int e[200000];
int par1[200000][20], par2[200000][20];
int find(int u)
{
    return e[u] == u ? u : e[u] = find(e[u]);
}

bool vis1[200000] = {false}, vis2[200000] = {false};
int euler1[200000], euler2[200000];
int in1[200000], out1[200000], t1 = 0;
int in2[200000], out2[200000], t2 = 0;
vector<int> c1[200000], c2[200000];
void dfs1(int u)
{
    vis1[u] = true;
    in1[u] = t1++;
    for (int v : c1[u])
        if (!vis1[v])
            dfs1(v);
    out1[u] = t1;
}
void dfs2(int u)
{
    vis2[u] = true;
    in2[u] = t2++;
    for (int v : c2[u])
        if (!vis2[v])
            dfs2(v);
    out2[u] = t2;
}

const int BS = 10000;
struct Query
{
    int l1, r1, l2, r2, t;
};
bool operator<(const Query &A, const Query &B)
{
    return A.l1 / BS < B.l1 / BS || (A.l1 / BS == B.l1 / BS && A.r1 < B.r1);
}

int t[800000] = {0};
void update(int v, int tl, int tr, int idx, int val)
{
    if (idx < tl || tr < idx)
        return;
    if (tl == tr)
    {
        t[v] += val;
        return;
    }
    int tm = (tl + tr) / 2;
    update(2 * v, tl, tm, idx, val);
    update(2 * v + 1, tm + 1, tr, idx, val);
    t[v] = (t[2 * v] > 0) || (t[2 * v + 1] > 0);
}
int query(int v, int tl, int tr, int l, int r)
{
    if (r < tl || tr < l)
        return 0;
    if (l <= tl && tr <= r)
        return t[v];
    int tm = (tl + tr) / 2;
    return (query(2 * v, tl, tm, l, r) > 0) || (query(2 * v + 1, tm + 1, tr, l, r) > 0);
}

vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R)
{
    int Q = S.size(), M = X.size();
    vector<int> A(Q, 0);

    for (int i = 0; i < N; i++)
        par1[i][0] = par2[i][0] = i;

    for (int i = 0; i < M; i++)
    {
        g[X[i]].push_back(Y[i]);
        g[Y[i]].push_back(X[i]);
    }

    for (int i = 0; i < N; i++)
        e[i] = i;

    for (int u = 0; u < N; u++)
        for (int v : g[u])
            if (v < u)
            {
                v = find(v);
                e[v] = u;
                par1[v][0] = u;
            }

    for (int i = 0; i < N; i++)
        e[i] = i;

    for (int u = N - 1; u >= 0; u--)
        for (int v : g[u])
            if (v > u)
            {
                v = find(v);
                e[v] = u;
                par2[v][0] = u;
            }

    for (int k = 1; k < 20; k++)
        for (int u = 0; u < N; u++)
        {
            par1[u][k] = par1[par1[u][k-1]][k-1];
            par2[u][k] = par2[par2[u][k-1]][k-1];
        }

    for (int i = 0; i < N; i++)
    {
        c1[par1[i][0]].push_back(i);
        c2[par2[i][0]].push_back(i);
    }

    for (int i = N - 1; i >= 0; i--)
        if (!vis1[i])
            dfs1(i);

    for (int i = 0; i < N; i++)
        if (!vis2[i])
            dfs2(i);

    /*
    for (int i = 0; i < N; i++)
        cout << par1[i][0] << ' ';
    cout << '\n';

    for (int i = 0; i < N; i++)
        cout << par2[i][0] << ' ';
    cout << '\n';

    for (int i = 0; i < N; i++)
        cout << in1[i] << ' ';
    cout << '\n';

    for (int i = 0; i < N; i++)
        cout << in2[i] << ' ';
    cout << '\n';
    */

    vector<Query> queries(Q);
    for (int i = 0; i < Q; i++)
    {
        for (int k = 19; k >= 0; k--)
        {
            if (par1[E[i]][k] <= R[i])
                E[i] = par1[E[i]][k];
            if (par2[S[i]][k] >= L[i])
                S[i] = par2[S[i]][k];
        }
        queries[i] = {in1[E[i]], out1[E[i]]-1, in2[S[i]], out2[S[i]]-1, i};
    }

    for (int i = 0; i < N; i++)
    {
        euler1[in1[i]] = i;
        euler2[in2[i]] = i;
    }

    sort(queries.begin(), queries.end());
    int l = 0, r = -1;
    for (auto [l1, r1, l2, r2, t] : queries)
    {
        while (r < r1)
            update(1, 0, N - 1, in2[euler1[++r]], 1);
        while (l > l1)
            update(1, 0, N - 1, in2[euler1[--l]], 1);
        while (r > r1)
            update(1, 0, N - 1, in2[euler1[r--]], -1);
        while (l < l1)
            update(1, 0, N - 1, in2[euler1[l++]], -1);
        A[t] = query(1, 0, N - 1, l2, r2);
    }

    return A;
}

# Verdict Execution time Memory Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 8 ms 14420 KB Output is correct
3 Correct 6 ms 14460 KB Output is correct
4 Correct 8 ms 14420 KB Output is correct
5 Correct 7 ms 14448 KB Output is correct
6 Correct 7 ms 14420 KB Output is correct
7 Correct 8 ms 14420 KB Output is correct
8 Correct 9 ms 14408 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 8 ms 14420 KB Output is correct
3 Correct 6 ms 14460 KB Output is correct
4 Correct 8 ms 14420 KB Output is correct
5 Correct 7 ms 14448 KB Output is correct
6 Correct 7 ms 14420 KB Output is correct
7 Correct 8 ms 14420 KB Output is correct
8 Correct 9 ms 14408 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 142 ms 15504 KB Output is correct
11 Correct 151 ms 15476 KB Output is correct
12 Correct 25 ms 15468 KB Output is correct
13 Correct 229 ms 15620 KB Output is correct
14 Correct 227 ms 15628 KB Output is correct
15 Correct 26 ms 15584 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2087 ms 82356 KB Output is correct
2 Correct 787 ms 85824 KB Output is correct
3 Correct 903 ms 83516 KB Output is correct
4 Correct 1504 ms 82576 KB Output is correct
5 Correct 1746 ms 82508 KB Output is correct
6 Correct 2907 ms 82400 KB Output is correct
7 Correct 2341 ms 83120 KB Output is correct
8 Correct 649 ms 86604 KB Output is correct
9 Correct 617 ms 84268 KB Output is correct
10 Execution timed out 4049 ms 83276 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 8 ms 14420 KB Output is correct
3 Correct 6 ms 14460 KB Output is correct
4 Correct 8 ms 14420 KB Output is correct
5 Correct 7 ms 14448 KB Output is correct
6 Correct 7 ms 14420 KB Output is correct
7 Correct 8 ms 14420 KB Output is correct
8 Correct 9 ms 14408 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 142 ms 15504 KB Output is correct
11 Correct 151 ms 15476 KB Output is correct
12 Correct 25 ms 15468 KB Output is correct
13 Correct 229 ms 15620 KB Output is correct
14 Correct 227 ms 15628 KB Output is correct
15 Correct 26 ms 15584 KB Output is correct
16 Correct 2087 ms 82356 KB Output is correct
17 Correct 787 ms 85824 KB Output is correct
18 Correct 903 ms 83516 KB Output is correct
19 Correct 1504 ms 82576 KB Output is correct
20 Correct 1746 ms 82508 KB Output is correct
21 Correct 2907 ms 82400 KB Output is correct
22 Correct 2341 ms 83120 KB Output is correct
23 Correct 649 ms 86604 KB Output is correct
24 Correct 617 ms 84268 KB Output is correct
25 Execution timed out 4049 ms 83276 KB Time limit exceeded
26 Halted 0 ms 0 KB -