QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#572259#9302. Caesar Cipherretired_midlightsRE 0ms0kbC++143.4kb2024-09-18 13:19:322024-09-18 13:19:33

Judging History

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

  • [2024-11-04 17:10:09]
  • hack成功,自动添加数据
  • (/hack/1110)
  • [2024-10-21 09:47:48]
  • hack成功,自动添加数据
  • (/hack/1022)
  • [2024-10-21 09:39:50]
  • hack成功,自动添加数据
  • (/hack/1021)
  • [2024-10-21 09:31:34]
  • hack成功,自动添加数据
  • (/hack/1020)
  • [2024-10-03 10:14:59]
  • hack成功,自动添加数据
  • (/hack/928)
  • [2024-09-28 07:51:27]
  • hack成功,自动添加数据
  • (/hack/922)
  • [2024-09-28 07:42:39]
  • hack成功,自动添加数据
  • (/hack/921)
  • [2024-09-26 18:56:14]
  • hack成功,自动添加数据
  • (/hack/911)
  • [2024-09-23 07:21:34]
  • hack成功,自动添加数据
  • (/hack/885)
  • [2024-09-20 15:14:45]
  • hack成功,自动添加数据
  • (/hack/855)
  • [2024-09-20 14:21:31]
  • hack成功,自动添加数据
  • (/hack/854)
  • [2024-09-20 14:19:40]
  • hack成功,自动添加数据
  • (/hack/853)
  • [2024-09-20 14:16:01]
  • hack成功,自动添加数据
  • (/hack/851)
  • [2024-09-20 14:12:05]
  • hack成功,自动添加数据
  • (/hack/850)
  • [2024-09-20 14:10:12]
  • hack成功,自动添加数据
  • (/hack/849)
  • [2024-09-18 13:19:33]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-09-18 13:19:32]
  • 提交

answer

#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (int)a; i <= (int)b; i ++)
#define ll long long
#define ls p << 1
#define rs p << 1 | 1
using namespace std;

const int maxn = 500010, base = 19260817, mod = 1e9 + 7;

struct Info {
    int tag, mx, hsh;
} t[maxn << 2];

int n, q, a[maxn], power[maxn], sum[maxn];

void push_up(int p, int l, int r) {
    t[p].mx = max(t[ls].mx, t[rs].mx);
    int mid = (l + r) >> 1;
    t[p].hsh = (1ll * t[ls].hsh * power[r - mid] % mod + t[rs].hsh) % mod;
}

void build(int p, int l, int r) {
    t[p].tag = 0;
    if(l == r) {
        t[p].mx = t[p].hsh = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(ls, l, mid), build(rs, mid + 1, r);
    push_up(p, l, r);
}

void push_down(int p, int l, int r) {
    t[ls].tag += t[p].tag, t[rs].tag += t[p].tag;
    t[ls].mx += t[p].tag, t[rs].mx += t[p].tag;
    int mid = (l + r) >> 1;
    t[ls].hsh = (t[ls].hsh + 1ll * sum[mid - l] * t[p].tag % mod) % mod;
    t[rs].hsh = (t[rs].hsh + 1ll * sum[r - (mid + 1)] * t[p].tag % mod) % mod;
    t[p].tag = 0;
}

void modify_force(int p, int l, int r) {
    // cout << p << " " << l << " " << r << endl;
    if(l == r) {
        t[p].mx %= 65536;
        t[p].hsh = t[p].mx;
        return;
    }
    if(t[p].tag) push_down(p, l, r);
    int mid = (l + r) >> 1;
    if(t[ls].mx >= 65536) modify_force(ls, l, mid);
    if(t[rs].mx >= 65536) modify_force(rs, mid + 1, r);
    push_up(p, l, r);
}

void modify(int p, int l, int r, int ql, int qr) {
    if(ql <= l && r <= qr) {
        t[p].tag ++;
        t[p].mx ++;
        t[p].hsh = (t[p].hsh + sum[r - l]) % mod;
        if(t[p].mx >= 65536) {
            modify_force(p, l, r);
        }
        return;
    }
    if(t[p].tag) push_down(p, l, r);
    int mid = (l + r) >> 1;
    if(ql <= mid) modify(ls, l, mid, ql, qr);
    if(qr > mid) modify(rs, mid + 1, r, ql, qr);
    push_up(p, l, r);
}

int query(int p, int l, int r, int ql, int qr) {
    if(ql <= l && r <= qr) return t[p].hsh;
    int mid = (l + r) >> 1;
    if(t[p].tag) push_down(p, l, r);
    int res1 = 0, res2 = 0;
    if(ql <= mid) res1 = query(ls, l, mid, ql, qr);
    if(qr > mid) res2 = query(rs, mid + 1, r, ql, qr);
    // cout << p << " " << l << " " << r << " " << res1 << " " << res2 << endl;
    if(qr > mid) return (1ll * res1 * power[min(r, qr) - mid] % mod + res2) % mod;
    else return res1;
}

void solve() {
    cin >> n >> q;
    rep(i, 1, n) {
        cin >> a[i];
        assert(a[i] >= 0 && a[i] <= 65535);
    }
    power[0] = 1;
    rep(i, 1, n) power[i] = 1ll * power[i - 1] * base % mod;
    sum[0] = 1;
    rep(i, 1, n) sum[i] = (sum[i - 1] + power[i]) % mod;
    build(1, 1, n);
    while(q --) {
        int op, x, y, k;
        cin >> op >> x >> y;
        assert(op == 1 || op == 2);
        assert(x <= y && x >= 1 && y <= n);
        if(op == 1) modify(1, 1, n, x, y);
        else {
            cin >> k;
            assert(max(x, y) + k - 1 <= n);
            // cout << query(1, 1, n, x, x + k - 1) << endl;
            // cout << query(1, 1, n, y, y + k - 1) << "!" << endl;
            cout << (query(1, 1, n, x, x + k - 1) == query(1, 1, n, y, y + k - 1) ? "yes\n" : "no\n");
        }
    }
}

int main() {
    ios :: sync_with_stdio(false);
    cin.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

詳細信息

Test #1:

score: 0
Runtime Error

input:

5 6
1 2 1 2 1
2 1 2 2
2 1 3 3
1 1 1
1 3 5
2 1 2 4
2 1 2 2

output:


result: