답안 #497045

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
497045 2021-12-22T08:58:52 Z ergagan Coin Collecting (JOI19_ho_t4) C++17
0 / 100
1 ms 332 KB
//я так много думал, что опять попал
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define f first
#define s second
#define left(v) v + v
#define right(v) v + v + 1
#define ub upper_bound
#define lb lower_bound
#define pll pair<ll,ll>

using namespace std;
typedef long long ll;

//17 SEVENTEEN
const long double Pi = acos(-1.0);
const ll dx[] = {0,0,1,-1};
const ll dy[] = {1,-1,0,0};
const ll N = (ll) 1e6 + 17;
const ll M = (ll) 5e3 + 69;
const ll inf = (ll) 1e14 + 3;
const ll mod = (ll) 1e9 + 7;
ll sq(ll x) { return x * x; }

ll zxc = 1, x, y, a[5][N], sum[5];

void solve() {
    ll n, ans = 0;
    cin >> n;
    for(ll i = 1; i <= 2 * n; i++) {
        cin >> y >> x;
        if(1 <= x && x <= 2 && 1 <= y && y <= n) a[x][y]++;
        else if(x < 1 && y < 1) {
            a[1][1]++;
            ans += abs(x - 1), ans += abs(y - 1);
        }
        else if(x < 1 && y > n) {
            a[1][n]++;
            ans += abs(x - 1), ans += abs(y - n);
        }
        else if(y < 1 && x > 2) {
            a[2][1]++;
            ans += abs(x - 2), ans += abs(y - 1);
        }
        else if(x > 2 && y > n) {
            a[2][n]++;
            ans += abs(x - 2), ans += abs(y - n);
        }
        else if(1 <= x && x <= 2 && y < 1)
            a[x][1]++, ans += abs(y - 1);

        else if(1 <= x && x <= 2 && y > n)
            a[x][n]++, ans += abs(y - n);

        else if(1 <= y && y <= n && x < 1)
            a[1][y]++, ans += abs(x - 1);

        else if(1 <= y && y <= n && x > 2)
            a[2][y]++, ans += abs(x - 2);
    }

    for(ll i = 1; i <= 2; i++) {
        for(ll j = 1; j <= n; j++) {
//            cout << a[i][j] << " ";
            sum[i] += a[i][j];
        }
//        cout << sum[i] << "\n";
    }

    if(sum[1] > sum[2]) {
        ll x = a[1][1] - 1;
        a[1][1] -= min(x, sum[1] - sum[2]);
        a[2][1] += min(x, sum[1] - sum[2]);
        sum[1] -= min(x, sum[1] - sum[2]);
        ans += min(x, sum[1] - sum[2]);

        x = a[1][n] - 1;

        a[1][n] -= min(x, sum[1] - sum[2]);
        a[2][n] += min(x, sum[1] - sum[2]);
        ans += min(x, sum[1] - sum[2]);
    }
    else {
        ll x = a[2][1] - 1;
        a[2][1] -= min(x, sum[2] - sum[1]);
        a[1][1] += min(x, sum[2] - sum[1]);
        sum[2] -= min(x, sum[2] - sum[1]);
        ans += min(x, sum[2] - sum[1]);

        x = a[1][n] - 1;

        a[2][n] -= min(x, sum[2] - sum[1]);
        a[1][n] += min(x, sum[1] - sum[2]);
        sum[2] -= min(x, sum[2] - sum[1]);
        ans += min(x, sum[2] - sum[1]);
    }

//    for(ll i = 1; i <= 2; i++) {
//        for(ll j = 1; j <= n; j++) {
//            cout << a[i][j] << " ";
//            sum[i] += a[i][j];
//        }
//        cout << "\n";
//    }

    for(ll i = 1; i <= 2; i++) {
        for(ll j = 1; j <= n; j++) {
            if(a[i][j] > 1) a[i][j]--, a[i][j + 1]++, ans++;
            else break;
        }
        for(ll j = n; j >= 1; j--) {
            if(a[i][j] > 1) a[i][j]--, a[i][j - 1]++, ans++;
            else break;
        }
    }

//    vector<pair<ll, pll> > v;
//    v.pb({a[1][1], {1, 1}});
//    v.pb({a[1][n], {1, n}});
//    v.pb({a[2][1], {2, 1}});
//    v.pb({a[2][n], {2, n}});
//
//    sort(all(v));
//    reverse(all(v));
//
//    for(auto cur : v) {
//        queue<pll> q;
//        q.push({cur.s.f, cur.s.s});
//        ll cnt = cur.f;
//        while(cnt) {
//            ll x = q.front().f, y = q.front().s;
//            q.pop();
//            for(ll i = 0; i < 4; i++) {
//                ll qx = x + dx[i], qy = y + dy[i];
//                if(qx < 1 || qy < 1 || qx > 2 || qy > n || a[qx][qy]) continue;
//
//                if(cnt)
//                    a[qx][qy] = 1, q.push({qx, qy}), cnt--, ans += abs(cur.s.f - qx) + abs(cur.s.s - qy);
//            }
//        }
//        while(!q.empty()) q.pop();
//    }
    cout << ans;
}

int main(/*Уверенно*/) {
ios_base::sync_with_stdio(0);
    cin.tie(0);
/*
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
*/
//    cin >> zxc;
    while(zxc--) {
        solve();
    }
  	return 0;
}
// さよならさ いかなくちゃ
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 304 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 320 KB Output is correct
5 Incorrect 1 ms 332 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 304 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 320 KB Output is correct
5 Incorrect 1 ms 332 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 304 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 320 KB Output is correct
5 Incorrect 1 ms 332 KB Output isn't correct
6 Halted 0 ms 0 KB -