社区讨论

分块70求助

P3372【模板】线段树 1参与者 3已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo1598gl
此快照首次捕获于
2023/10/22 15:25
2 年前
此快照最后确认于
2023/11/02 14:57
2 年前
查看原帖
TLE on #8 ~ #10
CPP
#include <iostream>
#include <cmath>
using namespace std;

int n, len;
int a[100001], lazy[100001], s[100001], id[100001];

void add(int l, int r, int x)
{
    int lid = id[l], rid = id[r];
    if (lid == rid)
    {
        for (int i = l; i <= r; i++)
        {
            a[i] += x;
            s[lid] += x;
        }
        return;
    }

    for (int i = l; id[i] == lid; i++)
    {
        a[i] += x;
        s[lid] += x;
    }
    for (int i = r; id[i] == rid; i--)
    {
        a[i] += x;
        s[rid] += x;
    }
    for (int i = lid + 1; i < rid; i++)
    {
        lazy[i] += x;
        s[i] += len * x;
    }
}

long long sum(int l, int r)
{
    int lid = id[l], rid = id[r];
    long long ans = 0;
    if (lid == rid)
    {
        for (int i = l; i <= r; i++)
        {
            ans += a[i] + lazy[lid];
        }
        return ans;
    }

    for (int i = l; id[i] == lid; i++)
    {
        ans += a[i] + lazy[lid];
    }
    for (int i = r; id[i] == rid; i--)
    {
        ans += a[i] + lazy[rid];
    }
    for (int i = lid + 1; i < rid; i++)
    {
        ans += s[i];
    }
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int m;
    cin >> n >> m;
    len = sqrt(n);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        id[i] = n / len;
    }

    while (m--)
    {
        int op, x, y;
        cin >> op >> x >> y;
        if (op == 1)
        {
            int k;
            cin >> k;
            add(x, y, k);
        }
        else
        {
            cout << sum(x, y) << endl;
        }
    }
}

回复

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

正在加载回复...