제출 #1343065

#제출 시각아이디문제언어결과실행 시간메모리
1343065rythm_of_knight비밀 (JOI14_secret)C++17
100 / 100
337 ms8356 KiB
#include "secret.h"
#include <bits/stdc++.h>
#define ar array
#define all(x) x.begin(), x.end()
using namespace std;
typedef long long ll;

mt19937 mt(chrono::high_resolution_clock().now().time_since_epoch().count());

int randint(int l, int r) {
    return mt() % (r - l + 1) + l;
}

const int N = 1005;
const int mod = 1e9 + 7;
int a[N][N], b[N];
int cnt = 0;

int binpow(int a, int b) {
    int res = 1, cur = a;
    while (b) {
        if (b & 1)
            res = 1ll * res * cur % mod;
        cur = 1ll * cur * cur % mod, b >>= 1;
    }
    return res;
}

// int op(int a, int b) {
//     return (a * 10ll + b) % mod;
// }

// int Secret(int a, int b) {
//     cnt++;
//     return op(a, b);
// }

void rec(int l, int r) {
    if (l + 1 >= r)
        return;
    int m1 = l + r >> 1;
    int m2 = m1 + 1;
    for (int i = m1 - 1; i >= l; i--)
        a[i][m1] = Secret(b[i], a[i + 1][m1]);
    for (int i = m2 + 1; i <= r; i++)
        a[m2][i] = Secret(a[m2][i - 1], b[i]);
    rec(l, m1 - 1);
    rec(m2 + 1, r);
}

int get(int tl, int tr, int l, int r) {
    int m1 = l + r >> 1;
    int m2 = m1 + 1;
    if (tr < m1)
        return get(tl, tr, l, m1 - 1);
    if (m2 < tl)
        return get(tl, tr, m2 + 1, r);
    if (m1 == tr)
        return a[tl][m1];
    if (m2 == tl)
        return a[m2][tr];
    return Secret(a[tl][m1], a[m2][tr]);
}

int n;

void Init(int N, int A[]) {
    n = N;
    for (int i = 0; i < n; i++)
        b[i] = A[i], a[i][i] = b[i];
    rec(0, n - 1);
}

int Query(int l, int r) {
    return get(l, r, 0, n - 1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...