QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#386655#7782. Ursa MinorSamponYWWA 3ms20260kbC++144.3kb2024-04-11 19:07:412024-04-11 19:07:42

Judging History

你现在查看的是最新测评结果

  • [2024-04-11 19:07:42]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:20260kb
  • [2024-04-11 19:07:41]
  • 提交

answer

#include <bits/stdc++.h>
#define db double
#define il inline
#define re register
#define ll long long
#define ui unsigned
#define ull ui ll
#define i128 __int128
#define pii pair<int, int>
#define fi first
#define se second
#define eb emplace_back
#define SZ(v) (int)v.size()
#define ALL(v) v.begin(), v.end()
#define mems(v, x) memset(v, x, sizeof(v))
#define memc(a, b) memcpy(a, b, sizeof(a))
#define FOR(i, L, R) for(re int i = (L); i <= (R); ++i)
#define ROF(i, R, L) for(re int i = (R); i >= (L); --i)
#define LS i << 1, l, mid
#define RS i << 1 | 1, mid + 1, r
#define popc(x) __builtin_popcount(x)
using namespace std;
#define N 200005
#define P 998244353
il int add(int x, int y) {return x + y < P ? x + y : x + y - P;}
il void addr(int &x, int y) {(x += y) >= P && (x -= P);}
int B, be[N], L[N], R[N], pw[N];
int n, m, q, a[N], b[N], c[N];
struct sma {
  int B, v[N], s[N];
  il void build(int k) {
    B = k;
    FOR(i, 1, n) {
      v[i] = 1ll * pw[i % B] * c[i] % P;
      addr(s[be[i]], v[i]);
    }
  }
  il void upd(int x, int k) {
    k = 1ll * k * pw[x % B] % P;
    addr(v[x], k), addr(s[be[x]], k);
  }
  il int query(int l, int r) {
    int a = be[l], b = be[r], ns = 0;
    if(a == b) {
      // cerr << "wtf ";
      FOR(i, l, r) addr(ns, v[i]); return ns;}
    // cerr << "omg ";
    FOR(i, l, R[a]) addr(ns, v[i]);
    FOR(i, a + 1, b - 1) addr(ns, s[i]);
    FOR(i, L[b], r) addr(ns, v[i]);
    return ns;
  }
} T[450];
struct info {
  int v, L;
} v[N], s[N], pre[N], suf[N];
il info merge(info A, info B) {
  return {(1ll * A.v * pw[B.L] + B.v) % P, A.L + B.L};
}
namespace big {
  il void reb(int t) {
    info k = {0, 0};
    FOR(i, L[t], R[t])
      k = merge(k, v[i]), pre[i] = k;
    s[t] = k, k = {0, 0};
    ROF(i, R[t], L[t])
      k = merge(v[i], k), suf[i] = k;
  }
  il void build() {
    FOR(i, 1, n) v[i] = {c[i], 1};
    FOR(i, 1, be[n]) reb(i);
  }
  il void upd(int x, int d) {addr(v[x].v, d), reb(be[x]);}
  il info query(int l, int r) {
    if(l > r) return {0, 0}; info k = {0, 0};
    if(be[l] == be[r]) {FOR(i, l, r) k = merge(k, v[i]); return k;}
    k = merge(k, suf[l]);
    FOR(i, be[l] + 1, be[r] - 1) k = merge(k, s[i]);
    k = merge(k, pre[r]); return k;
  }
}
il void upd(int x, int k) {
  int d = (k - c[x] + P) % P; c[x] = k;
  FOR(i, 1, B) T[i].upd(x, d); big::upd(x, d);
}
namespace rmq {
  int st[20][N];
  il void build() {
    FOR(i, 1, m) st[0][i] = b[i];
    FOR(i, 1, 19) FOR(j, 1, m - (1 << i) + 1)
      st[i][j] = __gcd(st[i - 1][j], st[i - 1][j + (1 << i - 1)]);
  }
  il int query(int l, int r) {
    int t = __lg(r - l + 1);
    return __gcd(st[t][l], st[t][r - (1 << t) + 1]);
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n >> m >> q;
  B = sqrt(n);
  FOR(i, 1, n) cin >> a[i];
  FOR(i, 1, n) c[i] = add(a[i % n + 1], P - a[i]);
  FOR(i, 1, m) cin >> b[i]; rmq::build();
  // pw[0] = 1; FOR(i, 1, n) pw[i] = 19260817ll * pw[i - 1] % P;
  pw[0] = 1; FOR(i, 1, n) pw[i] = 100ll * pw[i - 1] % P;
  FOR(i, 1, n) {
    be[i] = (i - 1) / B + 1, R[be[i]] = i;
    if(be[i] != be[i - 1]) L[be[i]] = i;
  }
  FOR(i, 1, n) cout << be[i] << " \n"[i == n];
  FOR(i, 1, B) T[i].build(i); big::build();
  while(q--) {
    char op; cin >> op;
    if(op == 'U') {
      int x, v; cin >> x >> v, a[x] = v;
      upd(x, add(a[x % n + 1], P - a[x]));
      --x; if(!x) x = n;
      upd(x, add(a[x % n + 1], P - a[x]));
    }
    else {
      int l, r, s, t; cin >> l >> r >> s >> t;
      if(l == r) {cout << "Yes\n"; continue;}
      int g = __gcd(r - l + 1, rmq::query(s, t)), ns;
      // cerr << g << " ";
      if(g <= B) {
        // cerr << "sma ";
        ns = add(T[g].query(l, r - 1), 1ll * pw[r % g] * add(a[l], P - a[r]) % P);
        // cerr << T[g].query(l, r - 1) << " + " << 1ll * pw[r % g] * add(a[l], P - a[r]) % P << "\n";
      }
      else {
        // cerr << "big ";
        while(l + B - 1 <= r - 1) {
          auto k = big::query(l, l + B - 1);
          addr(ns, k.v), l += B;
        }
        auto k = big::query(l, r - 1);
        k = merge(k, {add(a[l], P - a[r]), 1});
        addr(ns, 1ll * k.v * pw[B - k.L] % P);
      }
      // cerr << ns << "\n";
      if(!ns) cout << "Yes\n"; else cout << "No\n";
    }
  }
  cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
  return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 20260kb

input:

6 4 5
1 1 4 5 1 4
3 3 2 4
Q 1 5 1 2
Q 2 5 3 4
U 5 2
Q 1 6 1 2
Q 2 5 3 4

output:

1 1 2 2 3 3
Yes
No
No
Yes

result:

wrong answer 1st words differ - expected: 'Yes', found: '1'