分块100分hack2没过,玄关求调……
查看原帖
分块100分hack2没过,玄关求调……
936616
zibenlun楼主2024/6/29 08:27
#include<bits/stdc++.h>
#define ll long long
// #define int long long
#define int_128 __int128
using namespace std;
struct nd{
	int l,r;
    long long maxx,minn=1e18;
    long long sum;
}c[10005];
int len;
int n,m;
long long a[1000005];
int pos[1000005];
void add(int l,int r,int x){
	for(int i=l;i<=r;i++){
		if(c[pos[i]].l==i&&c[pos[i]].r<=r){
			c[pos[i]].sum+=x;
			i=c[pos[i]].r;
            c[pos[i]].maxx+=x;
            c[pos[i]].minn+=x;
		}
		else {
			a[i]+=x;
            c[pos[i]].maxx=max(c[pos[i]].maxx,a[i]+c[pos[i]].sum);
		}
	}
}
int ask(int l,int r,int x){
	int cnt=0;
	for(int i=l;i<=r;i++){
        if(c[pos[i]].l==i&&c[pos[i]].r<=r){
            if(c[pos[i]].maxx<x){
                i=c[pos[i]].r;
                continue;
            }
            else if(c[pos[i]].minn>=x){
                i=c[pos[i]].r;
                cnt+=c[pos[i]].r-c[pos[i]].l+1;
                continue;
            }
        }
		if(a[i]+c[pos[i]].sum>=x) {
			cnt++;
		}
	}
	return cnt;
}
signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	len=sqrt(n); 
    if(len>n) len=n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		pos[i]=i/len+(i%len!=0);
		if(i%len==1){
			c[pos[i]].l=i;
		}
		c[pos[i]].r=i;
        c[pos[i]].minn=min(c[pos[i]].minn,a[i]);
        c[pos[i]].maxx=max(c[pos[i]].maxx,a[i]);
	}
	for(int i=1;i<=m;i++){
		char op;
		int l,r;
        long long x;
		cin>>op>>l>>r>>x;
		if(op=='A'){
			cout<<ask(l,r,x)<<"\n";
		}
		else {
			add(l,r,x);
		}
	}
	return 0;
}

2024/6/29 08:27
加载中...