Submission #1281469

#TimeUsernameProblemLanguageResultExecution timeMemory
1281469StefanSebezPalembang Bridges (APIO15_bridge)C++20
31 / 100
83 ms1564 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
void chmn(ll &x,ll y){x=min(x,y);}
void chmx(ll &x,ll y){x=max(x,y);}
void Unique(vector<ll>&a){sort(a.begin(),a.end());a.resize(unique(a.begin(),a.end())-a.begin());}
const int N=2000,lg=31;
const ll INF=1e18,inf=1e9;
void Solve1(){
    int n;scanf("%i",&n);
    vector<int>vals;
    ll ans=0;
    for(int i=1;i<=n;i++){
        char p,q;int s,t;
        cin>>p>>s>>q>>t;
        if(p==q) ans+=abs(s-t);
        else{
            ans++;
            vals.pb(s);vals.pb(t);
        }
    }
    sort(vals.begin(),vals.end());
    int m=vals.size()/2;
    for(auto i:vals) ans+=abs(i-vals[m]);
    printf("%lld\n",ans);
}

/*struct SegTree{
    int root,nc,lc[N*lg],rc[N*lg];ll sum[N*lg];
    void Update(ll ss,ll se,ll qind,ll x){Update(root,ss,se,qind,x);}
    void Update(int &c,ll ss,ll se,ll qind,ll x){
        if(!c)c=++nc;
        if(ss==se){sum[c]+=x;return;}
        ll mid=ss+se>>1;
        if(qind<=mid) Update(lc[c],ss,mid,qind,x);
        else Update(rc[c],mid+1,se,qind,x);
        sum[c]=sum[lc[c]]+sum[rc[c]];
    }
    ll Get(ll ss,ll se,ll qs,ll qe){return Get(root,ss,se,qs,qe);}
    ll Get(int c,ll ss,ll se,ll qs,ll qe){
        if(qs>qe||qe<ss||se<qs)return 0;
        if(qs<=ss&&se<=qe)return sum[c];
        ll mid=ss+se>>1;return Get(lc[c],ss,mid,qs,qe)+Get(rc[c],mid+1,se,qs,qe);
    }
    void Clear(){for(int i=0;i<=nc;i++){lc[i]=rc[i]=sum[i]=root=0;}nc=0;}
}STM[2];*/
struct BIT{
    vector<ll>T,vals;
    void Init(){T.clear();vals.pb(-INF);Unique(vals);T.resize(vals.size());}
    void Ubaci(ll i){vals.pb(i);}
    void Update(ll i,ll x){for(ll j=upper_bound(vals.begin(),vals.end(),i)-vals.begin()-1;j<T.size();j+=j&-j)T[j]+=x;}
    ll Get(ll i){ll x=0;for(ll j=upper_bound(vals.begin(),vals.end(),i)-vals.begin()-1;j>=1;j-=j&-j)x+=T[j];return x;}
    ll Get(ll l,ll r){if(l>r)return 0;return Get(r)-Get(l-1);}
    void Clear(){T.clear();vals.clear();}
}bt[2];
void Solve2(){
    ll n;scanf("%lld",&n);
    vector<ll>vals;
    vector<pair<ll,ll>>a;
    ll ans=0;
    for(ll i=1;i<=n;i++){
        char p,q;ll s,t;
        cin>>p>>s>>q>>t;
        ans+=abs(s-t);
        if(p!=q){
            ans++;
            vals.pb(s);vals.pb(t);
            if(s>t)swap(s,t);
            a.pb({s,t});
        }
    }
    sort(a.begin(),a.end());
    Unique(vals);
    vector<ll>ev[vals.size()+5];
    vector<ll>STL={-INF},prefL={0},STR={-INF},prefR={0};
    for(auto [l,r]:a){
        STL.pb(r);
        STR.pb(l);
        /*STL[0].Update(0,inf,r,1);
        STL[1].Update(0,inf,r,r);
        STR[0].Update(0,inf,l,1);
        STR[1].Update(0,inf,l,l);*/
        ev[lower_bound(vals.begin(),vals.end(),r)-vals.begin()].pb(l);
    }
    sort(STL.begin(),STL.end());
    for(ll i=1;i<STL.size();i++) prefL.pb(prefL.back()+STL[i]);
    sort(STR.begin(),STR.end());
    for(ll i=1;i<STR.size();i++) prefR.pb(prefR.back()+STR[i]);
    for(ll i=0;i<vals.size();i++){auto j=ev[i];sort(j.begin(),j.end()),reverse(j.begin(),j.end());}
    //for(auto [x,y]:a) printf("[%lld %lld] ",x,y);printf("\n");
    //for(auto i:vals) printf("%lld ",i);printf("\n");
    ll res=INF,valL[vals.size()+5]={0},valR[vals.size()+5]={0};
    for(ll i=0;i<vals.size();i++){
        ll x1=vals[i],x2=vals[i];
        ll lb=upper_bound(STL.begin(),STL.end(),x1-1)-STL.begin()-1;
        valL[i]=2*(x1*lb-prefL[lb]);
        lb=lower_bound(STR.begin(),STR.end(),x2+1)-STR.begin();
        valR[i]=2*(prefR.back()-prefR[lb-1]-x2*(prefR.size()-lb));
    }
    for(ll i=0;i<vals.size();i++){
        ll mns=0;//STM[0].Clear();STM[1].Clear();
        for(ll k=0;k<=1;k++){
            bt[k].Clear();
            for(ll j=i;j<vals.size();j++){
                for(auto l:ev[j]){
                    if(l<vals[i]) break;
                    bt[k].Ubaci(l+vals[j]);
                }
            }
            bt[k].Init();
        }
        for(ll j=i;j<vals.size();j++){
            ll x1=vals[i],x2=vals[j];
            /*int lb=upper_bound(STL.begin(),STL.end(),x1-1)-STL.begin()-1;
            //for(auto k:STL) printf("%lld ",k);printf("\n");
            //printf("%lld: %i\n",x1-1,lb);
            ll sum=2*(x1*lb-prefL[lb]);
            lb=lower_bound(STR.begin(),STR.end(),x2+1)-STR.begin();
            //for(auto k:STR) printf("%lld ",k);printf("\n");
            //printf("%lld: %i\n",x2+1,lb);
            sum+=2*(prefR.back()-prefR[lb-1]-x2*(prefR.size()-lb));
            //ll sum=2*(x1*STL[0].Get(0,inf,0,x1-1)-STL[1].Get(0,inf,0,x1-1));
            //sum+=2*(STR[1].Get(0,inf,x2+1,inf)-x2*STR[0].Get(0,inf,x2+1,inf));*/
            ll sum=valL[i]+valR[j];

            for(auto l:ev[j]){
                if(l<x1) break;
                mns+=x2-l;
                bt[0].Update(l+x2,1);
                bt[1].Update(l+x2,l+x2);
                //STM[0].Update(0,2*inf,l+x2,1);
                //STM[1].Update(0,2*inf,l+x2,l+x2);
            }
            sum-=mns;
            sum+=bt[1].Get(2*x1,x1+x2)-2*x1*bt[0].Get(2*x1,x1+x2);
            sum+=2*x2*bt[0].Get(x1+x2+1,2*x2)-bt[1].Get(x1+x2+1,2*x2);
            //sum+=STM[1].Get(0,2*inf,2*x1,x1+x2)-2*x1*STM[0].Get(0,2*inf,2*x1,x1+x2);
            //sum+=2*x2*STM[0].Get(0,2*inf,x1+x2+1,2*x2)-STM[1].Get(0,2*inf,x1+x2+1,2*x2);
            chmn(res,sum);
        }
    }
    //printf("%lld\n",res);
    /*for(int i=0;i<a.size();i++){
        ll sum=0;
        vector<ll>temp;
        for(int j=0;j<=i;j++) temp.pb(a[j].fi),temp.pb(a[j].se);
        sort(temp.begin(),temp.end());
        ll v=temp[temp.size()/2];
        for(auto j:temp) sum+=abs(j-v);

        temp.clear();
        for(int j=i+1;j<a.size();j++) temp.pb(a[j].fi),temp.pb(a[j].se);
        sort(temp.begin(),temp.end());
        v=temp[temp.size()/2];
        for(auto j:temp) sum+=abs(j-v);
        chmn(res,sum);
    }*/
    /*for(auto i:vals){
        for(auto j:vals){
            ll sum=0;
            for(auto [x,y]:a){
                sum+=min(abs(x-i)+abs(y-i),abs(x-j)+abs(y-j));
            }
            //if(res>sum) printf("%lld %lld\n",i,j);
            chmn(res,sum);
        }
    }*/
    if(vals.empty()) res=0;
    ans+=res;
    printf("%lld\n",ans);
}
int main(){
    int KK;scanf("%i",&KK);
    if(KK==1) Solve1();
    else Solve2();
    return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'void Solve1()':
bridge.cpp:15:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     int n;scanf("%i",&n);
      |           ~~~~~^~~~~~~~~
bridge.cpp: In function 'void Solve2()':
bridge.cpp:62:15: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |     ll n;scanf("%lld",&n);
      |          ~~~~~^~~~~~~~~~~
bridge.cpp: In function 'int main()':
bridge.cpp:178:17: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  178 |     int KK;scanf("%i",&KK);
      |            ~~~~~^~~~~~~~~~
#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...