제출 #258799

#제출 시각아이디문제언어결과실행 시간메모리
258799SamAnd이상적인 도시 (IOI12_city)C++17
55 / 100
376 ms26616 KiB
#include <bits/stdc++.h> using namespace std; #define m_p make_pair #define fi first #define se second #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) typedef long long ll; const int N = 100005, M = 1000000000; const int xx[4] = {0, 1, 0, -1}; const int yy[4] = {1, 0, -1, 0}; ll ans; int n; int X[N], Y[N]; map<pair<int, int>, int> mp; vector<int> g[N]; bool c[N]; int d[N]; void bfs(int i) { for (int i = 0; i < n; ++i) c[i] = false; queue<int> q; c[i] = true; d[i] = 0; q.push(i); while (!q.empty()) { int i = q.front(); q.pop(); for (int j = 0; j < g[i].size(); ++j) { int h = g[i][j]; if (!c[h]) { c[h] = true; d[h] = d[i] + 1; q.push(h); } } } } int px[N], py[N]; void dfs(int i, ll yans) { c[i] = true; ans += yans; for (int j = 0; j < 4; ++j) { int x = X[i] + xx[j]; int y = Y[i] + yy[j]; if (mp.find(m_p(x, y)) != mp.end()) { int h = mp[m_p(x, y)]; if (c[h]) continue; if (xx[j] == 1) dfs(h, yans + px[X[i]] - (n - px[X[i]])); else if (xx[j] == -1) dfs(h, yans - px[X[i] - 1] + (n - px[X[i] - 1])); else if (yy[j] == 1) dfs(h, yans + py[Y[i]] - (n - py[Y[i]])); else dfs(h, yans - py[Y[i] - 1] + (n - py[Y[i] - 1])); } } } int DistanceSum(int N, int *X_, int *Y_) { n = N; for (int i = 0; i < n; ++i) { X[i] = X_[i]; Y[i] = Y_[i]; } int minx = X[0]; int miny = Y[0]; for (int i = 0; i < n; ++i) { minx = min(minx, X[i]); miny = min(miny, Y[i]); } for (int i = 0; i < n; ++i) { X[i] -= (minx - 1); Y[i] -= (miny - 1); } for (int i = 0; i < n; ++i) { mp[m_p(X[i], Y[i])] = i; } for (int i = 0; i < n; ++i) { for (int j = 0; j < 4; ++j) { int x = X[i] + xx[j]; int y = Y[i] + yy[j]; if (mp.find(m_p(x, y)) != mp.end()) g[i].push_back(mp[m_p(x, y)]); } } if (n <= 2000) { for (int i = 0; i < n; ++i) { bfs(i); for (int j = i + 1; j < n; ++j) ans = (ans + d[j]); } return ans % M; } else { for (int i = 0; i < n; ++i) { px[X[i]]++; py[Y[i]]++; } for (int i = 1; i <= n; ++i) { px[i] += px[i - 1]; py[i] += py[i - 1]; } bfs(0); ll yans = 0; for (int i = 0; i < n; ++i) yans += d[i]; memset(c, false, sizeof c); dfs(0, yans); ans /= 2; return ans % M; } }

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

city.cpp: In function 'void bfs(int)':
city.cpp:35:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < g[i].size(); ++j)
                         ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...