萌新刚学分块1ms,求调TLE
查看原帖
萌新刚学分块1ms,求调TLE
578029
ivyjiao楼主2024/10/14 19:29
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+1;
int n,cnt,op,q,x,y,k,a[N],b[N],L[N],R[N],bel[N],blo;
void build(int n){
    blo=sqrt(n);
    cnt=(n+blo-1)/blo;
    for(int i=1;i<=cnt;i++){
        L[i]=(i-1)*blo+1;
        R[i]=i*blo;
    }
    R[cnt]=n;
    for(int i=1;i<=n;i++) bel[i]=(i-1)/blo+1;
    for(int i=1;i<=n;i++) b[i]=a[i];
    for(int i=1;i<=cnt;i++) sort(b+L[i],b+R[i]+1);
}
void cov(int x,int k){
    a[x]=k;
    for(int i=L[bel[x]];i<=R[bel[x]];i++) b[i]=a[i];
    sort(b+L[bel[x]],b+R[bel[x]]+1);
    return;
}
int qsum(int x,int y,int k){
    int ans=0;
	if(bel[x]==bel[y]){
		for(int i=x;i<=y;i++) ans+=a[i]>=k;
		return ans;
	}
	for(int i=x;i<=R[bel[x]];i++) ans+=a[i]>=k;
	for(int i=L[bel[y]];i<=y;i++) ans+=a[i]>=k;
    for(int i=bel[x]+1;i<=bel[y]-1;i++)
    for(int i=bel[x]+1;i<=bel[y]-1;i++) ans+=R[i]-(lower_bound(b+L[i],b+R[i]+1,k)-b)+1;
    return ans;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(n);
	cin>>q;
    while(q--){
        cin>>op>>x>>y;
        if(!op){
            cin>>k;
            cout<<qsum(x,y,k)<<'\n';
        }
        else cov(x,y);
    }
}
2024/10/14 19:29
加载中...