社区讨论
求助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 条回复,欢迎继续交流。
正在加载回复...