제출 #1043211

#제출 시각아이디문제언어결과실행 시간메모리
1043211model_codeBikeparking (EGOI24_bikeparking)C++17
44 / 100
949 ms27944 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <array>
#include <iomanip>
#include <queue>
#include <stack>
#include <numeric>
#include <cassert>
#include <cmath>
#include <random>
#include <ctime>
#include <chrono>

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)x.size())
#define rep(i, a, b) for(int i = a; i < b; ++i)

template <typename T> void chmin(T &a, T b){ a = (b < a) ? b : a; }
template <typename T> void chmax(T &a, T b){ a = (b > a) ? b : a; } 

const int N = 3e5 + 3;
const ll INF = 1e18;

ll n, x[N], y[N];

ll sgn(ll x){
    return (x > 0) - (x < 0);
}

ll calc(ll cnt_good){
    ll sv = cnt_good;
    vector<pair<ll, ll>> xv, yv;
    for(int i = 0; i < n; ++i){
        if(y[i] <= cnt_good){
            cnt_good -= y[i];
            yv.push_back({y[i], i});
        }
        else if(cnt_good){
            yv.push_back({cnt_good, i});
            cnt_good = 0;
        }
    }

    cnt_good = sv;
    for(int i = n - 1; i >= 0; --i){
        if(x[i] <= cnt_good){
            cnt_good -= x[i];
            xv.push_back({x[i], i});
        }
        else if(cnt_good){
            xv.push_back({cnt_good, i});
            cnt_good = 0;
        }
    }
    reverse(all(xv));

    int j = 0;
    ll ans = sv;
    for(int i = 0; i < n; ++i){
        ans -= y[i];
    }
    // cout << ans << " before" << endl;

    for(int i = 0; i < yv.size(); ++i){
        while(yv[i].first > 0){
            if(xv[j].first == 0){
                ++j;
                continue;
            }
            ll take = min(yv[i].first, xv[j].first);
            ans += sgn(-(yv[i].second - xv[j].second)) * take;
            // cout << yv[i].second << " " << xv[j].second << " cmp" << endl;
            yv[i].first -= take;
            xv[j].first -= take;
        }
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for(int i = 0; i < n; ++i)
        cin >> x[i];
    reverse(x, x + n);

    ll sum = 0;
    for(int i = 0; i < n; ++i){
        cin >> y[i];
        sum += y[i];
    }
    reverse(y, y + n);

    // for(int i = 0; i <= sum; ++i){
        // cout << calc(i) << " calc" << endl;
    // }

    ll l = 0, r = sum;
    while((r - l) > 2){
        ll mid1 = (2 * l + r) / 3;
        ll mid2 = (l + 2 * r) / 3;
        if(calc(mid1) > calc(mid2)){
            r = mid2;
        }
        else{
            l = mid1;
        }
    }

    ll score = -INF;
    for(ll val = l; val <= r; ++val){
        chmax(score, calc(val));
    }

    cout << score << "\n";
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'll calc(ll)':
Main.cpp:73:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for(int i = 0; i < yv.size(); ++i){
      |                    ~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...