제출 #1366373

#제출 시각아이디문제언어결과실행 시간메모리
1366373gustavo_dTour (BOI25_tou)C++20
0 / 100
82 ms1552 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2*3*1e6;
#define sz(v) (int)(v).size()

bool in[MAXN], vis[MAXN];
vector<int> adj[MAXN];
vector<int> adj_base[MAXN];
vector<pair<int, int>> eds;
vector<pair<int, int>> pref[MAXN], suf[MAXN];
vector<int> ans;
int m;

bool cmp(int e1, int e2) {
    return get<1> (eds[e1]) < get<1> (eds[e2]);
}

bool dfs(int v) {
    vis[v] = true; in[v] = true;
    for (int viz : adj[v]) {
        if (in[viz]) {
            if (v < m) {
                ans.push_back(v);
            }
            return true;
        }
        if (vis[viz]) continue;
        if (dfs(viz)) {
            if (v < m) {
                ans.push_back(v);
            }
            return true;
        }
    }
    in[v] = false;
    return false;
}

int main() {
    cin.tie(0)->sync_with_stdio(false);

    int tt; cin >> tt;
    while (tt--) {
        int n; cin >> n >> m;
        int pt = 0;
        for (int i=0; i<m; i++) {
            int a, b, t; cin >> a >> b >> t; a--; b--;
            adj_base[a].push_back(pt++);
            eds.emplace_back(a ^ b, t);
        }
        for (int v=0; v<n; v++) {
            sort(adj_base[v].begin(), adj_base[v].end(), cmp);
            for (int j=0; j<sz(adj_base[v]); j++) {
                adj[pt].push_back(adj_base[v][j]);
                cerr << "conexão pref: " << pt << " -> " << adj_base[v][j] << '\n';
                if (j != sz(adj_base[v])-1) {
                    cerr << "entre pref: " << pt << " -> " << pt+1 << '\n';
                    adj[pt].push_back(pt+1);
                }
                pref[v].emplace_back(get<1> (eds[adj_base[v][j]]), pt++);
            }
            for (int j=sz(adj_base[v])-1; j>=0; j--) {
                adj[pt].push_back(adj_base[v][j]);
                cerr << "conexão suf: " << pt << " -> " << adj_base[v][j] << '\n';
                if (j != 0) {
                    adj[pt].push_back(pt+1);
                    cerr << "entre suf: " << pt << " -> " << pt+1 << '\n';
                }
                suf[v].emplace_back(get<1> (eds[adj_base[v][j]]), pt++);
            }
            reverse(suf[v].begin(), suf[v].end());
        }
        for (int v=0; v<n; v++) {
            for (int ed : adj_base[v]) {
                auto [comb, t] = eds[ed];
                int viz = comb ^ v;
                auto it = upper_bound(pref[viz].begin(), pref[viz].end(), make_pair(t, 1000000000));
                if (it != pref[viz].end()) {
                    adj[ed].push_back(it->second);
                    cerr << "para pref: " << ed << " -> " << it->second << '\n';
                }
                it = lower_bound(suf[viz].begin(), suf[viz].end(), make_pair(t, -1));
                if (it != suf[viz].begin()) {
                    it--;
                    adj[ed].push_back(it->second);
                    cerr << "para suf: " << ed << " -> " << it->second << '\n';
                }
            }
        }

        bool can = false;
        for (int i=0; i<m; i++) {
            if (vis[i]) continue;
            if (dfs(i)) {
                can = true;
                break;
            }
        }
        if (!can) cout << "NO\n";
        else {
            cout << "YES\n";
            cout << sz(ans) << '\n';
            for (int v : ans) cout << v+1 << ' ';
            cout << '\n';
        }

        for (int i=0; i<pt; i++) {
            vis[i] = false;
            adj[i].clear();
        }
        for (int i=0; i<m; i++) {
            adj_base[i].clear();
        }
        for (int i=0; i<n; i++) {
            pref[i].clear(); suf[i].clear();
        }
        eds.clear();
        ans.clear();
        pt = 0;
    }

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…