求助,第二个点tle了。。
查看原帖
求助,第二个点tle了。。
524191
Man_CCNU楼主2023/11/7 10:51
#include<iostream>

using namespace std;

const int N = 1e6 + 10;

typedef long long ll;

ll a[N],b[N], d[N], primes[N],n,m,cnt,res;
bool vis[N];
struct node {
    ll l;
    ll r;
    ll val;
    ll mx;
    ll flag;
}tr[N*4];

void get_primes(ll mx)
{
    d[0] = 0;
    d[1] = 1;
    for (ll i = 2; i <=mx; i++) {
        if (!vis[i]) primes[++cnt] = i,d[i]=2,b[i]=1;
        for (ll j = 1; j <= cnt&&primes[j]<=mx/i; j++) {
            if (primes[j] * i > mx) break;
            vis[primes[j] * i] = 1;
            if (i % primes[j] != 0) {
                d[i * primes[j]] = d[i] * d[primes[j]];
                b[i * primes[j]] = 1;
            }
            else {
                ll m = i * primes[j];
                b[m] = b[i] + 1;
                d[i * primes[j]] = d[i] / (b[i] + 1) * (b[primes[j]] + b[i] + 1);
                break;
            }
        }
    }
}
void update(ll node)
{
    tr[node].val = tr[node * 2].val + tr[node * 2 + 1].val;
    tr[node].mx = max(tr[node * 2].mx, tr[node * 2 + 1].mx);
}
void down(ll node)
{
    if (tr[node].flag) {
        tr[node * 2].flag += tr[node].flag;
        tr[node * 2+1].flag += tr[node].flag;
        tr[node].flag = 0;
    }
}
void pro(ll i,ll node)
{
    a[i] = d[a[i]];
    tr[node].val = a[i];
}
void build_tree(ll L, ll R,ll node)
{
    tr[node].l = L;
    tr[node].r = R;
    ll mid= L + R >> 1;
    if (L == R) {
        tr[node].val = a[L];
        tr[node].mx = a[L];

        return;
    }
    build_tree(L, mid, node *2);
    build_tree(mid+1, R, node*2+1);
    update(node);
}
void add(ll L, ll R,ll node)
{
    ll l = tr[node].l;
    ll r = tr[node].r;
    ll mid = l + r >> 1;
    if (l >= L && r <= R&& tr[node].mx <= 2) {
        tr[node].flag = 0;
        return;
    }
    if (tr[node].l == tr[node].r) {
        pro(tr[node].l,node);

        return;
    }
    down(node);
    if (L <= mid) add(L, R, node << 1);
    if (R > mid) add(L, R, node << 1 | 1);
    update(node);
}
ll qur(ll L, ll R, ll node)
{
    ll l = tr[node].l;
    ll r = tr[node].r;
    ll mid = l + r >> 1;
    if (l >= L && r <= R) {
        return tr[node].val;
    }
    ll tem = 0;
    down(node);
    if (L <= mid) tem += qur(L, R, node << 1);
    if (r > mid) tem += qur(L, R, node << 1 | 1);

    return tem;
}
int main()
{
    scanf("%lld%lld", &n, &m);
    ll tem = 0;
    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
        tem = max(tem, a[i]);
    }
    get_primes(tem);
    
    build_tree(1, n, 1);
    for (ll i = 1; i <= m; i++) {
        ll op;
        ll x, y;
        scanf("%lld", &op);
        if (op == 1) {
            scanf("%lld%lld", &x, &y);
            add(x, y, 1);
        }
        else if (op == 2) {
            scanf("%lld%lld", &x, &y);
            res = qur(x, y, 1);
            printf("%lld\n", res);
        }
    }

    return 0;
}
2023/11/7 10:51
加载中...