转c++时间:
2017年8月9号
1、记得打头文件
2、=与==的区别(赋值|比较)
3、各种运算符的比较级(与Pascal不同)
*4、在OJ上scanf和printf时间优于cin、cout,但是在c++上差不多
5、用define定义max和min会更快
这样写:
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
其实用define定义大多数东西都要更快(比如lowbit)
如图
6、c++一般爆变量范围和数组范围都不会提示,只是会搞出一些奇怪的结果。
7、c++数组下标最小为0。
8、在if中,可以用=来给变量赋值,不会判错,所以如果==打成=就会错。
9、c++用字符串前要加上using namespace std;
10、c++的字符&&字符串实际都是整数,即该字符的ascii码。
11、c++scanf输入时,变量前要加"&"。
12、c++scanf前要加"%"+该类型对应的字符,否则有可能会出错。
13、printf中\n是换行。
14、cout中 << endl是换行。
15、Pascal中exit是return,halt是exit。break、continue不变。
16、c++中for循环基本相当于pascal的while循环。
17、过程的类型是void。
18、一般来说,c++在代码长度和运行时间都优于Pascal。
19、万能头文件:#include< bits/stdc++.h>
*20、手动O2:
attribute((optimize("-O2")))
加在主程序、子程序前
21、取消同步
ios::sync_with_stdio(false);
加完后可使cin、cout 接近 printf和scanf的速度。
*22、关于程序结尾加不加return 0
见此:https://zhidao.baidu.com/question/374166755.html
最好加上去。
*23、判断C++文件结束
和pascal大致,不过EOF(大写)是一个常量(一般是-1):
当scanf(读入内容)==EOF时表示读到结尾。
见此:https://zhidao.baidu.com/question/393160350.html
*24、C++关闭文件
fclose(cstdin/cstdout);
noip中一定要关
25、C++中用Ctrl+/可以快速注释/恢复一行
方便很多
26、C++bitset用法
可以拿来进行二进制操作
见此:http://blog.csdn.net/qll125596718/article/details/6901935
27、C++快速读入
奇♂妙
inline int getint() { char c; int ret=0, k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) ret=ret*10+c-'0'; return k*ret; }
*28、register是好东西
在变量名前加register,跑得飞快
详细
29、c++自带的东西比一般的要快不然你写的就会成为新的模板
话说之前听别人说c++的快排更慢于是打了将近一年的手打快排
30、FFT循环的顺序不同,在O2模式下时间差异很大
就像这两段代码:
void fft(C a[],int type)
{
for (int i=0; i<N; i++) AA[i]=a[c[i]];
for (int i=0; i<N; i++) a[i]=AA[i];
for (int s=N>>1,S=2,S2=1,i=1; S<=N; i++,S2=S,s>>=1,S<<=1)
{
C W(Cos[i] , Sin[i]*type);
// ①
// C w(1,0);
// fo(j,0,S2-1)
// {
// for (l=j; l<N; l+=S)
// {
// u=a[l];v=w*a[l+S2];
// a[l]=u+v;a[l+S2]=u-v;
// }
// w=w*W;
// }
// ②
for (l=0; l<N; l+=S)
{
C w(1,0);
fo(j,0,S2-1)
{
u=a[l+j];v=w*a[l+j+S2];
a[l+j]=u+v;a[l+j+S2]=u-v;
w=w*W;
}
}
}
}
①是先枚举每个段里的位置,然后一起算。
②是一个段一个段分开来搞。
测试结果发现②跑15000ms,①>20000ms
(bzoj3513: [MUTC2013]idiots)
(但不开O2似乎①更快些)
(可能是因为操作的区间连续?)
31、stable_sort要比sort更快
32、+比-快
33、c++的strlen慢到爆炸(时间与长度成正比)
34、函数记得带返回值(不然有可能本地是对的但交上去是错的)c++会智能地帮你选一个值
*35、c++在本地的随机数范围是\(0\)到\(2^{15}-1\),但在OJ上是\(0\)到\(2^{31}-1\)
http://172.16.0.132/senior/#main/show/3658
的惨痛经历
36、在switch中case :后直接按'{'会自动补上'break;'
37、FFT记得预处理\(\omega\)不然你会体会到什么是绝望
38、c++的除法慢得跟s*it一样,除法能预处理的尽量预处理
39、c++实用的快捷键
选中后按"/"可以整体注释or恢复
按Tab可以整体后移一个Tab,按住Shift+Tab可以整体前移一个Tab
选中后按"Shift"+"Ctrl"+上/下方向键可以整体上/下移
40、记得对拍
*41、善用c++的F5调试(尽管和Pascal的相比就是*)
42、在c++中一行一行复制(不全选)的话中文有概率(?)不会变成乱码其实可以直接保存为txt然后复制
*43、大赛时一定要把所有头文件加上去(有可能编译错误但不提示)
44、用fread读入末尾记得加Ctrl+Z
45、后缀反过来=前缀,看到后缀不要只想到自动机
46、记得考虑特殊值(比如0)
47、类似求最优方案下的最坏可以考虑倒推
48、离散化方格时要考虑两个坐标之间有没有间隙,如果有要加上去
49、线段树合并时要直接合并对应节点,如果要从儿子向上合并可能会挂
49.5、如果一定要从儿子向上合并(如jzoj3397)的话要将最下面的点合并,并且update时要判断儿子是否存在(-2019年7月12日)
50、在树上dfs会爆栈的可以考虑bfs
51、用float时要注意精度52、五年OI一场空,不开long long见祖宗
53、CF貌似不能用M_PI之类的东西
*54、用scanf读入bool类型貌似会挂(可以用int来存)
55、去重/维护栈可以在原数组上维护(省空间)
56、stable_sort有时比sort要快很多(但会占更多空间)
(因为stable_sort用的是归并排序,需要额外长度等于排序长度的空间)
详见https://zh.cppreference.com/w/cpp/algorithm/stable_sort
57、sap跑满后不立刻退出似乎会挂
58、网络流如果两个方向都有边,则可以建在一起(不建反向边),这样可以快一些
*59、关于memset的一些东西(整数与实数的区别)
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
int a[1];
float b[1];
int main()
{
memset(a,1,sizeof(a));printf("%d\n",a[0]);
memset(a,127,sizeof(a));printf("%d\n",a[0]);
memset(a,128,sizeof(a));printf("%d\n",a[0]);
memset(a,255,sizeof(a));printf("%d\n",a[0]);
memset(b,1,sizeof(b));printf("%0.20f\n",b[0]);
memset(b,127,sizeof(b));printf("%0.20f\n",b[0]);
memset(b,128,sizeof(b));printf("%0.20f\n",b[0]);
memset(b,254,sizeof(b));printf("%0.20f\n",b[0]);
memset(b,255,sizeof(b));printf("%0.20f\n",b[0]);
}
输出:
16843009
2139062143
-2139062144
-1
0.00000000000000000000
339615136492207134461438014706212143104.00000000000000000000
-0.00000000000000000000
-169473953031737902729750710990328037376.00000000000000000000
nan
结论:
c++中整数的赋值,127和128是极值,255是-1
而实数的赋值则是127和254是极值,1和128是清零,255是nan
c++头文件
精简版
#include <iostream>
#include <cstdlib>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
int main()
{
freopen("文件名.in","r",stdin);
freopen("文件名.out","w",stdout);
fclose(stdin);
fclose(stdout);
return 0;
}
完整版
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std;
__attribute__((optimize("-O2")))
inline int getint() { char c; int ret=0, k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) ret=ret*10+c-'0'; return k*ret; }
int main()
{
ios::sync_with_stdio(false);
freopen("文件名.in","r",stdin);
freopen("文件名.out","w",stdout);
fclose(stdin);
fclose(stdout);
return 0;
}
O3系列
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")