1 条题解

  • 0
    @ 2026-7-27 1:49:42
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    
    const int N = 5e4 + 10, sqrtN = 250;
    
    int n, a[N], b[N], c[N], L[sqrtN], R[sqrtN], tag[sqrtN];
    
    signed main() {
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            c[i] = a[i];
        }
        int B = sqrt(n), cnt = (n + B - 1) / B;
        for (int i = 1; i <= n; i++) b[i] = (i - 1) / B + 1;
        for (int i = 1; i <= cnt; i++) {
            L[i] = (i - 1) * B + 1;
            R[i] = min(i * B, n);
            sort(c + L[i], c + R[i] + 1);
        }
    	memset(tag, 0, sizeof(tag));
        for (int i = 1; i <= n; i++) {
            int op, l, r, v;
            cin >> op >> l >> r >> v;
            if (op == 0) {
                if (b[l] == b[r]) {
    
                    for (int i = l; i <= r; i++) a[i] += v;
                    for (int i = L[b[l]]; i <= R[b[l]]; i++) c[i] = a[i];
                    sort(c + L[b[l]], c + R[b[l]] + 1);
    
                } else {
    
                    for (int i = l; i <= R[b[l]]; i++) a[i] += v;
                    for (int i = L[b[l]]; i <= R[b[l]]; i++) c[i] = a[i];
                    sort(c + L[b[l]], c + R[b[l]] + 1);
    
    				for (int i = b[l] + 1; i <= b[r] - 1; i++) tag[i] += v;
    
                    for (int i = L[b[r]]; i <= r; i++) a[i] += v;
                    for (int i = L[b[r]]; i <= R[b[r]]; i++) c[i] = a[i];
                    sort(c + L[b[r]], c + R[b[r]] + 1);
                    
                }
            } else {
                int ans = 0;
                if (b[l] == b[r]) {
                    for (int i = l; i <= r; i++) {
                        ans += (v * v > (a[i] + tag[b[l]]));
                    }
                } else {
                    // l ~ R[b[l]] 查询 < v * v - tag[b[l]]
                    for (int i = l; i <= R[b[l]]; i++) {
                        ans += (v * v > (a[i] + tag[b[l]]));
                    }
                    
                    // b[l] + 1 ~ b[r] - 1  这些块内的答案
                    for (int i = b[l] + 1; i <= b[r] - 1; i++) {
                        ans += lower_bound(c + L[i], c + R[i] + 1, v * v - tag[i]) -
                               (c + L[i]);
                    }
    				
    				// L[b[r]] ~ r 查询 < v * v - tag[b[r]]
                    for (int i = L[b[r]]; i <= r; i++) {
                        ans += (v * v > (a[i] + tag[b[r]]));
                    }
                }
                cout << ans << '\n';
            }
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    470
    时间
    500ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    62
    已通过
    14
    上传者