이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
long long K, N, M, L[100009], R[100009], cnt;
long long solve_1() {
vector<long long>X; map<long long, long long>Map;
for (int i = 0; i < M; i++) {
X.push_back(L[i]);
X.push_back(R[i]);
Map[L[i]] += 2; Map[R[i]] += 2;
}
sort(X.begin(), X.end());
X.erase(unique(X.begin(), X.end()), X.end());
long long cx = 0, sum = 0, minx = (1LL << 60), dep = -M * 2;
for (int i = 0; i < M; i++) sum += L[i] + R[i];
minx = min(minx, sum);
for (int i = 0; i < X.size(); i++) {
sum += (X[i] - cx) * dep;
minx = min(minx, sum);
dep += Map[X[i]];
cx = X[i];
}
return minx;
}
long long solve_val(long long val) {
vector<long long>X; map<long long, long long>Map[1000000];
for (int i = 0; i < M; i++) {
if (val < L[i] || R[i] < val) {
long long E = min(abs(L[i] - val), abs(val - R[i]));
X.push_back(L[i] - E); Map[(L[i] - E) >> 10][(L[i] - E) & 1023] -= 2;
X.push_back(R[i] + E); Map[(R[i] + E) >> 10][(R[i] + E) & 1023] -= 2;
X.push_back(L[i]); Map[L[i] >> 10][L[i] & 1023] += 2;
X.push_back(R[i]); Map[R[i] >> 10][R[i] & 1023] += 2;
}
}
sort(X.begin(), X.end());
X.erase(unique(X.begin(), X.end()), X.end());
long long cx = -2000000000LL, sum = 0, minx = (1LL << 60), dep = 0;
for (int i = 0; i < M; i++) sum += abs(L[i] - val) + abs(R[i] - val);
minx = min(minx, sum);
for (int i = 0; i < X.size(); i++) {
sum += (X[i] - cx) * dep;
minx = min(minx, sum);
dep += Map[X[i] >> 10][X[i] & 1023];
cx = X[i];
}
return minx;
}
long long solve_2() {
long long ans = solve_1();
vector<long long>XX;
for (int i = 0; i < N; i++) XX.push_back(L[i]);
for (int i = 0; i < N; i++) XX.push_back(R[i]);
sort(XX.begin(), XX.end());
int cl = 0, cr = XX.size(), c1, c2;
for (int i = 0; i < 29; i++) {
c1 = (cl + cl + cr) / 3;
c2 = (cl + cr + cr) / 3;
long long J1 = solve_val(XX[c1]);
long long J2 = solve_val(XX[c2]);
ans = min({ ans, J1, J2 });
if (J1 < J2) cr = c2;
else cl = c1;
}
for (int i = cl - 1; i <= c1 + 2; i++) {
if (i < 0 || i >= XX.size()) continue;
long long J1 = solve_val(XX[i]);
ans = min(ans, J1);
}
return ans;
}
int main() {
cin >> K >> N;
for (int i = 0; i < N; i++) {
char c1, c2; int cl, cr;
cin >> c1 >> cl >> c2 >> cr;
if (c1 != c2) {
if (cl > cr) swap(cl, cr);
L[M] = cl;
R[M] = cr;
cnt++; M++;
}
else cnt += 1LL * abs(cl - cr);
}
if (K == 1) {
cout << solve_1() + cnt << endl;
}
if (K == 2) {
cout << solve_2() + cnt << endl;
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
bridge.cpp: In function 'long long int solve_1()':
bridge.cpp:23:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i < X.size(); i++) {
~~^~~~~~~~~~
bridge.cpp: In function 'long long int solve_val(long long int)':
bridge.cpp:50:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i = 0; i < X.size(); i++) {
~~^~~~~~~~~~
bridge.cpp: In function 'long long int solve_2()':
bridge.cpp:78:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (i < 0 || i >= XX.size()) continue;
~~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |