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...