Submission #653452

#TimeUsernameProblemLanguageResultExecution timeMemory
653452ayallaPalembang Bridges (APIO15_bridge)C++14
100 / 100
1795 ms62180 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

template <class T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define int long long int
#define endl '\n'
#define pb push_back
#define pi pair<int, int>
#define pii pair<int, pi>
#define fir first
#define sec second
#define MAXN 200005
#define mod 998244353

struct segtree
{
  int n;
  vector<int> seg;

  int neutral()
  {
    return 0;
  }
  int merge(int a, int b)
  {
    return a + b;
  }
  segtree() {}
  segtree(int sz)
  {
    n = 1;
    while (n < sz)
      n <<= 1;
    seg.assign(n << 1, neutral());
  }
  void upd(int i, int value)
  {
    seg[i += n] += value;
    for (i >>= 1; i; i >>= 1)
      seg[i] = merge(seg[i << 1], seg[(i << 1) | 1]);
  }
  int qry(int l, int r)
  {
    int ansl = neutral(), ansr = neutral();
    for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1)
    {
      if (l & 1)
        ansl = merge(ansl, seg[l++]);
      if (r & 1)
        ansr = merge(seg[--r], ansr);
    }
    return merge(ansl, ansr);
  }
};
struct crazy_median
{
  int n;
  segtree st, st2;
  ordered_set<pi> s;
  map<int, int> mp;
  vector<int> vals;

  crazy_median(vector<int> v)
  {
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    vals = v;
    n = vals.size();
    st = segtree(n);
    st2 = segtree(n);
  }
  void add(int i)
  {
    int pos = lower_bound(vals.begin(), vals.end(), i) - vals.begin();
    st.upd(pos, 1);
    st2.upd(pos, i);
    s.insert({i, mp[i]});
    mp[i]++;
  }
  void rem(int i)
  {
    int pos = lower_bound(vals.begin(), vals.end(), i) - vals.begin();
    st.upd(pos, -1);
    st2.upd(pos, -i);
    mp[i]--;
    s.erase({i, mp[i]});
  }
  int calc(int x)
  {
    int ans = 0;
    int pos = lower_bound(vals.begin(), vals.end(), x) - vals.begin();
    ans += (st.qry(0, pos - 1) * x) - st2.qry(0, pos - 1);
    ans += st2.qry(pos + 1, n - 1) - (st.qry(pos + 1, n - 1) * x);
    return ans;
  }
  int solve()
  {
    int sz = s.size();
    int x = (*s.find_by_order(sz / 2)).fir;
    int ans = calc(x);
    return ans;
  }
};
void solve1(int n, int k)
{
  int ans = 0;
  vector<int> pts;
  for (int i = 0; i < n; i++)
  {
    char c1, c2;
    int a, b;
    cin >> c1 >> a >> c2 >> b;
    if (c1 == c2)
    {
      ans += abs(a - b);
    }
    else
    {
      ans++;
      pts.pb(a);
      pts.pb(b);
    }
  }
  if (!pts.size())
  {
    cout << ans << endl;
    return;
  }
  crazy_median cm(pts);
  for (auto const &i : pts)
    cm.add(i);
  ans += cm.solve();
  cout << ans << endl;
}
void solve2(int n, int k)
{
  vector<pi> aux;
  vector<pi> v;
  int ans = 0;
  for (int i = 0; i < n; i++)
  {
    char c1, c2;
    int a, b;
    cin >> c1 >> a >> c2 >> b;
    v.pb({a, b});
    if (c1 == c2)
    {
      ans += abs(a - b);
    }
    else
    {
      ans++;
      aux.pb({a + b, i});
    }
  }
  if (!aux.size())
  {
    cout << ans << endl;
    return;
  }
  sort(aux.begin(), aux.end());
  vector<int> pts;
  for (auto const &i : aux)
  {
    pts.pb(v[i.sec].fir);
    pts.pb(v[i.sec].sec);
  }
  crazy_median cm(pts), cm2(pts);
  for (auto const &i : pts)
  {
    cm.add(i);
  }
  int need = ans;
  vector<int> pts2;
  ans += cm.solve();
  while (pts.size() > 2)
  {
    cm.rem(pts.back());
    cm2.add(pts.back());
    pts.pop_back();
    cm.rem(pts.back());
    cm2.add(pts.back());
    pts.pop_back();
    int curr = need + cm.solve() + cm2.solve();
    ans = min(ans, curr);
  }
  cout << ans << endl;
}
signed main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, k;
  cin >> k >> n;
  if (k == 1)
    solve1(n, k);
  else
    solve2(n, k);
  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...