9680 2024. 02. 24 17:35:52 szil Kutyavetélkedő 2 cpp17 Elfogadva 100/100 504ms 113940 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define MAX(a, b) a = max(a, b)

const int MAXN = 250001;
const int MAXK = 250001;

int n, k, m;
vector<int> g[MAXK], gr[MAXK], gc[MAXK];
// bitset<MAXK> bs[MAXK];
set<pair<int, int>> edges;
int t[MAXN], scc[MAXK], cnt[MAXK], timer = 0;
bool vis[MAXK];
stack<int> order;
bool seen4[MAXK];

void dfs(int u) {
    vis[u] = 1;
    for (int v : g[u]) {
        if (!vis[v]) dfs(v);
    }
    order.push(u);
}

void dfs2(int u) {
    scc[u] = timer;
    for (int v : gr[u]) {
        if (!scc[v]) dfs2(v);
    }
}

// void dfs3(int u) {
//     bs[u][u] = 1;
//     for (int v : gc[u]) {
//         if (bs[v].none()) {
//             dfs3(v);
//         }
//         bs[u] |= bs[v];
//     }
// }

bool dfs4(int x, int keres){
    if(x == keres)return true;
    if(seen4[x]) return false;
    seen4[x] = true;
    for(int i : gc[x]){
        if(dfs4(i, keres)){
            return true;
        }
    }
    return false;
}

// bool Q(int u, int v) {
//     return bs[scc[u]][scc[v]];
// }

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> k;
    for (int i = 1; i <= n; i++) cin >> t[i];
    cin >> m;
    for (int i = 0; i < m; i++) {
        int a, b; cin >> a >> b;
        edges.insert({a, b});
        g[a].emplace_back(b);
        gr[b].emplace_back(a);
    }
    
    for (int i = 1; i <= k; i++) {
        if (!vis[i]) dfs(i);
    }
    
    while (!order.empty()) {
        int u = order.top();
        order.pop();
        if (scc[u]) continue;
        timer++;
        dfs2(u);
    }
    
    for(int i = 1; i <= k; i++) {
        for (int v : g[i]) {
            if (scc[i] != scc[v]) {
                gc[scc[i]].emplace_back(scc[v]);
            }
        }
    }

    for (int i = 1; i <= timer; i++) {
        sort(gc[i].begin(), gc[i].end());
        gc[i].erase(unique(gc[i].begin(), gc[i].end()), gc[i].end()); 
    }
    int last = n+1;
    for (int i = 1; i <= n; i++) {
        if(i == 1 || scc[t[i]] != scc[t[i-1]]) cnt[scc[t[i]]]++;
        if (cnt[scc[t[i]]] == 2){
            last = i-1;
            break;
        }
    }

    // int last = 0;
    // for (int i = 1; i <= timer; i++) {
    //     if (first[i] != 1e6) last = max(last, first[i]);
    // }

    // for (last++; last <= n; last++) {
    //     if (scc[t[last]] != scc[t[last-1]]) {
    //         last--;
    //         break;
    //     }
    // }



    // for (int i = 1; i <= timer; i++) {
    //     if (bs[i].none()) dfs3(i);
    // }
    last = min(last, n);
    int utolsojo = last;
    for(int i = last-1; i >= 1; i--){
        if(i < n && scc[t[i]] == scc[t[i+1]]) continue;
        if (i == n) {
            // dfs4(i, -1);
            continue;
        }
        seen4[scc[t[i]]] = 0;
        if(!dfs4(scc[t[i]], scc[t[i+1]])){
            utolsojo = i;
        }
    }

    utolsojo = min(utolsojo, n);


    int ans = 2;
    for(int i = 2; i <= utolsojo; i++){
        if(edges.count({t[i-1], t[i]}) || t[i-1] == t[i]){
            ans+=2;
        } else {
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 19ms 37096 KiB
2 Elfogadva 17ms 37340 KiB
subtask2 21/21
3 Elfogadva 16ms 37512 KiB
4 Elfogadva 14ms 37624 KiB
5 Elfogadva 16ms 37700 KiB
6 Elfogadva 16ms 37840 KiB
7 Elfogadva 16ms 38200 KiB
8 Elfogadva 16ms 38256 KiB
9 Elfogadva 16ms 38164 KiB
subtask3 45/45
10 Elfogadva 143ms 54132 KiB
11 Elfogadva 130ms 54048 KiB
12 Elfogadva 173ms 60360 KiB
13 Elfogadva 170ms 60136 KiB
14 Elfogadva 175ms 60044 KiB
15 Elfogadva 165ms 60444 KiB
16 Elfogadva 184ms 61440 KiB
17 Elfogadva 181ms 64452 KiB
18 Elfogadva 192ms 64340 KiB
19 Elfogadva 187ms 66892 KiB
20 Elfogadva 172ms 67092 KiB
subtask4 34/34
21 Elfogadva 428ms 84944 KiB
22 Elfogadva 474ms 94760 KiB
23 Elfogadva 501ms 109132 KiB
24 Elfogadva 423ms 113940 KiB
25 Elfogadva 504ms 105980 KiB
26 Elfogadva 467ms 96584 KiB