QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#386655 | #7782. Ursa Minor | SamponYW | WA | 3ms | 20260kb | C++14 | 4.3kb | 2024-04-11 19:07:41 | 2024-04-11 19:07:42 |
Judging History
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'