#12 #16 #25 #26 S不过,求调
查看原帖
#12 #16 #25 #26 S不过,求调
542680
CuSObin_BiNSO4楼主2023/8/1 23:37
#include<bits/stdc++.h>
#define tnw 100000
#define intt long long
#define bgn mp[xx].begin()
#define ed mp[xx].end()
#define il inline
#define rg register
using namespace std;

vector<int>mp[5*tnw+5];
int n,m,a[tnw+5];
intt bt[tnw+5];

il int read(){
	int x=0;
    char ch=getchar();
    while(!isdigit(ch))
    	ch=getchar();
    while(isdigit(ch)){
    	x=(x<<3)+(x<<1)+(ch^48),
    	ch=getchar();
    }
    return x;
}

il void write(intt xx){
	if(xx>9)write(xx/10);
	putchar(xx%10+'0');
}

il void pout(int id,int xx){
	for(rg int j=1;j*j<=xx;j++){
		if(xx%j)continue;
		mp[j].push_back(id);
		if(xx/j^j)mp[xx/j].push_back(id);
	}
}

il void add(int id,intt xx){
	for(rg int i=id;i<=n;i+=i&-i){
		bt[i]+=xx;
	}
}

il intt sum(int id){
	intt ans=0;
	for(rg int i=id;i>0;i-=i&-i){
		ans+=bt[i];
	}
	return ans;
}

il void rag(int l,int r,int xx){
	vector<int>::iterator frm,tto,gn;
	frm=lower_bound(bgn,ed,l)-1;
	tto=lower_bound(bgn,ed,r+1)-1;
	if(frm+1==ed)return;
	for(gn=tto;gn!=frm;gn--){
		int now=*gn;
		if(a[now]%xx){
			mp[xx].erase(gn);
			continue;
		}
		a[now]/=xx;
		add(now,-a[now]*(xx-1));
		if(a[now]%xx){
			mp[xx].erase(gn);
		}
	}
}

signed main(){
	n=read();m=read();
	for(rg int i=1;i<=n;i++){
		a[i]=read();
		add(i,a[i]);
		pout(i,a[i]);
	}
	while(m--){
		int op,l,r,xx;
		op=read();l=read();r=read();
		if(op==1){
			xx=read();
			if(xx==1||mp[xx].empty())continue;
			rag(l,r,xx);
		}
		else{
			write(sum(r)-sum(l-1));
			putchar('\n');
		}
	}
	return 0;
}

帮忙优化,谢谢。

不理解为什么有一个博主线段树跑得飞快我树状数组直接T飞200ms+

2023/8/1 23:37
加载中...