软件设计 2017-05-08
一开始入c++的时候成天跑cin,cout
直到有一天用cin,cout超时
才知道scanf比cin快的多
但是后来又听说加了ios::sync_with_stdio(false);的cin跟飞一样
那么到底哪个快呢?
咱们来做个小测试
题目选择:https://www.luogu.org/problem/show?pid=3368#sub
树状数组模板2(因为这题数据比较大)
首先是龟速的cin与cout
成功的T掉三个点
=.=
那么scanf呢??
完美的完成任务!!
身负众望的ios::sync_with_stdio(false);呢??
见证奇迹的时刻。。。
速度虽然不及scanf
但是也是可以AC的
另外不得不提一下超神的读入优化
快于scanf
综上所述:
如果实在懒得敲读入优化
还是乖乖的用scanf吧。。
附代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=500001; 6 int n,m; 7 int a[MAXN]; 8 int tree[MAXN]; 9 int lowbit(int p) 10 {return p&(-p);} 11 12 void interval_increase(int x,int v) 13 { 14 for(int i=x;i>0;i=i-lowbit(i)) 15 { 16 tree[i]+=v; 17 } 18 } 19 20 int point_ask(int p) 21 { 22 int ans=a[p]; 23 for(int i=p;i<=n;i=i+lowbit(i)) 24 { 25 ans=ans+tree[i]; 26 } 27 return ans; 28 } 29 int main() 30 { 31 //ios::sync_with_stdio(false); 32 cin>>n>>m; 33 for(int i=1;i<=n;i++) 34 cin>>a[i]; 35 for(int i=1;i<=m;i++) 36 { 37 int how; 38 cin>>how; 39 if(how==1)// 增加 40 { 41 int x,y,v; 42 cin>>x>>y>>v; 43 interval_increase(y,v); 44 interval_increase(x-1,-v); 45 } 46 else 47 { 48 int p; 49 cin>>p; 50 cout<<point_ask(p)<<endl; 51 } 52 } 53 return 0; 54 }龟速的cin
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=500001; 6 int n,m,p; 7 int tree[MAXN];// 8 int lowbit(int p) 9 { 10 return p&(-p); 11 } 12 void point_increase(int w,int v) 13 { 14 for(int i=w;i<=n;i=i+lowbit(i)) 15 tree[i]=tree[i]+v; 16 return ; 17 } 18 int interval_ask(int x) 19 { 20 int ans=0; 21 for(int i=x;i!=0;i=i-lowbit(i)) 22 { 23 ans=ans+tree[i]; 24 } 25 return ans; 26 } 27 int main() 28 { 29 scanf("%d%d",&n,&m); 30 for(int i=1;i<=n;i++) 31 { 32 scanf("%d",&p); 33 point_increase(i,p); 34 } 35 for(int i=1;i<=m;i++) 36 { 37 scanf("%d",&p); 38 if(p==1)// 加 39 { 40 int x,y; 41 scanf("%d%d",&x,&y); 42 point_increase(x,y); 43 } 44 else// 求和 45 { 46 int x,y; 47 scanf("%d%d",&x,&y); 48 printf("%d\n",interval_ask(y)-interval_ask(x-1)); 49 } 50 } 51 return 0; 52 }nice的scanf
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=500001; 6 int n,m; 7 int a[MAXN]; 8 int tree[MAXN]; 9 int lowbit(int p) 10 {return p&(-p);} 11 12 void interval_increase(int x,int v) 13 { 14 for(int i=x;i>0;i=i-lowbit(i)) 15 { 16 tree[i]+=v; 17 } 18 } 19 20 int point_ask(int p) 21 { 22 int ans=a[p]; 23 for(int i=p;i<=n;i=i+lowbit(i)) 24 { 25 ans=ans+tree[i]; 26 } 27 return ans; 28 } 29 int main() 30 { 31 ios::sync_with_stdio(false); 32 cin>>n>>m; 33 for(int i=1;i<=n;i++) 34 cin>>a[i]; 35 for(int i=1;i<=m;i++) 36 { 37 int how; 38 cin>>how; 39 if(how==1)// 增加 40 { 41 int x,y,v; 42 cin>>x>>y>>v; 43 interval_increase(y,v); 44 interval_increase(x-1,-v); 45 } 46 else 47 { 48 int p; 49 cin>>p; 50 cout<<point_ask(p)<<endl; 51 } 52 } 53 return 0; 54 }还不错的cin优化
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=500001; 6 int n,m; 7 int a[MAXN]; 8 int tree[MAXN]; 9 int lowbit(int p) 10 {return p&(-p);} 11 12 int read(int &n) 13 { 14 char ch=' ';int q=0,w=1; 15 for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); 16 if(ch=='-')w=-1,ch=getchar(); 17 for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48; 18 n=q*w; return n; 19 } 20 21 void interval_increase(int x,int v) 22 { 23 for(int i=x;i>0;i=i-lowbit(i)) 24 { 25 tree[i]+=v; 26 } 27 } 28 29 int point_ask(int p) 30 { 31 int ans=a[p]; 32 for(int i=p;i<=n;i=i+lowbit(i)) 33 { 34 ans=ans+tree[i]; 35 } 36 return ans; 37 } 38 int main() 39 { 40 ios::sync_with_stdio(false); 41 read(n); 42 read(m); 43 for(int i=1;i<=n;i++) 44 read(a[i]); 45 for(int i=1;i<=m;i++) 46 { 47 int how; 48 read(how); 49 if(how==1)// 增加 50 { 51 int x,y,v; 52 read(x); 53 read(y); 54 read(v); 55 interval_increase(y,v); 56 interval_increase(x-1,-v); 57 } 58 else 59 { 60 int p; 61 read(p); 62 printf("%d",point_ask(p)); 63 putchar('\n'); 64 } 65 } 66 return 0; 67 }飞速的读入优化