分块0分 tle球调
查看原帖
分块0分 tle球调
590571
_weishiqi66_楼主2024/5/13 17:36

提交记录

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

const int N=1E6;
int n,t,a[N],pos[N],ll[N],rr[N],sum[N],f1[N];

inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0') {
		if(ch=='-') f=-1;
		x=x*10+ch-'0';
	}
	while(ch<='9'&&ch>='0') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

inline void change(int l,int r) {
	int p=pos[l],q=pos[r];
	if(p==q) {
		if(f1[q]==1) return;
		for(int i=l;i<=r;i++) sum[p]-=a[i], a[i]=sqrt(a[i]), sum[p]+=a[i];
		if(sum[q]==rr[q]-ll[q]+1) f1[q]=1;
	}
	else {
		if(f1[p]!=1)for(int i=l;i<=rr[p];i++) sum[p]-=a[i], a[i]=sqrt(a[i]), sum[p]+=a[i];
		if(f1[q]!=1)for(int i=ll[q];i<=r;i++) sum[q]-=a[i], a[i]=sqrt(a[i]), sum[q]+=a[i];
		if(sum[p]==rr[p]-ll[p]+1) f1[p]=1;
		if(sum[q]==rr[q]-ll[q]+1) f1[q]=1;
		for(int i=p+1;i<q;i++) {
		 	if(f1[i]==1) continue;
			for(int j=ll[i];j<=rr[i];j++) 
			 	sum[i]-=a[j], a[j]=sqrt(a[j]), sum[i]+=a[j];
			if(sum[i]==rr[i]-ll[i]+1)	f1[i]=1;
		}
	}
}

inline int ask(int l,int r) {
	int p=pos[l],q=pos[r],s=0;
	if(p==q) {
		for(int i=l;i<=r;i++) s+=a[i];
		return s;
	}
	else {
		for(int i=l;i<=rr[p];i++) s+=a[i];
		for(int i=ll[q];i<=r;i++) s+=a[i];
		for(int i=p+1;i<q;i++)  s+=sum[i];
		return s;
	}
}

signed main() {
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	t=sqrt(n);
	for(int i=1;i<=t;i++) ll[i]=(i-1)*t+1, rr[i]=i*t;
	if(rr[t]<n) ++t, ll[t]=rr[t-1]+1, rr[t]=n;
	for(int i=1;i<=t;i++) {
		for(int j=ll[i];j<=rr[i];j++) pos[j]=i, sum[i]+=a[j];
	}
	int T=read();
	while(T--) {
		int op=read(),l=read(),r=read();
		if(l>r) swap(l,r);
		if(op==0) change(l,r);
		else cout<<ask(l,r)<<endl;
	}
	return 0;
}
2024/5/13 17:36
加载中...