Submission #366310

#TimeUsernameProblemLanguageResultExecution timeMemory
366310arman_ferdousMonochrome Points (JOI20_monochrome)C++17
100 / 100
1018 ms9332 KiB
#include <bits/stdc++.h>
using namespace std;

#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>;

const int N = 5e5+10;

int n;
char s[N];

struct BIT {
  int b[N];
  void upd(int pos, int x) { while(pos < N) b[pos] += x, pos += pos&-pos; }
  ll get(int pos, int r = 0) { while(pos) r += b[pos], pos -= pos&-pos; return r; }
}bit;

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

int l[N], r[N];

ll getcost() {
  for(auto it : segs) {
    l[it.se] = it.fi;
    r[it.fi] = it.se;
    l[it.fi] = r[it.se] = 0;
  }

  ll ret = 0;
  for(int i = 1; i <= n + n; i++) {
    if(l[i] == 0) {
      ret += bit.get(r[i] - 1);
      bit.upd(r[i], +1);
    }
    else bit.upd(i, -1);
  }
  return ret;
}

ll solve(int p, int q) {
  segs.clear();
  for(int i = 0; i < n + n; i++) vis[i] = 0;
  segs.pb({p + 1, q + 1});
  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) + 1, max(i, j) + 1});
    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("%lld %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 >= 10) {
    int mid1 = (lo + lo + hi) / 3;
    int mid2 = (lo + hi + hi) / 3;

    ll f1 = solve(0, pos[mid1]);
    ll 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:84:13: warning: format '%lld' expects argument of type 'long long int*', but argument 2 has type 'int*' [-Wformat=]
   84 |   scanf("%lld %s", &n, s);
      |          ~~~^      ~~
      |             |      |
      |             |      int*
      |             long long int*
      |          %d
monochrome.cpp:84:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   84 |   scanf("%lld %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...