Submission #1181250

#TimeUsernameProblemLanguageResultExecution timeMemory
1181250asli_bgPalembang Bridges (APIO15_bridge)C++20
22 / 100
344 ms35544 KiB
#include<bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

#define int long long

typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<int> vi;
typedef vector<bool> vb;

#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)

#define all(x) x.begin(),x.end()
#define fi first
#define se second
#define pb push_back
#define sp <<" "<<

#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;

#define DEBUG(x) cout<<#x sp x<<endl;
#define carp(x,y) ((x%MOD)*(y%MOD))%MOD
#define topla(x,y) ((x%MOD)+(y%MOD))%MOD
#define mid (l+r)/2

const int MAXN=3e4+5;
const int MOD=1e9+7;
const int INF=1e18;

map<int,vi> tut;

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n,k;
    cin>>k>>n;
    vector<char> p(n+1), q(n+1);
    vi s(n+1), t(n+1);

    set<int> cur;

    int ans=0;
    int top=0;
    int tt=0;
    FORE(i,1,n+1){
        cin>>p[i]>>s[i]>>q[i]>>t[i];
        cur.insert(s[i]);
        cur.insert(t[i]);

        if(p[i]!=q[i]){
            top+=t[i]+s[i];
            tt+=2;
            tut[s[i]].pb(i);
            tut[t[i]].pb(i);
        }
        else ans+=abs(t[i]-s[i]);
    }

    vi vec;
    for(auto el:cur) vec.pb(el);

    int sz=vec.size();

    int res=INF;
    if(k<=2){
        int say=0;
        int tane=0;
        FOR(i,sz){ //vec[i] de ise köprü
            say+=tut[vec[i]].size()*vec[i];
            tane+=tut[vec[i]].size();
            res=min(res,tane*vec[i]-say+(top-say)-((tt-tane)*vec[i]));
        }
    }   

    if(k==2){
        int say,say2,tane,tane2;
        say=say2=tane=tane2=0;
        set<int> bir;
        FOR(i,sz){ //vec[i] de ise köprü
            say+=tut[vec[i]].size()*vec[i];
            tane+=tut[vec[i]].size();

            for(auto el:tut[vec[i]]){
                if(bir.count(el)){
                    say2-=t[el];
                    tane2--;
                }
                else{
                    say2+=t[el];
                    tane2++;
                }
                bir.insert(el);
            }

            int deg=tane*vec[i]-say+say2-(tane2*vec[i]);

            //cout<<"here" sp vec[i] sp say sp tane<<endl;

            int say3,tane3;
            say3=tane3=0;

            set<int> iki;

            FORE(j,i+1,sz){
                for(auto el:tut[vec[j]]){
                    if(bir.count(el)) continue;
                    if(iki.count(el)){
                        //ya 1. ya 2. köprüye gidecekler
                        if(t[el]+s[el]-2*vec[i]<2*vec[j]-(t[el]+s[el])){
                            say2+=vec[j];
                            tane2++;
                        }
                        else{
                            say3+=vec[j];
                            tane3++;
                        }
                    }
                    else{
                        say3+=vec[j];
                        tane3++;
                    }
                }

                int deg2=tane3*vec[j]-say3;
                int deg3=(top-say-say2-say3)-(tt-tane-tane2-tane3)*vec[j];

                res=min(res,deg+deg2+deg3);
            }
        }   
    }

    cout<<ans+res+tt/2<<endl;
} 
#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...