社区讨论

68TLE求助

P3245[HNOI2016] 大数参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo7l2kyl
此快照首次捕获于
2023/10/27 03:34
2 年前
此快照最后确认于
2023/10/27 03:34
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;

namespace ljh {
    #define debug(x) cerr << #x << ":" << x << endl
    int qpow(int x, int y, const int P) {
        if (!y) return 1;
        int s = qpow(x, y >> 1, P);
        return (ll) s * s % P * (y & 1 ? x : 1) % P;
    }
}
using namespace ljh;

const int MAXN = 2e5 + 10;

int tong[MAXN], t[MAXN];
ll cnt;

int n, m, P, a[MAXN];
char s[MAXN];
ll ans[MAXN];

struct node {
    int l, r, id;
} e[MAXN];

inline bool cmp(node x, node y) {
    if (t[x.l] != t[y.l]) return t[x.l] < t[y.l];
    if (x.l & 1) return x.r < y.r;
    return x.r > y.r;
}

void add(int x) {
    cnt -= (ll) (tong[a[x]] - 1) * tong[a[x]] / 2;
    ++tong[a[x]];
    cnt += (ll) (tong[a[x]] - 1) * tong[a[x]] / 2;
}
void del(int x) {
    cnt -= (ll) (tong[a[x]] - 1) * tong[a[x]] / 2;
    --tong[a[x]];
    cnt += (ll) (tong[a[x]] - 1) * tong[a[x]] / 2;
}

void init() {
    for (int i = 0; i < MAXN; ++i) t[i] = i / 420;
    vector<int> vis;
    vis.push_back(0);
    for (int i = n, Pow = 1; i; --i) {
        a[i] = (a[i + 1] + (ll) Pow * (s[i] - 48) % P) % P;
        Pow = (ll) Pow * 10 % P;
        vis.push_back(a[i]);
    }
    stable_sort(vis.begin(), vis.end());
    auto End = unique(vis.begin(), vis.end());
    for (int i = 1; i <= n + 1; ++i)
        a[i] = lower_bound(vis.begin(), End, a[i]) - vis.begin();
}

void solve() {
    for (int i = 1; i <= n; ++i) {
        a[i] = !((s[i] - 48) % P);
        ans[i] = ans[i - 1] + a[i] * i;
        a[i] += a[i - 1];
    }
    scanf("%d", &m);
    for (int i = 1, l, r; i <= m; ++i) {
        scanf("%d %d", &l, &r);
        printf("%lld\n", ans[r] - ans[l - 1] - (a[r] - a[l - 1]) * (l - 1));
    }
}

int main() {
    scanf("%d %s", &P, s + 1);
    n = strlen(s + 1);
    if (P == 2 || P == 5) {
        solve();
        return 0;
    }
    init();
    scanf("%d", &m);
    for (int i = 1; i <= m; ++i) {
        scanf("%d %d", &e[i].l, &e[i].r);
        ++e[i].r;
        e[i].id = i;
    }
    stable_sort(e + 1, e + 1 + m, cmp);
    for (int i = 1, l = 1, r = 0; i <= m; ++i) {
        while (l < e[i].l) del(l++);
        while (l > e[i].l) add(--l);
        while (r > e[i].r) del(r--);
        while (r < e[i].r) add(++r);
        ans[e[i].id] = cnt;
    }

    for (int i = 1; i <= m; ++i) printf("%lld\n", ans[i]);
    getchar();
    getchar();
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...