请教时间复杂度问题
查看原帖
请教时间复杂度问题
372172
Q__A__Q楼主2023/8/14 22:50

单点修改但是优化,理论上应该不会tle吧

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

const int maxn=3e5+10;
const int inf=1e9+7;
int n,m,ans,a[maxn],sum[maxn<<2],nxt[maxn],pre[maxn],cnt[maxn];

inline int read() {
	int s=0,w=1;
	char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(isdigit(ch)) s=s*10+ch-'0',ch=getchar();
	return s*w;
}

inline void write(int x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}

inline void pushup(int rt) {
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

inline void build(int rt,int l,int r) {
	if(l==r) {
		sum[rt]=a[l];
		return;
	}
	int m=(l+r)>>1;
	build(rt<<1,l,m);
	build(rt<<1|1,m+1,r);
	pushup(rt);
}

inline void update(int rt,int l,int r,int x,int c) {
	if(l==r) {
		sum[rt]=c;
		return;
	}
	int m=(l+r)>>1;
	if(m>=x) update(rt<<1,l,m,x,c);
	else update(rt<<1|1,m+1,r,x,c);
	pushup(rt);
}

inline int query(int rt,int l,int r,int x,int y) {
	if(l==r) {
		return sum[rt];
	}
	int m=(l+r)>>1;
	int ans=0;
	if(x<=m) ans+=query(rt<<1,l,m,x,y);
	if(y>m) ans+=query(rt<<1|1,m+1,r,x,y);
	return ans;
}

signed main() {
	n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	build(1,1,n);
	for(int i=1;i<=n;++i) nxt[i]=i+1,pre[i]=i-1;
	m=read();
	while(m--) {
		int opt=read(),l=read(),r=read();
		if(l>r) swap(l,r);
		if(opt==1) {
			write(query(1,1,n,l,r));
			puts("");
		}
		else {
			for(int i=l;i<=r;i=nxt[i]) {
				a[i]=(int)sqrt(a[i]);
				update(1,1,n,i,a[i]);
				cnt[i]++;
				if(cnt[i]>=6) {
					nxt[pre[i]]=nxt[i];
					pre[nxt[i]]=pre[i];
				}
			}
		}
	}
	return 0;
}
2023/8/14 22:50
加载中...