分块求助
  • 板块学术版
  • 楼主vectorxyz
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/24 21:12
  • 上次更新2024/7/24 22:38:49
查看原帖
分块求助
1114241
vectorxyz楼主2024/7/24 21:12

https://loj.ac/p/6278

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 5e5 + 5;
int st[N], ed[N], a[N], pos[N], sum[N], add[N], b[N];

void update(int x, int y, int c)
{
    int p = pos[x], q = pos[y];
    if(p == q)
    {
        for(int i = x;i <= y;i ++ ) a[i] += c;
        for(int i = st[p];i <= ed[p];i ++ ) b[i] = a[i];
        sort(b + st[p], b + ed[p] + 1);
    }
    else 
    {
        for(int i = p + 1;i < q;i ++ ) add[i] += c;
        for(int i = x;i <= ed[p];i ++ ) a[i] += c;
        for(int i = st[p];i <= ed[p];i ++ ) b[i] = a[i];
        sort(b + st[p], b + ed[p] + 1);
        for(int i = st[q];i <= y;i ++ ) a[i] += c;
        for(int i = st[q];i <= ed[q];i ++ ) b[i] = a[i];
        sort(b + st[q], b + ed[q] + 1);
    }
}

int mid_find(int val, int x)
{
    int l = st[x], r = ed[x];
    int ans = 0;
    while(l <= r)
    {
        int mid = (l + r) / 2;
        if(a[mid] < val) {
            ans = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    return ans;
}

int query(int x, int y, int val)
{
    int p = pos[x], q = pos[y];
    int ans = 0;
    if(p == q)
    {
        for(int i = x;i <= y;i ++ ) {
            if(a[i] + add[p] < val) ans ++ ;
        }
    }
    else {
        for(int i = p + 1;i < q;i ++ ) ans += mid_find(val - add[i], i);
        for(int i = x;i <= ed[p];i ++ ){
            if(a[i] + add[p] < val) ans ++ ;
        }
        for(int i = st[q];i <= y;i ++ ) {
            if(a[i] + add[q] < val) ans ++ ;
        }
    }
    return ans;
}

signed main(){
    int n; cin >> n;

    for(int i = 1;i <= n;i ++ ) cin >> a[i],b[i] = a[i];
    int block = sqrt(n);
    int cnt = n / block;
    if(n % block) cnt ++ ;
    for(int i = 1;i <= cnt;i ++ ) st[i] = (i - 1) * block + 1, ed[i] = i * block;
    ed[cnt] = n;
    for(int i = 1;i <= cnt;i ++ ){
        for(int j = st[i];j <= ed[i];j ++ ) pos[j] = i;
    }
    for(int i = 1;i <= cnt;i ++ ) sort(b + st[i],b + ed[i] + 1);
    while(n -- )
    {
        int k, l, r, c;
        cin >> k >> l >> r >> c;
        if(k == 0){
            update(l, r, c);
        }
        else {
            cout << query(l, r, c * c) << endl;
        }
    }
    return 0;
}
2024/7/24 21:12
加载中...