各種注意事項(還有c++的一些操作)

轉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++在本地的隨機數範圍是0021512^{15}-1,但在OJ上是0023112^{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、網絡流如果兩個方向都有邊,則可以建在一起(不建反向邊),這樣可以快一些

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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章