一开始入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 #include2 #include 3 #include 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 else47 {48 int p;49 cin>>p;50 cout< <
1 #include2 #include 3 #include 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 }
1 #include2 #include 3 #include 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 else47 {48 int p;49 cin>>p;50 cout< <
1 #include2 #include 3 #include 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 else59 {60 int p;61 read(p);62 printf("%d",point_ask(p));63 putchar('\n');64 }65 }66 return 0;67 }