Submission #1221427

#TimeUsernameProblemLanguageResultExecution timeMemory
1221427sleepntsheepToilets (JOI16_toilets)C++20
36 / 100
975 ms22496 KiB
#include <cstdio> #include <set> #include <deque> #include <iostream> #include <string> #include <stack> #include <algorithm> #include <cstring> using namespace std; #define N 200005 int sub1() { int n, answer, perm[22]; char s[22], s0[22]; stack<int> sm,sf; answer = 1e9; scanf("%d%*d%s%*d", &n, s); int count_m = count(s, s + n + n, 'M'); for (int i = 2 * n; i--; ) { if (s[i] == 'M') sm.push(i); else sf.push(i); } memcpy(s0, s, sizeof s); for (int m = 0; m < (1 << (n << 1)); ++m) { if (__builtin_popcount(m) != count_m) continue; memcpy(s, s0, sizeof s); for (int j = 0; j < 2 * n; ++j) { if ((m >> j) & 1) s[j] = 'M'; else s[j] = 'F'; } int ok = 1; for (int j = 0; j < 2 * n; j += 2) { if (s[j] == s[j + 1] and s[j] == 'M') { auto it = find(s + j, s + 2 * n, 'F'); if (it == 2 * n + s) { ok = 0; break; } rotate(s + j + 1, it, it + 1); } } if (!ok) continue; auto sf_ = sf, sm_ = sm; for (int j = 0; j < 2 * n; ++j) { if ((m >> j) & 1) perm[j] = sm_.top(), sm_.pop(); else perm[j] = sf_.top(), sf_.pop(); } int here = 0; for (int i = 0; i < 2 * n; ++i) { int x = 0; for (int j = 0; j < i; ++j) x += perm[j] > perm[i]; here = max(here, x); } answer = min(answer, here); } printf("%d\n", answer >= 1e9 ? -1 : answer); exit(0); return 0; } bool String_IsUsable(const string &s) { int n = s.size() >>1; int i_, i; set<pair<long long, char> > st; set<long long> sf; for (i_ = 0; i_ < 2 * n; ++i_) { st.insert(make_pair(i_ * 300000ll, s[i_])); if (s[i_] == 'F') sf.insert(i_ * 300000ll); } //printf(" Checking %s\n", s.c_str()); while (st.size()) { auto x1 = *st.begin(); st.erase(st.begin()); auto x2 = *st.begin(); st.erase(st.begin()); if (x1.second == 'M' and x2.second == 'M') { while (sf.size() && *sf.begin() < x2.first) sf.erase(sf.begin()); if (sf.empty()) return false; //printf(" Need help \n"); long long y = *sf.begin(); //printf(" %lld -> %lld\n", x2.first, y); sf.erase(y); st.insert(x2); st.erase(make_pair(y, 'F')); } else { } } return true; } namespace sub2 { int n, _; string s0; int check(int loose) { string s; deque<pair<int, int> > wom; int miku = 0; for (int i = 0; i < 2 * n; ++i) { if (s0[i] == 'M') { s += 'M'; ++miku; while (wom.size() and miku == wom[0].first) { s += 'F'; wom.pop_front(); } } else wom.push_back(make_pair(miku + loose, i)); while (wom.size() and miku == wom[0].first) { s += 'F'; wom.pop_front(); } } while (wom.size()) s += 'F', wom.pop_back(); //printf(" Loose = %d, built %s, usable = %d\n", loose,s.c_str(), (int)String_IsUsable(s)); return (String_IsUsable(s)); } void Main() { cin >> n >> _ >> s0 >> _; int x = n; for (int j = 1 << 19; j >>= 1;) { if (x >= j && check(x - j)) x -= j; } if (x == n) cout << "-1\n"; else cout << x << '\n'; } } int main() { sub2::Main(); }

Compilation message (stderr)

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