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