제출 #209505

#제출 시각아이디문제언어결과실행 시간메모리
209505mieszko11b다리 (APIO19_bridges)C++14
73 / 100
3099 ms25448 KiB
#include <bits/stdc++.h> using namespace std; using ii = pair<int, int>; #define X first #define Y second const int SQRT = 600; int n, m; int a[100007], b[100007], c[100007]; int q; int t[100007], d[100007], e[100007], ans[100007]; bool changed[100007]; int lastw[100007]; int maxv; vector<int> not_changed[200007]; vector<int> G[50007]; void readint(int &x) { x = 0; char c; do c = getchar_unlocked(); while(c < '0' || c > '9'); do { x = x * 10 + c - '0'; c = getchar_unlocked(); } while(c >= '0' && c <= '9'); } struct DSU { int n; vector<int> p, rank; int cnt; vector<bool> vis; vector<int> aff; DSU(int _n) { n = _n; p.resize(n + 1); rank.resize(n + 1); vis.resize(n + 1); for(int i = 1 ; i <= n ; i++) { p[i] = i; rank[i] = 1; } } int Find(int i) { if(p[i] == i) return i; return p[i] = Find(p[i]); } void Union(int a, int b) { a = Find(a); b = Find(b); if(a == b) return ; if(rank[a] < rank[b]) { p[a] = b; rank[b] += rank[a]; } else { p[b] = a; rank[a] += rank[b]; } } void dfs(int w) { if(vis[w]) return ; vis[w] = 1; aff.push_back(w); cnt += rank[w]; for(int u : G[w]) dfs(u); } int count(vector<int> &E, int w) { for(int e : E) { G[Find(a[e])].push_back(Find(b[e])); G[Find(b[e])].push_back(Find(a[e])); } cnt = 0; dfs(Find(w)); for(int x : aff) vis[x] = 0; aff.clear(); for(int e : E) { G[Find(a[e])].clear(); G[Find(b[e])].clear(); } return cnt; } }; void process_queries(int x, int y) { vector<ii> Q; vector<int> chacha; chacha.reserve(y - x + 1); Q.reserve(y - x + 1); memset(changed, 0, sizeof changed); for(int i = x ; i <= y ; i++) { if(t[i] == 1) changed[d[i]] = 1; else Q.emplace_back(e[i], i); } for(int j = 0 ; j < maxv ; j++) not_changed[j].clear(); for(int i = 1 ; i <= m ; i++) { if(!changed[i]) not_changed[c[i]].push_back(i); else chacha.push_back(i); } sort(Q.begin(), Q.end(), greater<ii>()); DSU *dsu = new DSU(n); int v = maxv; for(int j = 0 ; j < Q.size() ; j++) { int q = Q[j].Y; for(int i = e[q] ; i < v ; i++) for(int e : not_changed[i]) dsu->Union(a[e], b[e]); v = e[q]; for(int e : chacha) lastw[e] = c[e]; for(int k = x ; k < q ; k++) if(t[k] == 1) lastw[d[k]] = e[k]; vector<int> E; E.reserve(y - x + 1); for(int e : chacha) if(lastw[e] >= ::e[q]) E.push_back(e); ans[q] = dsu->count(E, d[q]); } for(int k = x ; k <= y ; k++) if(t[k] == 1) c[d[k]] = e[k]; delete dsu; } int main() { //~ scanf("%d%d",&n, &m); readint(n); readint(m); vector<int> hlp; for(int i = 1 ; i <= m ; i++) { //~ scanf("%d%d%d", &a[i], &b[i], &c[i]); readint(a[i]); readint(b[i]); readint(c[i]); hlp.push_back(c[i]); } //~ scanf("%d", &q); readint(q); for(int i = 1 ; i <= q ; i++) { //~ scanf("%d%d%d", &t[i], &d[i], &e[i]); readint(t[i]); readint(d[i]); readint(e[i]); hlp.push_back(e[i]); } sort(hlp.begin(), hlp.end()); hlp.resize(distance(hlp.begin(), unique(hlp.begin(), hlp.end()))); map<int, int> M; for(int i = 0 ; i < hlp.size() ; i++) M[hlp[i]] = i; maxv = hlp.size(); for(int i = 1 ; i <= m ; i++) c[i] = M[c[i]]; for(int i = 1 ; i <= q ; i++) e[i] = M[e[i]]; for(int i = 1 ; i <= q ; i += SQRT) process_queries(i, min(i + SQRT - 1, q)); for(int i = 1 ; i <= q ; i++) if(ans[i]) printf("%d\n", ans[i]); return 0; }

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

bridges.cpp: In function 'void process_queries(int, int)':
bridges.cpp:129:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 0 ; j < Q.size() ; j++) {
                  ~~^~~~~~~~~~
bridges.cpp: In function 'int main()':
bridges.cpp:184:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0 ; i < hlp.size() ; i++)
                  ~~^~~~~~~~~~~~
#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...