社区讨论

TLE+MLE+RE求助

P3987我永远喜欢珂朵莉~参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m0gpz9u8
此快照首次捕获于
2024/08/30 20:58
2 年前
此快照最后确认于
2024/08/30 21:50
2 年前
查看原帖
RT
感觉完全炸掉了
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=5e5+5,MAXL=1e5+5;
ll n,m;
int a[MAXL];
vector<int> S[MAXN],dsu[MAXN];
inline int find(int num,int now){
	return (now==dsu[num].size()||now==dsu[num][now])?now:dsu[num][now]=find(num,dsu[num][now]);
}
ll bit[MAXL];
inline int lowbit(int num){
	return num&-num;
}
inline void add(int pos,int num){
	while(pos<=n){
		bit[pos]+=num;
		pos+=lowbit(pos);
	}
	return;
}
inline ll sum(int pos){
	ll ans=0;
	while(pos){
		ans+=bit[pos];
		pos-=lowbit(pos);
	}
	return ans;
}
int op,l,r,x;
inline int update(int L,int R,int X){
	int pos=lower_bound(S[X].begin(),S[X].end(),L)-S[X].begin();
	for(int i=find(X,pos);i<S[X].size()&&S[X][i]<=R;i=find(X,i+1)){
		if(!(a[S[X][i]]%X)){
			add(S[X][i],a[S[X][i]]/X-a[S[X][i]]);
			a[S[X][i]]/=X;
		}
		if(a[S[X][i]]%X)dsu[X][i]=dsu[X][i+1];
	}
}
inline ll query(int L,int R){
	return sum(R)-sum(L-1);
}
const int size=(1<<20)+1;
char buf[size],*p1=buf,*p2=buf;
char buffer[size];
int op1=-1;
const int op2=size-1;
inline char readchar() {
	if(p1!=p2) {
		return *p1++;
	}
	return p1==(p2=(p1=buf)+fread(buf,1,size-1,stdin))?EOF:*p1++;
}
inline void flush() {
	fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
	if(op1==op2) flush();
	buffer[++op1]=x;
}
#ifndef ONLINE_JUDGE
#define readchar getchar
#endif
#define putchar writechar
inline int read() {
	int s=1,c=readchar(),x=0;
	while(c<=32) {
		c=readchar();
	}
	if(c=='-') {
		s=-1,c=readchar();
	}
	for(; ('0'<=c && c<='9'); c=readchar()) {
		x=x*10+c-'0';
	}
	return x*s;
}
inline void write(long long x) {
	if(x<0) {
		writechar('-'),x=-x;
	}
	char s[25];
	int n=0;
	while(x || !n) {
		s[n++]='0'+x%10,x/=10;
	}
	while(n--) {
		writechar(s[n]);
	}
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		ll lim=sqrt(a[i]);
		for(int j=1;j<=lim;j++){
			if(!(a[i]%j)){
				S[j].push_back(i);
				dsu[j].push_back(dsu[j].size());
				if(j*j<a[i]){
					S[a[i]/j].push_back(i);
					dsu[a[i]/j].push_back(dsu[a[i]/j].size());
				}
			}
		}
		add(i,a[i]);
	}
	for(int i=1;i<=m;i++){
		op=read();
		if(op==1){
			l=read(),r=read(),x=read();
			update(l,r,x);
		}
		else{
			l=read(),r=read();
			write(query(l,r));
			putchar('\n');
		}
	}
	flush();
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...