이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
#pragma warning (disable: 4996)
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 D[1 << 20], vals[1 << 20], size_;
long long Y[1 << 20]; pair<int, int> X[1 << 20];
long long solve_val(long long val) {
int sz = 0;
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]));
Y[sz] = (L[i] - E) * 2; sz++;
Y[sz] = (R[i] + E) * 2; sz++;
Y[sz] = L[i] * 2 + 1; sz++;
Y[sz] = R[i] * 2 + 1; sz++;
}
}
sort(Y, Y + sz);
for (int i = 0; i < sz; i++) {
if (Y[i] % 2 == 0) {
X[i].first = (long long)(Y[i] >> 1);
X[i].second = -2;
}
else {
X[i].first = (long long)((Y[i] - 1) >> 1);
X[i].second = 2;
}
}
size_ = 0; vals[0] = 0;
for (int i = 0; i < sz; i++) {
D[size_] = X[i].first;
vals[size_] += X[i].second;
if (i == sz - 1 || X[i].first != X[i + 1].first) { size_++; vals[size_] = 0; }
}
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 < size_; i++) {
sum += (D[i] - cx) * dep;
minx = min(minx, sum);
dep += vals[i];
cx = D[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 < 27; 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; i <= c1 + 1; 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:6:0: warning: ignoring #pragma warning [-Wunknown-pragmas]
#pragma warning (disable: 4996)
bridge.cpp: In function 'long long int solve_1()':
bridge.cpp:24: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:98: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... |