分块求调,教主的魔法90pts
  • 板块学术版
  • 楼主zhanglh
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/9/11 19:27
  • 上次更新2024/9/11 22:09:06
查看原帖
分块求调,教主的魔法90pts
726862
zhanglh楼主2024/9/11 19:27

WA on #1 #11

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#define ll long long

using namespace std;

const ll P=998244353;
const ll inv=299473306;

int n, q, B;
ll a[1000010],base[1000010];
vector<int> b;

void update(int l, int r, ll c){
    int idl = l/B, idr = r/B;
    if (idl==idr){
        for (int i = l; i <= r; i++){
            a[i]+=c;
            b[i]=a[i];
        }
        sort(b.begin()+idl*B, b.begin()+(idl+1)*B);
    } else{
        for (int i = l; i < (idl+1)*B; i++){
            a[i]+=c;
            b[i]=a[i];
        }
        sort(b.begin()+idl*B, b.begin()+(idl+1)*B);
        for (int i = idr*B; i <= r; i++){
            a[i]+=c;
            b[i]=a[i];
        }
        sort(b.begin()+idr*B, b.begin()+(idr+1)*B);
        for (int i = idl+1; i < idr; i++) base[i]+=c;
    }
}

ll query(int l, int r, ll c){
    ll cnt = 0;
    int idl = l/B, idr = r/B;
    if (idl==idr){
        for (int i = l; i <= r; i++)
            if (a[i]+base[idl]>=c) cnt++;
    } else{
        for (int i = l; i < (idl+1)*B; i++)
            if (a[i]+base[idl]>=c) cnt++;
        for (int i = idr*B; i <= r; i++)
            if (a[i]+base[idr]>=c) cnt++;
        for (int i = idl+1; i < idr; i++)
            cnt+=B-(lower_bound(b.begin()+i*B, b.begin()+(i+1)*B, c-base[i])-(b.begin()+i*B));
    }
    return cnt;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>q;
	B=sqrt(n);
	for (int i = 0; i < n; i++){
	    cin>>a[i];
	    b.push_back(a[i]);
	}
	for (int i = 0; i <= (n-1)/B; i++) sort(b.begin()+i*B, b.begin()+min((i+1)*B, n));
	while(q--) {
	    char op; int l, r; ll c;
	    cin>>op>>l>>r>>c;
	    l--; r--;
	    if (op=='M') update(l,r,c);
	    else cout<<query(l,r,c)<<'\n';
	}
	return 0;
}
2024/9/11 19:27
加载中...