社区讨论

求助scanf printf导致MLE的问题

P1253扶苏的问题参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhjaazdp
此快照首次捕获于
2025/11/03 23:17
4 个月前
此快照最后确认于
2025/11/03 23:17
4 个月前
查看原帖
如题,此题我使用scanf printf进行输入输出时全部测试点MLE,但改为cin cout后即可AC
不知道是为什么,有哪位大佬可以解答一下吗 评测记录如图
两份代码如下: scanf
CPP
#include<bits/stdc++.h>
#define inf 1e16
using namespace std;
const int N=1e6+10;
struct node{
	long long add,Max,change;
	bool cg;
}t[N*5];
int n,m;
long long a[N];
void pushup(int x){
	t[x].Max=max(t[x<<1].Max,t[x<<1|1].Max);
}
void pushdown(int x,int l,int r){
	int mid=(l+r)>>1;
	if(t[x].cg){
		t[x<<1].Max=t[x].change,t[x<<1].change=t[x].change;
		t[x<<1|1].Max=t[x].change,t[x<<1|1].change=t[x].change;
		t[x<<1].cg=1,t[x<<1|1].cg=1;
		t[x].cg=0,t[x].add=0;
	}else{
		if(t[x<<1].cg){
			t[x<<1].change+=t[x].add;
			t[x<<1].Max+=t[x].add;
		}else{
			t[x<<1].add+=t[x].add;
			t[x<<1].Max+=t[x].add;
		}
		if(t[x<<1|1].cg){
			t[x<<1|1].change+=t[x].add;
			t[x<<1|1].Max+=t[x].add;
		}else{
			t[x<<1|1].add+=t[x].add;
			t[x<<1|1].Max+=t[x].add;
		}
		t[x].add=0;
	}
	
}
void build(int x,int l,int r){
	if(l==r){
		t[x].Max=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid),build(x<<1|1,mid+1,r);
	pushup(x);
}
void ADD(int x,int l,int r,int ql,int qr,long long k){
	if(ql>r) return;
	if(qr<l) return;
	if(ql<=l&&qr>=r){
		if(t[x].cg){
			t[x].change+=k;
			t[x].Max+=k;
		}else{
			t[x].add+=k;
			t[x].Max+=k;
		}
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	ADD(x<<1,l,mid,ql,qr,k);
	ADD(x<<1|1,mid+1,r,ql,qr,k);
	pushup(x);
}
void CHANGE(int x,int l,int r,int ql,int qr,long long k){
	if(ql>r) return;
	if(qr<l) return;
	if(ql<=l&&qr>=r){
		t[x].cg=1;
		t[x].change=k;
		t[x].add=0;
		t[x].Max=k;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	CHANGE(x<<1,l,mid,ql,qr,k);
	CHANGE(x<<1|1,mid+1,r,ql,qr,k);
	pushup(x);
}
long long query(int x,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r) return t[x].Max;
	int mid=(l+r)>>1;
	long long res=-inf;
	pushdown(x,l,r);
	if(ql<=mid) res=max(res,query(x<<1,l,mid,ql,qr));
	if(qr>mid) res=max(res,query(x<<1|1,mid+1,r,ql,qr));
	pushup(x);
	return res;
}
int main(){
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	while(m--){
		int opt=0,L=0,R=0;long long K=0;
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld %lld %lld",&L,&R,&K);
			CHANGE(1,1,n,L,R,K);
		}else if(opt==2){
			scanf("%lld %lld %lld",&L,&R,&K);
			ADD(1,1,n,L,R,K);
		}else{
			scanf("%lld %lld",&L,&R);
			printf("%lld\n",query(1,1,n,L,R));
		}
	}
	return 0;
} 
/*
1 4 7 2 9
1 3 3 -5 7
*/
cin
CPP
#include<bits/stdc++.h>
#define inf 1e16
using namespace std;
const int N=1e6+10;
struct node{
	long long add,Max,change;
	bool cg;
}t[N*5];
int n,m;
long long a[N];
void pushup(int x){
	t[x].Max=max(t[x<<1].Max,t[x<<1|1].Max);
}
void pushdown(int x,int l,int r){
	int mid=(l+r)>>1;
	if(t[x].cg){
		t[x<<1].Max=t[x].change,t[x<<1].change=t[x].change;
		t[x<<1|1].Max=t[x].change,t[x<<1|1].change=t[x].change;
		t[x<<1].cg=1,t[x<<1|1].cg=1;
		t[x].cg=0,t[x].add=0;
	}else{
		if(t[x<<1].cg){
			t[x<<1].change+=t[x].add;
			t[x<<1].Max+=t[x].add;
		}else{
			t[x<<1].add+=t[x].add;
			t[x<<1].Max+=t[x].add;
		}
		if(t[x<<1|1].cg){
			t[x<<1|1].change+=t[x].add;
			t[x<<1|1].Max+=t[x].add;
		}else{
			t[x<<1|1].add+=t[x].add;
			t[x<<1|1].Max+=t[x].add;
		}
		t[x].add=0;
	}
	
}
void build(int x,int l,int r){
	if(l==r){
		t[x].Max=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid),build(x<<1|1,mid+1,r);
	pushup(x);
}
void ADD(int x,int l,int r,int ql,int qr,long long k){
	if(ql>r) return;
	if(qr<l) return;
	if(ql<=l&&qr>=r){
		if(t[x].cg){
			t[x].change+=k;
			t[x].Max+=k;
		}else{
			t[x].add+=k;
			t[x].Max+=k;
		}
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	ADD(x<<1,l,mid,ql,qr,k);
	ADD(x<<1|1,mid+1,r,ql,qr,k);
	pushup(x);
}
void CHANGE(int x,int l,int r,int ql,int qr,long long k){
	if(ql>r) return;
	if(qr<l) return;
	if(ql<=l&&qr>=r){
		t[x].cg=1;
		t[x].change=k;
		t[x].add=0;
		t[x].Max=k;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	CHANGE(x<<1,l,mid,ql,qr,k);
	CHANGE(x<<1|1,mid+1,r,ql,qr,k);
	pushup(x);
}
long long query(int x,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r) return t[x].Max;
	int mid=(l+r)>>1;
	long long res=-inf;
	pushdown(x,l,r);
	if(ql<=mid) res=max(res,query(x<<1,l,mid,ql,qr));
	if(qr>mid) res=max(res,query(x<<1|1,mid+1,r,ql,qr));
	pushup(x);
	return res;
}
int main(){
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		int opt=0,L=0,R=0;long long K=0;
		cin>>opt;
		if(opt==1){
			cin>>L>>R>>K;
			CHANGE(1,1,n,L,R,K);
		}else if(opt==2){
			cin>>L>>R>>K;
			ADD(1,1,n,L,R,K);
		}else{
			cin>>L>>R;
			cout<<query(1,1,n,L,R)<<"\n";
		}
	}
	return 0;
} 
/*
1 4 7 2 9
1 3 3 -5 7
*/

回复

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

正在加载回复...