分块50pts求查错
查看原帖
分块50pts求查错
352426
就决定是你辣楼主2022/9/20 16:48

rt 输出内容和答案在后几位有出入,loj上已通过

#include <bits/stdc++.h>
#define int long long
 
using namespace std;
int n;
int block[100200];
int a[100055], b[100005], lazy[1005];
int sum[1005];
int L[1005], R[1005], tot = 0;
void change(int l,int r,int c){
	if(b[l]==b[r]){
		for(int i=l;i<=r;i++){
			sum[b[i]]=sum[b[i]]-a[i]+sqrt(a[i]);
			a[i]=sqrt(a[i]);
		}
		return ;
	}
	for(int i=l;i<=R[b[l]];i++){
		sum[b[i]]=sum[b[i]]-a[i]+sqrt(a[i]);
		a[i]=sqrt(a[i]);
	}
	for(int i=b[l]+1;i<=b[r]-1;i++){
		if(!lazy[i]){
			int ssr=0;
			for(int j=L[i];j<=R[i];j++){
				sum[i]=sum[i]-a[j]+sqrt(a[j]);
				a[j]=sqrt(a[j]);
				if(a[j]>1)ssr=1;
			}
			if(!ssr)lazy[i]=1;
		}
	} 
	for(int i=L[b[r]];i<=r;i++){
		sum[b[i]]=sum[b[i]]-a[i]+sqrt(a[i]);
		a[i]=sqrt(a[i]);
	}
}
int get(int l,int r,int c){
	int ans=0;
	if(b[l]==b[r]){
		for(int i=l;i<=r;i++){
			ans+=a[i];
		}
		return ans;
	}
	for(int i=b[l]+1;i<b[r];i++){
		ans+=sum[i];
	}
	
	for(int i=l;i<=R[b[l]];i++){
		ans+=a[i];
	}
	for(int i=L[b[r]];i<=r;i++){
		ans+=a[i];
	}
	return ans;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int m;
	cin>>m;
	tot=sqrt(n);
	for(int i=1;i<=tot;i++){
		L[i]=(i-1)*tot+1;
		R[i]=i*tot; 
	}
	if(R[tot]<n){
		tot++;
		R[tot]=n;
		L[tot]=R[tot-1]+1;
	}
	for(int i=1;i<=tot;i++){
		for(int j=L[i];j<=R[i];j++){
			b[j]=i;
			sum[i]+=a[j];
		}
	}
	for(int i=1;i<=m;i++){
		int opt,l,r,c=0;
		cin>>opt>>l>>r;
		if(l>r)swap(l,r); 
		if(!opt){
			change(l,r,c);
		}
		else {
			cout<<get(l,r,c)<<endl;
		}
	}
}
2022/9/20 16:48
加载中...