Submission #1181710

#TimeUsernameProblemLanguageResultExecution timeMemory
1181710miniobModern Machine (JOI23_ho_t5)C++20
37 / 100
549 ms59372 KiB
#include <bits/stdc++.h> using namespace std; int gdzie[120007]; int n; bool debug = false; bool debug2 = false; struct przedzial { int l, r, ile; bool operator < (przedzial a) const { return l < a.l; } }; vector<przedzial> drz[262150]; vector<przedzial> lacz_przedzialy(const vector<przedzial>& pierwszy, const vector<przedzial>& drugi) { vector<przedzial> wynik; /*przedzial szukane; szukane.l = 2; szukane.r = 1; szukane.ile = 2;*/ if (pierwszy.size() == 0) { wynik = drugi; return wynik; } if (drugi.size() == 0) { wynik = pierwszy; return wynik; } for (auto x : pierwszy) { int nowel, nower; nowel = (x.l + x.ile) % (n + 1); nower = (x.r + x.ile) % (n + 1); if(debug) { cout << "nowe: " << nowel << " " << nower << endl; } if (nowel <= nower) { przedzial tempo; tempo.l = nowel; tempo.r = -1; auto it = --upper_bound(drugi.begin(), drugi.end(), tempo); /*if (it != drugi.begin()) { it--; }*/ if(debug) { cout << "wyw " << nowel << " " << nower << " " << x.ile << endl; } while (it != drugi.end() && nowel <= nower) { if(debug) { cout << "cur " << nowel << " " << nower << endl; cout << "it " << it->l << " " << it->r << " " << it->ile << endl; } int nowel2 = max(nowel, it->l); int nower2 = min(nower, it->r); nowel = nower2 + 1; if((nowel2 - x.ile + (n + 1)) % (n + 1) <= (nower2 - x.ile + (n + 1)) % (n + 1)) { wynik.push_back({ (nowel2 - x.ile + (n + 1)) % (n + 1), (nower2 - x.ile + (n + 1)) % (n + 1), (x.ile + it->ile) % (n + 1) }); } /*if(wynik[wynik.size() - 1].l == szukane.l && wynik[wynik.size() - 1].r == szukane.r && wynik[wynik.size() - 1].ile == szukane.ile) { cout << "1" << endl; }*/ it++; } } else { int popnowe = nower; nower = n; przedzial tempo; tempo.l = nowel; tempo.r = -1; auto it = --upper_bound(drugi.begin(), drugi.end(), tempo); /*if (it != drugi.begin()) { it--; }*/ if(debug) { cout << "wyw " << nowel << " " << nower << " " << x.ile << endl; } while (it != drugi.end() && nowel <= nower) { int nowel2 = max(nowel, it->l); int nower2 = min(nower, it->r); if(debug) { cout << "cur " << nowel << " " << nower << endl; cout << "it " << it->l << " " << it->r << " " << it->ile << endl; } nowel = nower2 + 1; if((nowel2 - x.ile + (n + 1)) % (n + 1) <= (nower2 - x.ile + (n + 1)) % (n + 1)) { wynik.push_back({ (nowel2 - x.ile + (n + 1)) % (n + 1), (nower2 - x.ile + (n + 1)) % (n + 1), (x.ile + it->ile) % (n + 1) }); } /*if(wynik[wynik.size() - 1].l == szukane.l && wynik[wynik.size() - 1].r == szukane.r && wynik[wynik.size() - 1].ile == szukane.ile) { //cout << x.l << " " << x.r << " " << x.ile << endl; //cout << it->l << " " << it->r << endl; //cout << nowel2 << " " << nower2 << endl; //cout << nowel << " " << nower << endl; //cout << "2" << endl; }*/ it++; } nowel = 0; nower = popnowe; tempo.l = nowel; tempo.r = -1; it = --upper_bound(drugi.begin(), drugi.end(), tempo); /*if (it != drugi.begin()) { it--; }*/ if(debug) { cout << "wyw " << nowel << " " << nower << " " << x.ile << endl; } while (it != drugi.end() && nowel <= nower) { if(debug) { cout << "cur " << nowel << " " << nower << endl; cout << "it " << it->l << " " << it->r << " " << it->ile << endl; } /*if(pierwszy[0].l == 0 && pierwszy[0].r == 4 && nower == 4) { cout << it->l << " " << it->r << " " << it->ile << endl; }*/ int nowel2 = max(nowel, it->l); int nower2 = min(nower, it->r); nowel = nower2 + 1; if((nowel2 - x.ile + (n + 1)) % (n + 1) <= (nower2 - x.ile + (n + 1)) % (n + 1)) { wynik.push_back({ (nowel2 - x.ile + (n + 1)) % (n + 1), (nower2 - x.ile + (n + 1)) % (n + 1), (x.ile + it->ile) % (n + 1) }); } /*if(wynik[wynik.size() - 1].l == szukane.l && wynik[wynik.size() - 1].r == szukane.r && wynik[wynik.size() - 1].ile == szukane.ile) { cout << "3" << endl; }*/ it++; } } } sort(wynik.begin(), wynik.end()); if(debug2) { for(auto x : pierwszy) { cout << x.l << " " << x.r << " " << x.ile << endl; } cout << endl; for(auto x : drugi) { cout << x.l << " " << x.r << " " << x.ile << endl; } cout << endl; for(auto x : wynik) { cout << x.l << " " << x.r << " " << x.ile << endl; } cout << endl; } return wynik; } void licz(int cur) { if (cur >= 131072) { return; } licz(2 * cur); licz(2 * cur + 1); drz[cur] = lacz_przedzialy(drz[2 * cur], drz[2 * cur + 1]); } vector<pair<int, int>> gdzie_kon; void przedzial(int l, int r, int curl, int curr, int gdzie) { if (curl > r || curr < l) { return; } if (l <= curl && r >= curr) { gdzie_kon.push_back({ curl, gdzie }); } else { przedzial(l, r, curl, (curl + curr) / 2, gdzie * 2); przedzial(l, r, (curl + curr) / 2 + 1, curr, gdzie * 2 + 1); } } int policz(int stan, int l, int r) { gdzie_kon.clear(); przedzial(l, r, 1, 131072, 1); sort(gdzie_kon.begin(), gdzie_kon.end()); for (auto x : gdzie_kon) { //cout << x.second << endl; /*for(auto y : drz[x.second]) { //cout << y.l << " " << y.r << " " << y.ile << endl; }*/ //cout << endl; int lbin = 0, rbin = drz[x.second].size() - 1, gdzie; while (lbin <= rbin) { int sr = lbin + (rbin - lbin) / 2; if (stan < drz[x.second][sr].l) { rbin = sr - 1; } else if (stan > drz[x.second][sr].r) { lbin = sr + 1; } else { lbin = rbin + 7; gdzie = sr; } } stan += drz[x.second][gdzie].ile; stan %= (n + 1); } return stan; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int m, q, l, r, pref = 0; string s; cin >> n >> m >> s; for (int i = 0; i < n; i++) { if (s[i] == 'R') { pref++; } else { i = n + 4; } } for (int i = 0; i < m; i++) { cin >> gdzie[i]; } for (int i = 0; i < m; i++) { if (gdzie[i] != 0) { drz[i + 131072].push_back({ 0, gdzie[i] - 1, gdzie[i] + 1 }); } drz[i + 131072].push_back({ gdzie[i], n, gdzie[i] }); } licz(1); /*for(auto x : drz[65539]) { cout << x.l << " " << x.r << " " << x.ile << endl; }*/ cin >> q; while (q--) { int stan; cin >> l >> r; stan = policz(pref, l, r); cout << stan << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...