제출 #1177753

#제출 시각아이디문제언어결과실행 시간메모리
1177753sasdeBridges (APIO19_bridges)C++17
0 / 100
695 ms3776 KiB
#include<bits/stdc++.h> #define task "strdel" #define ii pair<int,int> #define iii pair<int,ii> #define iv pair<ii,ii> #define se second #define fi first #define ffi fi.fi #define sfi se.fi #define sse se.se #define fse fi.se #define lt(i, c, d) for(int i = c; i <= d; ++i) #define fl(i, c, d) for(int i = d; i >= c; --i) #define pb push_back #define emb emplace_back #define emf emplace_front #define em emplace using namespace std; const int N = 5e4+5, sq = 450; stack<ii> zz; int r[N], ver[N], curVer = 0; // Dùng phiên bản để tránh memset void reset() { ++curVer; } int acs(int u) { if (ver[u] != curVer) { ver[u] = curVer; r[u] = -1; return u; } return (r[u] < 0) ? u : (r[u] = acs(r[u])); } void join(int u, int v, int i) { u = acs(u), v = acs(v); if (u == v) return; if (r[u] > r[v]) swap(u, v); if (i) zz.push({v, r[v]}); r[u] += r[v]; r[v] = u; } void rollback() { while (!zz.empty()) { auto [v, rv] = zz.top(); zz.pop(); r[v] = rv; } } int n, m, ans[N]; struct pt1 { int u, v, w; } b[2 * N]; struct pt2 { int t, u, w; } c[2 * N]; bool k[N]; int k1[N]; void solve() { cin >> n >> m; for (int i = 1; i <= m; ++i) cin >> b[i].u >> b[i].v >> b[i].w; int q; cin >> q; for (int test = 1; test <= q; ++test) cin >> c[test].t >> c[test].u >> c[test].w; for (int st = 1; st <= q; st += sq) { vector<int> jo, nojo, res; int test = min(q, st + sq - 1); for (int i = st; i <= test; ++i) { if (c[i].t == 1) k[c[i].u] = 1; else res.emb(i); } for (int i = 1; i <= m; ++i) { if (!k[i]) nojo.emb(i); else jo.emb(i); } sort(res.begin(), res.end(), [](const int &x, const int &y) { return c[x].w > c[y].w; }); sort(nojo.begin(), nojo.end(), [](const int &x, const int &y) { return b[x].w > b[y].w; }); int j = 0; reset(); // Tránh memset for (int x : res) { while (j < nojo.size() && b[nojo[j]].w >= c[x].w) { join(b[nojo[j]].u, b[nojo[j]].v, 0); ++j; } for (int z = st; z < x; ++z) if (c[z].t == 1) k1[c[z].u] = z; for (int y : jo) { if (k1[y] && c[k1[y]].w >= c[x].w) join(b[y].u, b[y].v, 1); else if (b[y].w >= c[x].w) join(b[y].u, b[y].v, 1); } ans[x] = -r[acs(c[x].u)]; rollback(); for (int z = st; z < x; ++z) if (c[z].t == 1) k1[c[z].u] = 0; } for (int i = st; i <= test; ++i) { if (c[i].t == 1) { k[c[i].u] = 0; b[c[i].u].w = c[i].w; } } } for (int i = 1; i <= q; ++i) if (c[i].t == 2) cout << ans[i] << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); if (fopen(task ".inp", "r")) { freopen(task ".inp", "r", stdin); freopen(task ".out", "w", stdout); } solve(); }

컴파일 시 표준 에러 (stderr) 메시지

bridges.cpp: In function 'int main()':
bridges.cpp:122:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |         freopen(task ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(task ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...