Submission #961871

#TimeUsernameProblemLanguageResultExecution timeMemory
961871vjudge1Palembang Bridges (APIO15_bridge)C++14
100 / 100
266 ms13512 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long

int k, n;

namespace sub12{
   void solve(){
      vector<int> v;
      int ans=0;
      for (int i=1; i<=n; ++i){
         char c1, c2; int p1, p2;
         cin >> c1 >> p1 >> c2 >> p2;
         if (c1==c2) ans+=abs(p1-p2);
         else v.push_back(p1), v.push_back(p2);
      }
      sort(v.begin(), v.end());
      if (v.size()){
         int pos=v[(int)v.size()/2];
         for (int i:v) ans+=abs(pos-i);
      }
      cout << ans+(int)v.size()/2 << '\n';
   }
}

struct Median{
   multiset<int, greater<int>> stl;
   int suml;
   multiset<int> str;
   int sumr;
   void adjust(){
      while ((int)stl.size()-(int)str.size()>1){
         int tmp=*stl.begin();
         str.insert(tmp); sumr+=tmp;
         stl.erase(stl.begin()); suml-=tmp;
      }
      while ((int)str.size()-(int)stl.size()>0){
         int tmp=*str.begin();
         stl.insert(tmp); suml+=tmp;
         str.erase(str.begin()); sumr-=tmp;
      }
   }
   void insert(int x){
      if (stl.empty() || *stl.begin()>=x) stl.insert(x), suml+=x;
      else str.insert(x), sumr+=x;
      adjust();
   }
   void erase(int x){
      if (stl.find(x)!=stl.end()) stl.erase(stl.find(x)), suml-=x;
      else str.erase(str.find(x)), sumr-=x;
      adjust();
   }
   int calc(){
      if (stl.empty()) return 0;
      int median=*stl.begin();
      return sumr-median*((int)str.size())+median*((int)stl.size())-suml;
   }
};

namespace sub345{
   Median st1, st2;
   void solve(){
      int add=0;
      vector<pair<int, int>> v;
      for (int i=1; i<=n; ++i){
         char c1, c2; int p1, p2;
         cin >> c1 >> p1 >> c2 >> p2;
         if (c1==c2) add+=abs(p1-p2);
         else v.emplace_back(p1, p2);
      }
      sort(v.begin(), v.end(), [&](pair<int, int> x, pair<int, int> y){
         return x.first+x.second<y.first+y.second;
      }); 
      int ans=1e18;
      for (auto &i:v) st2.insert(i.first), st2.insert(i.second);
      for (int i=0; i<=(int)v.size(); ++i){
         ans=min(ans, st1.calc()+st2.calc());
         if (i<(int)v.size()){
            st2.erase(v[i].first);
            st2.erase(v[i].second);
            st1.insert(v[i].first);
            st1.insert(v[i].second);
         }
      }
      cout << add+ans+(int)v.size() << '\n';
   }
}

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> k >> n;
   if (k==1) sub12::solve();
   else sub345::solve();
   return 0;
}
#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...