Submission #1226860

#TimeUsernameProblemLanguageResultExecution timeMemory
1226860HishamAlshehriTraffic (CEOI11_tra)C++20
0 / 100
572 ms77532 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
// using namespace __gnu_pbds;
 
// #define int long long
#define mod 1000000007
#define base 7001
#define base2 757
#define F first
#define S second
// #define pi acos(-1)
#define double long double
// #define ordered_set tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update>
// #define ordered_multiset tree<int, null_type, less_equal<int>, rb_tree_tag,tree_order_statistics_node_update>

// #pragma GCC optimize("O3,Ofast,unroll-loops")
// #pragma GCC target("avx2,sse3,sse4,avx")

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

constexpr int maxn = 1000005;
const int N = 1 << (int)(ceil(log2(maxn)));

int n, m, a, b, east[maxn], ans[maxn];
vector<int> adj[maxn][2];
vector<array<int, 3>> cords;
bool vis[maxn], vis2[maxn], vis3[maxn];

void dfs(int v, bool f) {
    vis[v] = 1;
    for (int u : adj[v][f]) {
        if (!vis[u]) dfs(u, f);
    }
}

void dfsmn(int v, int s) {
    vis3[v] = 1;
    ans[v] -= s;

    for (int u : adj[v][1]) {
        if (!vis3[u]) dfsmn(u, s);
    }
}

void dfsmx(int v, int s) {
    vis2[v] = 1;
    ans[v] += s;

    for (int u : adj[v][1]) {
        if (!vis2[u]) dfsmx(u, s);
    }
}

signed main()
{
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> m >> a >> b;

    for (int i = 1; i <= n; i++) {
        int x, y; cin >> x >> y;
        cords.push_back({y, x, i});
    }

    for (int i = 0; i < m; i++) {
        int u, v, d; cin >> u >> v >> d;
        if (d % 2) {
            adj[u][0].push_back(v);
            adj[v][1].push_back(u);
        }
        else {
            adj[u][0].push_back(v);
            adj[v][0].push_back(u);
            adj[u][1].push_back(v);
            adj[v][1].push_back(u);
        }
    }

    sort(cords.begin(), cords.end());

    int cnt = 1;
    for (auto [y, x, i] : cords) {
        if (i < 0) continue;
        if (x == a) east[i] = cnt++;
    }

    for (auto [y, x, i] : cords) {
        if (!vis[i] && !x) dfs(i, 0);
    }

    for (auto [y, x, i] : cords) {
        if (east[i] && !vis3[i] && vis[i]) dfsmn(i, east[i]);
    }

    reverse(cords.begin(), cords.end());

    for (auto [y, x, i] : cords) {
        if (east[i] && !vis2[i] && vis[i]) dfsmx(i, east[i]);
    }

    for (auto [y, x, i] : cords) {
        if (!x) cout << ans[i] + vis2[i] << '\n';
    }
}
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...