Submission #1054412

#TimeUsernameProblemLanguageResultExecution timeMemory
1054412KebabuVaikis15Palembang Bridges (APIO15_bridge)C++14
22 / 100
65 ms9668 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN=100000;
long long k, n, suma=0, ats=LONG_MAX;
char a[MAXN], b[MAXN];
long long x[MAXN], y[MAXN];
vector<tuple<long long, long long, long long>> keliai;
long long kPtr=0, vPtr=1, dPtr=0;
long long kKairej=0, kDesinej=0, dKairej=0, dDesinej;
bool kairej[MAXN];

void tinkintKaire(long long kPos)/////////////////////////////
{
    suma+=2ll*(kPos-get<0>(keliai[kPtr]));
    kDesinej++;
    ///Lyg tiesiog atsiranda vienas?
    ///Problemos cia?
//    cout<<"Pradedam "<<dPtr<<endl;
    while (kKairej<kDesinej)
    {
        long long pradPos=get<0>(keliai[kPtr]);
        kPtr++;
//        cout<<"K"<<kPtr<<endl;
//        cout<<dPtr<<endl;
//        cout<<suma<<"->";
        suma-=2ll*(get<0>(keliai[kPtr])-pradPos)*(kDesinej-kKairej);
//        cout<<suma<<endl;
        if (get<1>(keliai[kPtr])==0)
            kDesinej--;
        else
            kKairej++;
    }
}

void tinkintDesine(long long dPos)/////////////////////////////
{
    if (dPos<=get<0>(keliai[dPtr]))
        dKairej--;
    ///Problemos cia?
//    cout<<"Pradedam "<<dPtr<<endl;
    while (dKairej<dDesinej)
    {
        long long pradPos=get<0>(keliai[dPtr]);
        dPtr++;
//        cout<<dPtr;
        while(kairej[get<2>(keliai[dPtr])])
        {
//            cout<<", "<<dPtr;
            dPtr++;
        }
//        cout<<"D"<<dPtr<<endl;
//        cout<<endl;
//        cout<<suma<<"->";
        suma-=2ll*(get<0>(keliai[dPtr])-pradPos)*(dDesinej-dKairej);
//        cout<<suma<<endl;
        if (get<1>(keliai[dPtr])==0)
            dDesinej--;
        else
            dKairej++;
    }
}

int main()
{
    cin>>k>>n;
    for (int i=0; i<n; i++)
    {
        cin>>a[i]>>x[i]>>b[i]>>y[i];
        if (x[i]>y[i])
                swap(x[i], y[i]);
        suma+=y[i]-x[i];
        if (a[i]!=b[i])
        {
            suma++;
            keliai.push_back(make_tuple(x[i], 0, i));
            keliai.push_back(make_tuple(y[i], 1, i));
        }
    }
    keliai.push_back(make_tuple(0, 0, 0));
    sort(keliai.begin(), keliai.end());
//    cout<<suma<<endl;
//    for (auto i:keliai)
//        cout<<get<0>(i)<<' '<<get<1>(i)<<' '<<get<2>(i)<<endl;
    for (int i=0; i<n; i++)
        if (a[i]!=b[i])
            suma+=2ll*(x[i]-get<0>(keliai[0]));
//    cout<<suma<<endl;
    ats=suma;
    dDesinej=keliai.size()/2;
    tinkintDesine(LONG_MAX);
    if (k==1)
    {
        cout<<suma<<endl;
        return 0;
    }
    while (vPtr!=2*n)
    {
        vPtr++;
        while (vPtr<2*n && get<1>(keliai[vPtr])!=0)
            vPtr++;
//        cout<<"V"<<vPtr<<endl;
        if (vPtr==2*n)
            break;
            ///Tiesiog pradinis, viskas tvarkoj?
        kairej[get<2>(keliai[vPtr])]=1;
        tinkintKaire(get<0>(keliai[vPtr]));
        tinkintDesine(y[get<1>(keliai[vPtr])]);
        ats=min(ats, suma);
    }
    cout<<ats<<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...