玄关站外题70pts求条
  • 板块题目总版
  • 楼主RoyWu1207
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/22 11:03
  • 上次更新2024/7/22 11:53:39
查看原帖
玄关站外题70pts求条
352866
RoyWu1207楼主2024/7/22 11:03

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int mod = 1e9 + 7, hf = 5e8 + 4;

int n, m, a[400001], od[400001], ev[400001], od2[400001], ev2[400001];
bool fl = false; char str[400002];

int lowbit(int x) {
    return x & -x;
}

void add(int p, int k, int c[]) {
    while (p <= n) 
        (c[p] += k) %= mod, p += lowbit(p);
}

int sum(int p,int c[]) {
    int res = 0;
    while (p)
        (res += c[p]) %= mod, p -= lowbit(p);
    return res;
}

int sum(int p, int c, int c1[], int c2[]) {
    return (c % mod * sum(p, c1) % mod + sum(p, c2)) % mod;
}

void modify(int p,int k) {
    if (p & 1)
        add(p, k - a[p], od), add(p, (a[p] - k) * (p - 1), od2);
    else
        add(p, k - a[p], ev), add(p, (a[p] - k) * (p - 2), ev2);
    a[p] = k;
}

int calc(int l, int r) {
    int len = r - l + 1;
    if (l & 1)
        return (sum(r, len + l - 1, od, od2) - sum(l - 1, len + l - 1, od, od2)) % mod;
    else
        return (sum(r, len + l - 2, ev, ev2) - sum(l - 1, len + l - 2, ev, ev2)) % mod;
}

int calcL(int l, int len) {
    if (l & 1)
        return (sum(n, len + l - 1, od, od2) - sum(l - 1, len + l - 1, od, od2)) % mod;
    else
        return (sum(n, len + l - 2, ev, ev2) - sum(l - 1, len + l - 2, ev, ev2)) % mod;
}

int calcR(int l, int r, int len, int dep) { 
    if (l & 1) {
        len = (len + l - 1 - dep % mod * n % mod) % mod;
        return sum(r - n * dep, len, od, od2);
    } else {
        len = (len + l - 2 - dep % mod * n % mod) % mod;
        return sum(r - n * dep, len, ev, ev2);
    }
}

int calcM(int l, int len, int m) {
    int a, b; len %= mod, m %= mod;
    if (l & 1) {
        a = sum(n, od), b = sum(n, od2);
        return (b * m % mod + (len + l - 1) % mod * a % mod * m % mod - a * n % mod * m % mod * (m + 1) % mod * hf % mod) % mod;
    } else {
        a = sum(n, ev), b = sum(n, ev2);
        return (b * m % mod + (len + l - 2) % mod * a % mod * m % mod - a * n % mod * m % mod * (m + 1) % mod * hf % mod) % mod;
    }
}

int query(int l, int r) {
    int ans = 0, len = r - l + 1;
    if (l > n)
        r -= n * ((l - 1) / n), l -= n * ((l - 1) / n);
    if (fl && l > n / 2)
        l -= n / 2, r -= n / 2;
    if (r <= n) ans = calc(l,r);
    else {
        ans = calcL(l, len);
        if (r <= n * 2) 
            (ans += calcR(l, r, len, 1)) %= mod;
        else
            (ans += calcR(l, r, len, (r - 1) / n)) %= mod, (ans += calcM(l, len, (r - 1) / n - 1)) %= mod;
    } return (ans + mod) % mod;
}

signed main() {
    cin >> n >> (str + 1);
    for (int i = 1; i <= n; i++)
        a[i] = str[i] - '0';
    if (n & 1) {
        for (int i = 1; i <= n; i++) a[i + n] = a[i];
        fl = true; n <<= 1;
    } for (int i = 1; i <= n; i++)
        if (i & 1)
            add(i, a[i], od), add(i, -a[i] * (i - 1), od2);
        else
            add(i, a[i], ev), add(i, -a[i] * (i - 2), ev2);
    cin >> m;
    while (m--) {
        int op, l, r; cin >> op >> l >> r;
        if (op == 1) {
            modify(l, r);
            if (fl) modify(l, r);
        } else 
            cout << query(l, r) << '\n';
    } return 0;
}
2024/7/22 11:03
加载中...