Submission #1310147

#TimeUsernameProblemLanguageResultExecution timeMemory
1310147zxzuamCoin Collecting (JOI19_ho_t4)C++20
0 / 100
1 ms576 KiB
#include<bits/stdc++.h>
#define int long long
#define I128 //||is_same<T,__int128_t>::value||is_same<T,__uint128_t>::value
using namespace std;
template<typename T>enable_if_t<is_integral<T>::value I128,void> readmain(T &x)
{
	bool neg=false;int c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')neg=true;
	for(x=0;isdigit(c);c=getchar())x=(T)(10*x+(c-'0'));
	if(neg)x=-x;
}
template<typename T>T& read(T &x){readmain(x);return x;}
template<typename T,typename ...Tr>void read(T &x,Tr&... r){readmain(x);read(r...);}
constexpr int maxn = 2e5 + 9, mod = 1e9 + 7, L = 1e8;

void solve(){
    int n;
    read(n);
    vector <int> x(2 * n + 1), y(2 * n + 1);
    for(int i = 1; i <= 2 * n; i++) {
        read(x[i], y[i]);
    }
    int ans = 0;
    for(int i = 1; i <= 2 * n; i++) {
        if(1 <= x[i] && x[i] <= n) {
            if(2 <= y[i]){
                ans += y[i] - 2ll;
                y[i] = 2;
            }
            else{
                ans += 1ll - y[i];
                y[i] = 1;
            }
        }
        else{
            if(2 <= y[i]) {
                ans += y[i] - 2ll;
                y[i] = 2;
            }
            else{
                ans += 1ll - y[i];
                y[i] = 1;
            }
            if(x[i] < 1) {
                ans += 1ll - x[i];
                x[i] = 1;
            }
            else{
                ans += x[i] - n;
                x[i] = n;
            }
        }
    }
    multiset <int> s1, s2;
    for(int i = 1; i <= 2 * n; i++) {
        if(y[i] == 1) {
            s1.insert(x[i]);
        }
        else{
            s2.insert(x[i]);
        }
    }
    for(int i = 1; i <= 2 * n; i++) {
        int X = (i + 1) / 2, Y = i & 1;
        if(!Y){
            Y = 2;
        }
        int l1 = mod, r1 = mod;
        int l2 = mod, r2 = mod;
        if(!s1.empty()){
            auto it = lower_bound(s1.begin(), s1.end(), X);
            if(it != s1.end()){
                r1 = *it;
                r1 = abs(r1 - X);
            }
            if(it != s1.begin()){
                it--;
                l1 = *it;
                l1 = abs(l1 - X);
            }
        }
        if(!s2.empty()) {
            auto it = lower_bound(s2.begin(), s2.end(), X);
            if(it != s2.end()) {
                r2 = *it;
                r2 = abs(r2 - X);
            }
            if(it != s2.begin()){
                it--;
                l2 = *it;
                l2 = abs(l2 - X);
            }
        }
        if(Y == 1) {
            l2++;
            r2++;
        }
        if(Y == 2){
            l1++;
            r1++;
        }
        int mn = min({l1, r1, l2, r2});
        ans += mn;
        if(mn == l1) {
            auto it = lower_bound(s1.begin(), s1.end(), X);
            it--;
            s1.erase(it);
        }
        else if(mn == r1){
            auto it = lower_bound(s1.begin(), s1.end(), X);
            s1.erase(it);
        }
        else if(mn == l2){
            auto it = lower_bound(s2.begin(), s2.end(), X);
            it--;
            s2.erase(it);
        }
        else{
            auto it = lower_bound(s2.begin(), s2.end(), X);
            s2.erase(it);
        }
    }
    printf("%lld", ans);
}

int32_t main(){
    //ios_base::sync_with_stdio(false);
    //cin.tie(nullptr);
    int tt = 1;
    //cin >> tt;
    while(tt--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...