Submission #549757

#TimeUsernameProblemLanguageResultExecution timeMemory
549757MilosMilutinovicCrossing (JOI21_crossing)C++14
100 / 100
305 ms14344 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 200005;
const int MD = 1e9 + 7;
const int BASE = 77777;

int mul(int x, int y) {
  return (long long) x * y % MD;
}

int add(int x, int y) {
  return x + y >= MD ? x + y - MD : x + y;
}

int sub(int x, int y) {
  return x - y < 0 ? x - y + MD : x - y;
}

int st[4 * N], lzy[4 * N], pw[N], pref[N];
bool act[4 * N];

void build(int node, int l, int r, string& s) {
  if (l == r) {
    st[node] = mul((s[l] - '0'), pw[l]);
    return;
  }
  int mid = l + r >> 1;
  build(node + node, l, mid, s);
  build(node + node + 1, mid + 1, r, s);
  st[node] = add(st[node + node], st[node + node + 1]);
}

void push(int node, int l, int r) {
  if (!act[node]) {
    return;
  }
  if (l != r) {
    int mid = l + r >> 1;
    st[node + node] = mul(lzy[node], sub(pref[mid], (l == 0 ? 0 : pref[l - 1])));
    st[node + node + 1] = mul(lzy[node], sub(pref[r], pref[mid]));
    lzy[node + node] = lzy[node];
    lzy[node + node + 1] = lzy[node];
    act[node + node] = true;
    act[node + node + 1] = true;
  }
  act[node] = false;
}

void modify(int node, int l, int r, int ll, int rr, char cc) {
  if (l > r || l > rr || r < ll) return;
  if (ll <= l && r <= rr) {
    st[node] = mul(cc - '0', sub(pref[r], (l == 0 ? 0 : pref[l - 1])));
    lzy[node] = cc - '0';
    act[node] = true;
    return;
  }
  push(node, l, r);
  int mid = l + r >> 1;
  modify(node + node, l, mid, ll, rr, cc);
  modify(node + node + 1, mid + 1, r, ll, rr, cc);
  st[node] = add(st[node + node], st[node + node + 1]);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  pw[0] = 1;
  pref[0] = 1;
  for (int i = 1; i < N; i++) {
    pw[i] = mul(pw[i - 1], BASE);
    pref[i] = add(pref[i - 1], pw[i]);
  }
  int n;
  cin >> n;
  string sa, sb, sc;
  cin >> sa >> sb >> sc;
  for (int i = 0; i < n; i++) {
    sa[i] = (sa[i] == 'J' ? '0' : (sa[i] == 'O' ? '1' : '2'));
    sb[i] = (sb[i] == 'J' ? '0' : (sb[i] == 'O' ? '1' : '2'));
    sc[i] = (sc[i] == 'J' ? '0' : (sc[i] == 'O' ? '1' : '2'));
  }
  auto Cross = [&](string s, string t) {
    string res = "";
    for (int i = 0; i < n; i++) {
      if (s[i] == t[i]) {
        res += s[i];
      } else {
        res += (s[i] ^ t[i] ^ '0' ^ '1' ^ '2');
      }
    }
    return res;
  };
  vector<string> a;
  a.push_back(sa);
  a.push_back(sb);
  a.push_back(sc);
  a.push_back(Cross(sa, sb));
  a.push_back(Cross(sa, sc));
  a.push_back(Cross(sb, sc));
  a.push_back(Cross(sa, Cross(sb, sc)));
  a.push_back(Cross(sb, Cross(sa, sc)));
  a.push_back(Cross(sc, Cross(sb, sa)));
  set<int> hsh;
  auto GetHash = [&](string s) {
    int res = 0;
    for (int i = 0; i < n; i++) {
      res = add(res, mul(s[i] - '0', pw[i]));
    }
    return res;
  };
  for (auto &str : a) {
    hsh.insert(GetHash(str));
  }
  int q;
  cin >> q;
  string t;
  cin >> t;
  for (int i = 0; i < n; i++) {
    t[i] = (t[i] == 'J' ? '0' : (t[i] == 'O' ? '1' : '2'));
  }
  build(1, 0, n - 1, t);
  function<void()> Answer = [&]() {
    int my = st[1];
    bool ok = false;
    for (auto he : hsh) {
      ok |= (he == my);
    }
    cout << (ok ? "Yes" : "No") << '\n';
  };
  Answer();
  while (q--) {
    int l, r;
    char foo;
    cin >> l >> r >> foo;
    --l; --r;
    foo = (foo == 'J' ? '0' : (foo == 'O' ? '1' : '2'));
    modify(1, 0, n - 1, l, r, foo);
    Answer();
  }
  return 0;
}

Compilation message (stderr)

Main.cpp: In function 'void build(int, int, int, std::string&)':
Main.cpp:29:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   29 |   int mid = l + r >> 1;
      |             ~~^~~
Main.cpp: In function 'void push(int, int, int)':
Main.cpp:40:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   40 |     int mid = l + r >> 1;
      |               ~~^~~
Main.cpp: In function 'void modify(int, int, int, int, int, char)':
Main.cpp:60:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   60 |   int mid = l + r >> 1;
      |             ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...