답안 #789693

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
789693 2023-07-21T19:05:49 Z benjaminkleyn 늑대인간 (IOI18_werewolf) C++17
15 / 100
4000 ms 85836 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 = 5000;
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 (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;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 7 ms 14420 KB Output is correct
3 Correct 7 ms 14484 KB Output is correct
4 Correct 6 ms 14420 KB Output is correct
5 Correct 6 ms 14456 KB Output is correct
6 Correct 6 ms 14420 KB Output is correct
7 Correct 7 ms 14496 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 7 ms 14420 KB Output is correct
3 Correct 7 ms 14484 KB Output is correct
4 Correct 6 ms 14420 KB Output is correct
5 Correct 6 ms 14456 KB Output is correct
6 Correct 6 ms 14420 KB Output is correct
7 Correct 7 ms 14496 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 130 ms 15492 KB Output is correct
11 Correct 146 ms 15396 KB Output is correct
12 Correct 26 ms 15476 KB Output is correct
13 Correct 235 ms 15636 KB Output is correct
14 Correct 232 ms 15572 KB Output is correct
15 Correct 29 ms 15588 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1791 ms 82468 KB Output is correct
2 Correct 831 ms 85836 KB Output is correct
3 Correct 967 ms 83508 KB Output is correct
4 Correct 1510 ms 82572 KB Output is correct
5 Correct 1800 ms 82508 KB Output is correct
6 Correct 2637 ms 82484 KB Output is correct
7 Correct 2301 ms 82356 KB Output is correct
8 Correct 685 ms 85800 KB Output is correct
9 Correct 598 ms 83508 KB Output is correct
10 Execution timed out 4082 ms 82508 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 14420 KB Output is correct
2 Correct 7 ms 14420 KB Output is correct
3 Correct 7 ms 14484 KB Output is correct
4 Correct 6 ms 14420 KB Output is correct
5 Correct 6 ms 14456 KB Output is correct
6 Correct 6 ms 14420 KB Output is correct
7 Correct 7 ms 14496 KB Output is correct
8 Correct 7 ms 14420 KB Output is correct
9 Correct 7 ms 14420 KB Output is correct
10 Correct 130 ms 15492 KB Output is correct
11 Correct 146 ms 15396 KB Output is correct
12 Correct 26 ms 15476 KB Output is correct
13 Correct 235 ms 15636 KB Output is correct
14 Correct 232 ms 15572 KB Output is correct
15 Correct 29 ms 15588 KB Output is correct
16 Correct 1791 ms 82468 KB Output is correct
17 Correct 831 ms 85836 KB Output is correct
18 Correct 967 ms 83508 KB Output is correct
19 Correct 1510 ms 82572 KB Output is correct
20 Correct 1800 ms 82508 KB Output is correct
21 Correct 2637 ms 82484 KB Output is correct
22 Correct 2301 ms 82356 KB Output is correct
23 Correct 685 ms 85800 KB Output is correct
24 Correct 598 ms 83508 KB Output is correct
25 Execution timed out 4082 ms 82508 KB Time limit exceeded
26 Halted 0 ms 0 KB -