Submission #660831

#TimeUsernameProblemLanguageResultExecution timeMemory
660831alexander707070Palembang Bridges (APIO15_bridge)C++14
22 / 100
43 ms4748 KiB
#include<bits/stdc++.h>
#define MAXN 100007
using namespace std;

const long long inf=1e15;

struct person{
    char s;
    int from;
    char t;
    int to;
}a[MAXN];

struct event{
    int pos;
    int id,type;

    inline friend bool operator < (event fr,event sc){
        return fr.pos<sc.pos;
    }
};

int n,k,br[MAXN],br2[MAXN],l,r,id;
char type;
long long sum,last,lt,rt,cntl,cntr,ans;
long long sum1,sum2,mid;
vector<event> v;
pair<int,int> curr;
set< pair<int,int> > s1,s2;
set< pair<int,int> >::iterator it;

void solve1(){
    ans=inf;

    if(v.empty()){
        cout<<sum<<"\n";
        return;
    }

    last=v[int(v.size())-1].pos;
    for(int i=int(v.size())-1;i>=0;i--){
        rt+=(last-v[i].pos)*cntr;
        br[v[i].id]++;
        if(br[v[i].id]==2){
            cntr+=2;
            rt+=a[v[i].id].from+a[v[i].id].to-2*v[i].pos;
            rt++;
        }
        last=v[i].pos;
    }

    last=v[0].pos;
    l=r=0;
    for(int i=0;i<v.size();i++){
        lt+=(v[i].pos-last)*cntl;
        rt-=(v[i].pos-last)*cntr;

        br[v[i].id]--;
        if(br[v[i].id]==1){
            rt-=abs(a[v[i].id].from-a[v[i].id].to); cntr-=2; rt--;
            sum+=abs(a[v[i].id].from-a[v[i].id].to)+1;
        }else{
            sum-=abs(a[v[i].id].from-a[v[i].id].to)+1;
            lt+=abs(a[v[i].id].from-a[v[i].id].to); cntl+=2;
            lt++;
        }

        ans=min(ans,lt+rt+sum);
        last=v[i].pos;
    }

    cout<<ans<<"\n";
}

void addleft(long long val,int id){
    s1.insert({val,id});
    sum1+=val;
}

void remleft(){
    it=s1.end(); it--;
    curr=*it;
    sum1-=curr.first;
    s1.erase(it);    
}

void addright(long long val,int id){
    s2.insert({val,id});
    sum2+=val;
}

void remright(){
    it=s2.begin();
    curr=*it;
    sum2-=curr.first;
    s2.erase(it);    
}

void balance(long long e,long long t){
    while(!s2.empty()){
        it=s2.begin();
        curr=*it;
        if(curr.first>e+t)break;
        addleft(curr.first,curr.second);
        remright();   
    }

    while(!s1.empty()){
        it=s1.end(); it--;
        curr=*it;
        if(curr.first<=e+t)break;
        addright(curr.first,curr.second);
        remleft(); 
    }
}

void moveright(){
    br[v[r].id]--;
    if(br[v[r].id]==1){
        rt-=abs(a[v[r].id].from-a[v[r].id].to); cntr-=2; rt--;
        sum+=abs(a[v[r].id].from-a[v[r].id].to)+1;
    }else if(br2[v[r].id]==0){
        addleft(a[v[r].id].from+a[v[r].id].to,v[r].id);
        balance(v[l].pos,v[r].pos);
    }

    last=v[r].pos; r++;
    rt-=(v[r].pos-last)*cntr;
}

void moveleft(){
    last=v[r].pos; r--;
    rt+=(last-v[r].pos)*cntr;
    br[v[r].id]++;
    if(br[v[r].id]==2){

        if(s1.find({a[v[r].id].from+a[v[r].id].to,v[r].id})!=s1.end()){
            sum1-=a[v[r].id].from+a[v[r].id].to;
            s1.erase({a[v[r].id].from+a[v[r].id].to,v[r].id});
        }
        if(s2.find({a[v[r].id].from+a[v[r].id].to,v[r].id})!=s2.end()){
            sum2-=a[v[r].id].from+a[v[r].id].to;
            s2.erase({a[v[r].id].from+a[v[r].id].to,v[r].id});
        }

        cntr+=2;
        rt+=a[v[r].id].from+a[v[r].id].to-2*v[r].pos;
        rt++;
    }
}

void solve2(){
    ans=inf;

    if(v.empty()){
        cout<<sum<<"\n";
        return;
    }

    last=v[int(v.size())-1].pos;
    for(int i=int(v.size())-1;i>=1;i--){
        rt+=(last-v[i].pos)*cntr;
        br[v[i].id]++;
        if(br[v[i].id]==2){
            cntr+=2;
            rt+=a[v[i].id].from+a[v[i].id].to-2*v[i].pos;
            rt++;
        }
        last=v[i].pos;
    }

    last=v[0].pos;
    l=0; r=1;

    for(int i=0;i<v.size();i++){
        l=i;
        lt+=(v[i].pos-last)*cntl;
 
        br2[v[i].id]++;
        if(br2[v[i].id]==1){
            sum+=abs(a[v[i].id].from-a[v[i].id].to)+1;
        }else{
            sum-=abs(a[v[i].id].from-a[v[i].id].to)+1;
            lt+=abs(a[v[i].id].from-a[v[i].id].to); cntl+=2;
            lt++;
        }

        for(int f=i+1;f<v.size();f++){
            mid=sum1-int(s1.size())*v[l].pos*2+2*int(s2.size())*v[r].pos-sum2+int(s1.size())+int(s2.size());
            //cout<<l<<" "<<r<<" "<<lt<<" "<<mid<<" "<<rt<<" "<<sum<<"\n";
            ans=min(ans,lt+rt+mid+sum);
            if(f<v.size()-1)moveright();
        }
        for(int f=i+2;f<v.size();f++){
            moveleft();
        }
    }

    cout<<ans<<"\n";
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>k>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].s>>a[i].from>>a[i].t>>a[i].to;
        if(a[i].s==a[i].t){
            sum+=abs(a[i].from-a[i].to);
        }else{
            v.push_back({a[i].from,i,1});
            v.push_back({a[i].to,i,2});
        }
    }

    sort(v.begin(),v.end());

    if(k==1){
        solve1();
    }else{
        solve2();
    }

    return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'void solve1()':
bridge.cpp:54:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |     for(int i=0;i<v.size();i++){
      |                 ~^~~~~~~~~
bridge.cpp: In function 'void solve2()':
bridge.cpp:175:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  175 |     for(int i=0;i<v.size();i++){
      |                 ~^~~~~~~~~
bridge.cpp:188:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  188 |         for(int f=i+1;f<v.size();f++){
      |                       ~^~~~~~~~~
bridge.cpp:192:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  192 |             if(f<v.size()-1)moveright();
      |                ~^~~~~~~~~~~
bridge.cpp:194:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<event>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  194 |         for(int f=i+2;f<v.size();f++){
      |                       ~^~~~~~~~~
#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...