제출 #487345

#제출 시각아이디문제언어결과실행 시간메모리
487345leakedPalembang Bridges (APIO15_bridge)C++14
100 / 100
1156 ms2280 KiB
#include <bits/stdc++.h>

#define f first
#define s second
#define pb push_back
#define vec vector
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define pw(x) (1LL<<(x))
#define fast_iati ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;
template <class T> bool umin(T &a,const T &b){return (a>b?a=b,1:0);}
template <class T> bool umax(T &a,const T &b){return (a<b?a=b,1:0);}
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll inf=1e18;
signed main(){
    fast_iati;

    int k,n;
    cin>>k>>n;
    vec<int>l,r;
    ll ans=0;
    vec<int>kek;
    for(int i=0;i<n;i++){
        char f,s;
        int x,y;
        cin>>f>>x>>s>>y;
        if(f==s) ans+=abs(x-y);
        else{
            if(x>y) swap(x,y);
            l.pb(x);r.pb(y);
        }
    }
    n=sz(l);
    for(int i=0;i<n;i++){
        kek.pb(l[i]);
        kek.pb(r[i]);
    }
    sort(all(kek));kek.erase(unique(all(kek)),kek.end());
    if(k==1){
        if(!sz(kek)){
            cout<<ans;
            return 0;
        }
        auto f=[&](int i){
            int x=kek[i];
            ll me=0;
            for(int k=0;k<n;k++){
                me+=abs(x-l[k])+abs(x-r[k])+1;
            }
            return me;
        };
        int tl=0,tr=sz(kek)-1;
        while(tr-tl>=3){
            int t1=tl+(tr-tl)/3;
            int t2=tr-(tr-tl)/3;
            if(f(t1)<f(t2)) tr=t2;
            else tl=t1;
        }
        ll mn=inf;
        for(int i=tl;i<=tr;i++)
            umin(mn,f(i));
        cout<<ans+mn;
    }
    else{
        if(!sz(kek)){
            cout<<ans;
            return 0;
        }
        auto f1=[&](int i,int j){
            int x=kek[i],y=kek[j];
            ll me=0;
            for(int k=0;k<n;k++){
                me+=min(abs(y-l[k])+abs(y-r[k]),abs(x-l[k])+abs(x-r[k]))+1;
            }
            return me;
        };
        auto f=[&](int i){
            int tl=0,tr=sz(kek)-1;
            while(tr-tl>=10){
                int t1=tl+(tr-tl)/3;
                int t2=tr-(tr-tl)/3;
                if(f1(i,t1)<f1(i,t2)) tr=t2;
                else tl=t1;
            }
            ll mn=inf;
            for(int j=tl;j<=tr;j++) umin(mn,f1(i,j));
            return mn;
        };
        int tl=0,tr=sz(kek)-1;
        while(tr-tl>=10){
            int t1=tl+(tr-tl)/3;
            int t2=tr-(tr-tl)/3;
            if(f(t1)<f(t2)) tr=t2;
            else tl=t1;
        }
        ll mn=inf;
        for(int i=tl;i<=tr;i++)
            umin(mn,f(i));
        cout<<ans+mn;
    }
    return 0;
}
/*
2 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7
*/
#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...