제출 #233278

#제출 시각아이디문제언어결과실행 시간메모리
233278VEGAnnTenis (COI19_tenis)C++14
51 / 100
1079 ms22260 KiB
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
#define PB push_back
using namespace std;
const int N = 100100;
const int md = int(1e9) + 7;
vector<int> g[N], ts, gr[N], co[N];
int loc[3][N], n, q, a[3][N], kol, comp[N], in[N];
int mn[3], men[3], lst[3];
bool mrk[N];

void top_sort(int v){
    if (mrk[v]) return;

    mrk[v] = 1;

    for (int u : g[v])
        top_sort(u);

    ts.PB(v);
}

void dfs(int v){
    if (comp[v] >= 0) return;

    comp[v] = kol;

    for (int u : gr[v])
        dfs(u);
}

void build(){
    for (int i = 0; i < n; i++) {
        g[i].clear();
        gr[i].clear();
        comp[i] = -1;
        in[i] = 0;
    }

    for (int tp = 0; tp < 3; tp++)
    for (int i = 1; i < n; i++) {
        g[a[tp][i - 1]].PB(a[tp][i]);
        gr[a[tp][i]].PB(a[tp][i - 1]);
    }

    fill(mrk, mrk + n, 0);
    ts.clear();

    for (int i = 0; i < n; i++){
        if (mrk[i]) continue;

        top_sort(i);
    }

    reverse(all(ts));

    kol = 0;

    for (int v : ts){
        if (comp[v] >= 0) continue;

        dfs(v);
        kol++;
    }

    for (int tp = 0; tp < 3; tp++)
    for (int i = 1; i < n; i++) {
        int cur = comp[a[tp][i]];

        if (comp[a[tp][i - 1]] == cur) continue;

        if (in[cur] == 0)
            kol--;
        in[cur]++;
    }

    fill(mrk, mrk + n, 0);

    if (kol != 1) return;

    int cur = -1;

    for (int i = 0; ; i++)
        if (in[i] == 0){
            cur = i;
            break;
        }

    assert(cur != -1);

    for (int i = 0; i < n; i++)
        if (comp[i] == cur)
            mrk[i] = 1;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef _LOCAL
    freopen("in.txt","r",stdin);
#endif // _LOCAL

    cin >> n >> q;

    if (q < 11){
        for (int tp = 0; tp < 3; tp++)
        for (int i = 0; i < n; i++){
            int x; cin >> x;
            x--;

            loc[tp][x] = i;
            a[tp][i] = x;
        }

        for (; q; q--){
            int tp; cin >> tp;

            if (tp == 1){
                int x; cin >> x; x--;

                fill(mrk, mrk + n, 0);

                mn[0] = mn[1] = mn[2] = n;

                for (int tp = 0; tp < 3; tp++)
                    lst[tp] = loc[tp][x];

                for (int tp = 0; tp < 3; tp++)
                for (int i = loc[tp][x]; i < n; i++) {
                    mrk[a[tp][i]] = 1;

                    for (int j = 0; j < 3; j++)
                        mn[j] = min(mn[j], loc[j][a[tp][i]]);
                }

                bool was = 1;

                while (was) {
                    was = 0;

                    men[0] = mn[0];
                    men[1] = mn[1];
                    men[2] = mn[2];

                    for (int tp = 0; tp < 3; tp++)
                    for (int i = mn[tp]; i < lst[tp]; i++)
                        if (!mrk[a[tp][i]]){
                            for (int j = 0; j < 3; j++)
                                men[j] = min(men[j], loc[j][a[tp][i]]);
                            was = 1;
                            mrk[a[tp][i]] = 1;
                        }

                    lst[0] = mn[0];
                    lst[1] = mn[1];
                    lst[2] = mn[2];

                    mn[0] = men[0];
                    mn[1] = men[1];
                    mn[2] = men[2];
                }

                bool ok = 1;

                for (int i = 0; i < n && ok; i++)
                    if (!mrk[i])
                        ok = 0;

                cout << (ok ? "DA\n" : "NE\n");
            } else {
                int x, y; cin >> tp >> x >> y;
                tp--; x--; y--;

                swap(loc[tp][x], loc[tp][y]);
                swap(a[tp][loc[tp][x]], a[tp][loc[tp][y]]);
            }
        }

        return 0;
    }

    for (int tp = 0; tp < 3; tp++)
    for (int i = 0; i < n; i++){
        int x; cin >> x;
        x--;

        loc[tp][x] = i;
        a[tp][i] = x;
    }

    build();

    for (; q; q--){
        int tp; cin >> tp;

        if (tp == 1){
            int x; cin >> x; x--;
            cout << (mrk[x] ? "DA\n" : "NE\n");
        } else {
            int x, y; cin >> tp >> x >> y;
            tp--; x--; y--;

            swap(loc[tp][x], loc[tp][y]);
            swap(a[tp][loc[tp][x]], a[tp][loc[tp][y]]);

            build();
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...