제출 #231670

#제출 시각아이디문제언어결과실행 시간메모리
231670VimmerPraktični (COCI18_prakticni)C++14
130 / 130
137 ms15220 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //#pragma GCC optimize("unroll-loops") //#pragma GCC optimize("-O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("fast-math") //#pragma GCC optimize("no-stack-protector") #define F first #define S second #define sz(x) int(x.size()) #define pb push_back #define N 100005 #define MOD ll(1e9 + 7) #define block 500 using namespace std; //using namespace __gnu_pbds; typedef long double ld; typedef long long ll; typedef short int si; //typedef tree <int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; int pr[N], rk[N], a[N], b[N], c[N], basis[32], id[32], conv[32], sz, cnt[N]; vector <int> ans[32]; vector <pair <int, int> > g[N], vr; void make(int x) {pr[x] = x; rk[x] = 1;} vector <int> check; int fnd(int x) {if (pr[x] != x) pr[x] = fnd(pr[x]); return pr[x];} void link(int x, int y) { if (rk[y] > rk[x]) swap(x, y); pr[y] = x; rk[x] += rk[y]; } void dfs(int v, int p) { for (auto it : g[v]) { if (it.F == p) continue; cnt[it.F] = cnt[v] ^ it.S; dfs(it.F, v); } } void add_basis(int x) { for (int i = 0; i < 32; i++) if ((1 << i) & x) { if (!basis[i]) { basis[i] = x; id[i] = sz; conv[sz] = i; sz++; return; } x ^= basis[i]; } } void add(pair <int, int> x) { for (int i = 0; i < 32; i++) if ((1 << i) & x.S) { ans[id[i]].pb(x.F); x.S ^= basis[i]; } } int main() { //freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) make(i); for (int i = 1; i <= m; i++) { cin >> a[i] >> b[i] >> c[i]; int x = fnd(a[i]), y = fnd(b[i]); if (x != y) { link(x, y); g[a[i]].pb({b[i], c[i]}); g[b[i]].pb({a[i], c[i]}); } else check.pb(i); } dfs(1, -1); for (auto it : check) { int t = cnt[a[it]] ^ cnt[b[it]] ^ c[it]; if (!t) continue; vr.pb({it, t}); add_basis(t); } if (!sz(vr)) {cout << 0 << endl; exit(0);} cout << sz << endl; for (auto it : vr) add(it); for (int i = 0; i < sz; i++) { cout << basis[conv[i]] << " " << sz(ans[i]) << " "; sort(ans[i].begin(), ans[i].end()); for (auto it : ans[i]) cout << it << " "; cout << endl; } }
#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...