제출 #1136011

#제출 시각아이디문제언어결과실행 시간메모리
1136011nathan4690다리 (APIO19_bridges)C++20
100 / 100
1487 ms142336 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define f1(i,n) for(int i=1;i<=n;i++) #define __file_name "" using namespace std; const int maxn = 1e6+5, inf=1e9, bsz = 320; struct DSU{ int n; vector<int> p,sz; vector<pair<int&, int>> roll; DSU(){}; DSU(int n): n(n), p(n+1, 0), sz(n+1, 1){ f1(i,n) p[i] = i; } int find_set(int u){ return (u == p[u] ? u : find_set(p[u])); } void union_set(int u, int v){ u = find_set(u); v = find_set(v); if(sz[u] < sz[v]) swap(u, v); roll.push_back({p[v], p[v]}); roll.push_back({sz[u], sz[u]}); if(u == v) return; p[v] = u; sz[u] += sz[v]; } void rollback(){ roll.back().first = roll.back().second; roll.pop_back(); roll.back().first = roll.back().second; roll.pop_back(); } }; struct Edge{ int u, v, w, idx; Edge(int u = 0, int v = 0, int w = 0, int idx = 0): u(u), v(v), w(w), idx(idx){}; bool operator<(const Edge &rhs) const{ return w > rhs.w; } }; struct Query{ int tp, u, w; }; int n, m, q, ans[maxn]; Edge e[maxn], ne[maxn]; Query qu[maxn]; vector<int> ie, car; int mark[maxn]; vector<pair<int,int>> squ[maxn]; vector<int> wei[maxn]; DSU dsu; vector<Edge> pree, nxte; int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); if(fopen(__file_name ".inp", "r")){ freopen(__file_name ".inp","r",stdin); freopen(__file_name ".out","w",stdout); } // code here cin >> n >> m; f1(i,m){ cin >> e[i].u >> e[i].v >> e[i].w; e[i].idx = i; ne[i] = e[i]; } cin >> q; sort(ne+1,ne+m+1); f1(i,q) { cin >> qu[i].tp >> qu[i].u >> qu[i].w; // if(qu[i].tp == 2) swap(qu[i].u, qu[i].w); } // f1(i,m) cout << e[i].u << ' ' << e[i].v << ' ' << e[i].w << '\n'; for(int l=1;l<=q;l+=bsz){ int r = min(q, l + bsz - 1); ie.clear(); car.clear(); for(int i=l;i<=r;i++){ if(qu[i].tp == 1){ ie.push_back(qu[i].u); mark[qu[i].u] = e[qu[i].u].w; } } sort(ie.begin(), ie.end()); ie.resize(unique(ie.begin(), ie.end()) - ie.begin()); for(int i=l;i<=r;i++){ if(qu[i].tp == 1){ mark[qu[i].u] = qu[i].w; }else{ int idx = upper_bound(ne+1,ne+m+1,Edge(0, 0, qu[i].w)) - ne; // cout << i << " " << idx << '\n'; // car.push_back(idx); squ[idx].push_back({qu[i].u, i}); for(int u: ie){ wei[i].push_back(mark[u]); } } } dsu = DSU(n); f1(i, m+1){ for(pair<int,int> qq: squ[i]){ int u = qq.first, idx = qq.second, cnt = 0; // cout << u << ' ' << idx << endl; for(int j=0;j<ie.size();j++){ int ei = ie[j], ew = wei[idx][j]; if(ew >= qu[idx].w){ dsu.union_set(e[ei].u, e[ei].v); cnt++; } } ans[idx] = dsu.sz[dsu.find_set(u)]; // cout << "ok" << endl; while(cnt--) dsu.rollback(); } if(i <= m && !mark[ne[i].idx]) dsu.union_set(ne[i].u, ne[i].v); } pree.clear(); nxte.clear(); f1(i, m){ if(mark[ne[i].idx]){ ne[i].w = mark[ne[i].idx]; nxte.push_back(ne[i]); }else pree.push_back(ne[i]); if(mark[i]) e[i].w = mark[i]; squ[i].clear(); } f1(i,m) mark[i] = 0; sort(nxte.begin(), nxte.end()); merge(pree.begin(), pree.end(), nxte.begin(), nxte.end(), ne+1); squ[m+1].clear(); for(int i=l;i<=r;i++) wei[i].clear(); } f1(i,q){ if(qu[i].tp == 2) cout << ans[i] << '\n'; } return 0; }

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

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