為什么在被強調的printf所在的這個for回圈內加入任意一句printf(可輸出也可不輸出任何東西),才能得到正常的結論??而不加printf會得到奇奇怪怪的答案,而回圈中所使用的plustree這個函式,如果沒有那個printf就會出錯
(原題非公開題目,所以不能展示,這個代碼有部分資料是沒通過的)
如果有大佬能幫我指出代碼里面的的其他錯誤就更好了

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int L=0,R=1;
struct Seg{
int l,r;
int son[2];
int plusm=0;
}c[400005];
int f[200005],s[200005],cnts=0;
int n,m,a[200005],cnt=1;;
void buildtree(int k,int l,int r){
//printf("k%d %d %d\n",k,l,r);
c[k].l=l;c[k].r=r;
if(l==r) return;
int mid=(l+r)/2;
cnt++;c[k].son[L]=cnt;
buildtree(c[k].son[L],l,mid);
cnt++;c[k].son[R]=cnt;
buildtree(c[k].son[R],mid+1,r);
return;
}
void addtree(int k,int l,int r,int v){
if(c[k].l==l&&c[k].r==r){
c[k].plusm+=v;
return;
}
int mid=(c[k].l+c[k].r)/2;
//printf("--%d %d %d %d\n",k,l,r,mid);
if(l<=mid) addtree(c[k].son[L],l,min(mid,r),v);
if(r>mid) addtree(c[k].son[R],max(mid+1,l),r,v);
}
int plustree1(int k,int j){
if(c[k].l==c[k].r){
printf("k=%d-plustree函式回傳值 %d\n",k,c[k].plusm);//測驗代碼
return c[k].plusm;
}
int q;
int mid=(c[k].l+c[k].r)/2;
if(j<=mid) q+=plustree1(c[k].son[L],j);
else q+=plustree1(c[k].son[R],j);
printf("k=%d-plustree函式回傳值 %d\n",k,c[k].plusm+q);//測驗代碼
return c[k].plusm+q;
}
int main(){
f[0]=f[1]=1;
for(int i=2;i<=200005;++i) f[i]=f[i-1]+f[i-2];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
int root=1;
buildtree(root,1,n);
for(int ii=1;ii<=m;++ii){
int t;
scanf("%d",&t);
if(t==1){
int x,v;
scanf("%d%d",&x,&v);
a[x]=v-plustree1(1,x);
}
if(t==2){
int l,r,su=0;
scanf("%d%d",&l,&r);
int v=r-l;
int suj[205];//suj用于紀錄su的變化
for(int i=0;i<=v;++i){
su+=(f[i]*(a[l+i]+plustree1(1,l+i)))%1000000000;
su%=1000000000;printf("");//就是這個printf<<<<<<<<<<<<<<<<<
suj[i]=su;
}
printf("suj陣列用于紀錄su的變化:\n");
for(int i=0;i<=v;++i){
printf("suj[%d]=%d\n",i,suj[i]);
}
cnts++;
s[cnts]=su;//printf("%d\n",su);
}
if(t==3){
int l2,r2,d;
scanf("%d%d%d",&l2,&r2,&d);
addtree(1,l2,r2,d);
}
}
for(int i=1;i<=cnts;++i){
if(i!=1) printf("\n");
printf("%d",s[i]);
}
return 0;
}
以下是樣例資料:
5 4
1 3 1 2 4
3 1 4 1
2 2 4
1 2 10
2 1 5
樣例正確答案:
12
45
加入了這個printf的程式結果:

沒加這個printf的程式結果:
uj5u.com熱心網友回復:
f[0]=f[1]=1;
for(int i=2;i<=200005;++i) f[i]=f[i-1]+f[i-2];//這里早突破極限了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261115.html
標籤:C++ 語言
