#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
struct Point {
ll x, y;
};
bool operator<(Point a, Point b) {
return a.x < b.x;
}
ll dist(Point a, Point b) {
return abs(a.x-b.x) + abs(a.y-b.y);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
ll ans = 0;
vector<vector<int>> mapa(n+1, vector<int>(3));
for(int i=0; i<2*n; ++i) {
Point p; cin >> p.x >> p.y;
if(p.y > 1) {
ans += p.y-2;
p.y = 2;
} else {
ans += 1-p.y;
p.y = 1;
}
if(p.x < 1) {
ans += 1-p.x;
p.x = 1;
}
if(p.x > n) {
ans += p.x-n;
p.x = n;
}
mapa[p.x][p.y]++;
}
/*cout << ans << "\n";
for(int j=1; j<=2; ++j) {
for(int i=1; i<=n; ++i) {
cout << mapa[i][j] << " ";
}
cout << "\n";
}*/
ll a=0, b=0, c=0;
for(int i=1; i<=n; ++i) {
a += abs(b) + abs(c);
b += mapa[i][1] - 1;
c += mapa[i][2] - 1;
if(b > 0) {
int moge_dac = b;
int moge_wziac = max(0LL, -c);
b -= min(moge_dac, moge_wziac);
c += min(moge_dac, moge_wziac);
a += min(moge_dac, moge_wziac);
} else if(c > 0) {
int moge_dac = c;
int moge_wziac = max(0LL, -b);
c -= min(moge_dac, moge_wziac);
b += min(moge_dac, moge_wziac);
a += min(moge_dac, moge_wziac);
}
//cout << i << ": " << a << " " << b << " " << c << "\n";
}
ans += a;
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |