답안 #789696

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
789696 2023-07-21T19:09:48 Z benjaminkleyn 늑대인간 (IOI18_werewolf) C++17
15 / 100
4000 ms 91160 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 = 2000;
struct Query
{
    int l1, r1, l2, r2, t;
};
bool operator<(const Query &A, const Query &B)
{
    if (A.l1 / BS < B.l1 / BS) return true;
  	if (A.l1 / BS > B.l1 / BS) return false;
  	if ((A.l1 / BS) % 2) return A.r1 < B.r1;
  	return A.r1 > B.r1;
}

int t[800000] = {0};
void update(int v, int tl, int tr, int idx, int val)
{
    if (tl == tr)
    {
        t[v] += val;
        return;
    }
    int tm = (tl + tr) / 2;
    if (idx <= tm)
        update(2 * v, tl, tm, idx, val);
    else
        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;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14420 KB Output is correct
2 Correct 8 ms 14420 KB Output is correct
3 Correct 7 ms 14396 KB Output is correct
4 Correct 6 ms 14452 KB Output is correct
5 Correct 6 ms 14420 KB Output is correct
6 Correct 6 ms 14420 KB Output is correct
7 Correct 6 ms 14480 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 8 ms 14500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14420 KB Output is correct
2 Correct 8 ms 14420 KB Output is correct
3 Correct 7 ms 14396 KB Output is correct
4 Correct 6 ms 14452 KB Output is correct
5 Correct 6 ms 14420 KB Output is correct
6 Correct 6 ms 14420 KB Output is correct
7 Correct 6 ms 14480 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 8 ms 14500 KB Output is correct
10 Correct 106 ms 15508 KB Output is correct
11 Correct 88 ms 15444 KB Output is correct
12 Correct 19 ms 15476 KB Output is correct
13 Correct 152 ms 15628 KB Output is correct
14 Correct 154 ms 15612 KB Output is correct
15 Correct 23 ms 15572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1180 ms 82352 KB Output is correct
2 Correct 812 ms 85808 KB Output is correct
3 Correct 1056 ms 83484 KB Output is correct
4 Correct 1369 ms 82464 KB Output is correct
5 Correct 1545 ms 82504 KB Output is correct
6 Correct 2037 ms 82404 KB Output is correct
7 Correct 1755 ms 82252 KB Output is correct
8 Correct 614 ms 85836 KB Output is correct
9 Correct 562 ms 83440 KB Output is correct
10 Correct 2241 ms 82576 KB Output is correct
11 Correct 955 ms 82516 KB Output is correct
12 Correct 1558 ms 82480 KB Output is correct
13 Execution timed out 4070 ms 91160 KB Time limit exceeded
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14420 KB Output is correct
2 Correct 8 ms 14420 KB Output is correct
3 Correct 7 ms 14396 KB Output is correct
4 Correct 6 ms 14452 KB Output is correct
5 Correct 6 ms 14420 KB Output is correct
6 Correct 6 ms 14420 KB Output is correct
7 Correct 6 ms 14480 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 8 ms 14500 KB Output is correct
10 Correct 106 ms 15508 KB Output is correct
11 Correct 88 ms 15444 KB Output is correct
12 Correct 19 ms 15476 KB Output is correct
13 Correct 152 ms 15628 KB Output is correct
14 Correct 154 ms 15612 KB Output is correct
15 Correct 23 ms 15572 KB Output is correct
16 Correct 1180 ms 82352 KB Output is correct
17 Correct 812 ms 85808 KB Output is correct
18 Correct 1056 ms 83484 KB Output is correct
19 Correct 1369 ms 82464 KB Output is correct
20 Correct 1545 ms 82504 KB Output is correct
21 Correct 2037 ms 82404 KB Output is correct
22 Correct 1755 ms 82252 KB Output is correct
23 Correct 614 ms 85836 KB Output is correct
24 Correct 562 ms 83440 KB Output is correct
25 Correct 2241 ms 82576 KB Output is correct
26 Correct 955 ms 82516 KB Output is correct
27 Correct 1558 ms 82480 KB Output is correct
28 Execution timed out 4070 ms 91160 KB Time limit exceeded
29 Halted 0 ms 0 KB -