Submission #1158037

#TimeUsernameProblemLanguageResultExecution timeMemory
1158037PacybwoahCoin Collecting (JOI19_ho_t4)C++20
100 / 100
34 ms9032 KiB
#include<iostream>
#include<algorithm>
#include<utility>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const ll inf = 1e18;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    vector<pair<ll, ll>> vec(2 * n);
    for(int i = 0; i < 2 * n; i++) cin >> vec[i].first >> vec[i].second;
    vector<vector<ll>> grid(n + 1, vector<ll>(3));
    ll ans = 0;
    for(auto &[x, y]: vec){
        int nx, ny;
        if(x < 1){
            nx = 1;
            ans += 1 - x;
        }
        else if(x > n){
            nx = n;
            ans += x - n;
        }
        else nx = x;
        if(y >= 2){
            ans += y - 2;
            ny = 2;
        }
        else{
            ans += 1 - y;
            ny = 1;
        }
        grid[nx][ny]++;
    }
    int cur = 0;
    for(int i = 1; i <= n; i++){
        cur += grid[i][1];
        cur += grid[i][2];
        int tar = cur - 2 * i;
        ans += abs(tar);
        //cout << cur << " " << tar << "\n";
        if(tar > 0){
            if(grid[i][1] > 1){
                if(grid[i][1] - 1 > tar){
                    grid[i][1] -= tar;
                    grid[i + 1][1] += tar;
                    tar = 0;
                }
                else{
                    grid[i + 1][1] += grid[i][1] - 1;
                    tar -= grid[i][1] - 1;
                    grid[i][1] = 1;
                }
            }
            if(grid[i][2] > 1){
                if(grid[i][2] - 1 > tar){
                    grid[i][2] -= tar;
                    grid[i + 1][2] += tar;
                    tar = 0;
                }
                else{
                    grid[i + 1][2] += grid[i][2] - 1;
                    tar -= grid[i][2] - 1;
                    grid[i][2] = 1;
                }
            }
        }
        if(tar < 0){
            tar = -tar;
            if(grid[i][1] < 1){
                if(1 - grid[i][1] > tar){
                    grid[i][1] += tar;
                    grid[i + 1][1] -= tar;
                    tar = 0;
                }
                else{
                    grid[i + 1][1] -= 1 - grid[i][1];
                    tar -= 1 - grid[i][1];
                    grid[i][1] = 1;
                }
            }
            if(grid[i][2] < 1){
                if(1 - grid[i][2] > tar){
                    grid[i][2] += tar;
                    grid[i + 1][2] -= tar;
                    tar = 0;
                }
                else{
                    grid[i + 1][2] -= 1 - grid[i][2];
                    tar -= 1 - grid[i][2];
                    grid[i][2] = 1;
                }
            }
        }
        ans += abs(grid[i][1] - 1);
        cur = 2 * i;
    }
    cout << ans << "\n";
}
// g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run pD.cpp
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...