답안 #672699

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
672699 2022-12-17T13:42:18 Z haxorman Traffic (CEOI11_tra) C++14
8 / 100
5000 ms 50732 KB
#include <bits/stdc++.h>
using namespace std;

const int mxN = 3e5 + 7;

int n, m, A, B, vis[mxN], vis_cnt = 1, dp[mxN], dsu[mxN], east[mxN], p[mxN];
bool st[mxN];
vector<pair<int,int>> west;
set<int> graph[mxN];

int find(int x) {
    return dsu[x] == x ? x : dsu[x] = find(dsu[x]);
}

bool unite(int x, int y) {
    x = find(x), y = find(y);

    if (x == y) {
        return false;
    }

    if (graph[x].size() < graph[y].size()) {
        swap(x, y);
    }
    graph[x].insert(graph[y].begin(), graph[y].end());
    east[x] += east[y];
    dsu[y] = x;

    return true;
}

void findCycles(int u, int prev) {
    if (st[u]) {
        while (prev != u) {
            unite(u, prev);
            prev = p[prev];
        }
        return;
    }
    
    st[u] = true;
    p[u] = prev;
    vis[u] = vis_cnt;
    for (auto v : graph[u]) {
        findCycles(find(v), u);
    }
    st[u] = false;
}

int dfs(int u) {
    if (vis[u] == vis_cnt) {
        return 0;
    }

    if (dp[u] != -1) {
        return dp[u];
    }
    
    vis[u] = vis_cnt;
    dp[u] = east[u];
    for (auto v : graph[u]) {
        dp[u] += dfs(find(v));
    }

    return dp[u];
}

int32_t main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
    cin >> n >> m >> A >> B;
    
    map<pair<int,int>,int> pos;
    for (int i = 1; i <= n; ++i) {
        int x, y;
        cin >> x >> y;
        
        pos[{x, y}] = i;
        if (!x) {
            west.push_back({x, y});
        }
        else if (x == A) {
            east[i] = 1;
        }
    }

    for (int i = 1; i <= n; ++i) {
        dsu[i] = i;
    }

    for (int i = 0; i < m; ++i) {
        int u, v, d;
        cin >> u >> v >> d;
     
        if (d == 2) {
            unite(u, v);
        }
        else {
            graph[find(u)].insert(find(v));
        }
    }
    
    for (int iter = 0; iter < n + 1; ++iter) {
        for (int i = 1; i <= n; ++i) {
            if (vis[find(i)] != vis_cnt) {
                findCycles(find(i), 0);
            }
        }
        vis_cnt++;
    }
    
    memset(dp, -1, sizeof(dp));
    sort(west.begin(), west.end(), greater<pair<int,int>>());
    for (auto x : west) {
        int res = dfs(find(pos[x]));
        cout << res << "\n";
        ++vis_cnt;
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 15572 KB Output is correct
2 Correct 8 ms 15572 KB Output is correct
3 Correct 10 ms 15572 KB Output is correct
4 Correct 9 ms 15528 KB Output is correct
5 Correct 8 ms 15596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 15572 KB Output is correct
2 Incorrect 9 ms 15524 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 15572 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 573 ms 15960 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5042 ms 18052 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5039 ms 20524 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5052 ms 26128 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5037 ms 27512 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5064 ms 37432 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5064 ms 50732 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5035 ms 44996 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5065 ms 43032 KB Time limit exceeded
2 Halted 0 ms 0 KB -