Submission #366301

#TimeUsernameProblemLanguageResultExecution timeMemory
366301arman_ferdousMonochrome Points (JOI20_monochrome)C++17
35 / 100
2051 ms19176 KiB
#include <bits/stdc++.h>
#include <bits/extc++.h>

using namespace std;
using namespace __gnu_pbds;

#define fi first
#define se second
#define pb push_back
#define sz(v) (int)v.size()
#define all(v) v.begin(),v.end()
#define dbg(x) cerr << #x << " is " << x << "\n";
#define cum cerr << "came\n";

using ll = long long;
using ii = pair<ll,ll>;
using oset = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;

const int N = 4e5+10;

int n;
char s[N];

struct event {
  int x, y;
  int type;
  bool operator<(event o) const {
    return x < o.x;
  }
};
vector<event> e;
oset os;

int vis[N];
vector<pair<int, int>> segs;

ll getcost() {
  e.clear();
  for(auto it : segs) {
    e.pb({it.fi, it.se, 0});
    e.pb({it.se, it.fi, 1});
  } sort(all(e));

  ll ret = 0;
  for(auto i : e) {
    if(i.type == 0) {
      ret += os.order_of_key(i.y);
      os.insert(i.y);
    }
    else {
      os.erase(i.x);
    }
  }
  os.clear();
  return ret;
}

ll solve(int p, int q) {
  segs.clear();
  for(int i = 0; i < n + n; i++) vis[i] = 0;
  segs.pb({p, q});
  vis[p] = vis[q] = 1;

  int matched = 1;
  int i = p, j = q;
  while(matched < n) {
    while(vis[i] || s[i] != s[p]) {
      i++;
      if(i == n + n) i = 0;
    }

    while(s[i] == s[j] || vis[j]) {
      j++; 
      if(j == n + n) j = 0;
    }

    vis[j] = vis[i] = 1;
    segs.pb({min(i, j), max(i, j)});
    matched++;
  }

  // for(auto it : segs)
  //   cout << it.fi + 1 << " " << it.se + 1 << endl;
  // cout << "cost = " << getcost() << endl;

  return getcost();
}

vector<int> pos;

int main() {
  ll ans = 0;
  scanf("%d %s", &n, s);
  for(int i = 1; i < n + n; i++) if(s[0] != s[i])
    pos.pb(i);

  int lo = 0, hi = sz(pos) - 1;
  while(hi - lo >= 3) {
    int mid1 = (lo + lo + hi) / 3;
    int mid2 = (lo + hi + hi) / 3;

    int f1 = solve(0, pos[mid1]);
    int f2 = solve(0, pos[mid2]);

    if(f1 >= f2) hi = mid2 - 1;
    else lo = mid1 + 1;
  }
  for(int i = lo; i <= hi; i++) 
    ans = max(ans, solve(0, pos[i]));

  printf("%lld\n", ans);
  return 0;
}

Compilation message (stderr)

monochrome.cpp: In function 'int main()':
monochrome.cpp:93:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   93 |   scanf("%d %s", &n, s);
      |   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...