你問的問題滿有深度的
A.1
因為C++的Cin/Cout為了能相容C的IO函數(輸入/輸出函數),會採取一個叫與"同步"的動作,這個動作會執行一個flush,而flush是非常緩慢的函數,這也導致了cin/cout的速度遠慢於scanf/printf,但是這個動作是可以取消的!
在程式的第一行加上這一句:
[C++] 純文本查看 復制代碼 ios::sync_with_stdio(false);
就可以取消了。但是取消後,就不再保證scanf/cout混用時的輸出會是正確的,所以你就不能再用scanf輸出。
此外還有一些的地方會執行flush,如 cout<<endl; 打比賽時請不要使用,尤其在非常大的輸出量時。因此我們採用cout<<'\n';來取代。另一個是在cin<<X的時候,為了在你輸入前能把所有資料顯示,也會使用flush,這裡可以用
cin.tie(0);
cin.tie(nullptr); //C++11
來關閉這一個功能,如此一來,你的cin/cout就能大幅改善其執行效率了。
A2.
你先看看這篇資料
http://www.csie.ntnu.edu.tw/~u91029/SequenceManipulation.html
A3.A4
等你學多一點再來討論吧,這需要很多前置的概念才能解釋
我們社課的投影片
http://forum.tfcis.org/thread-177-1-2.html
排序是我們高一上社課內容,圖論/線段樹是下學期/暑假的課程
|