もう一度cin coutがscanfとprintfより時間がかかるのを見た.(ファイルの違いに関する比較方法は後述)

6165 ワード

この問題にcin coutを使うと5秒以上かかります.
scanfとprintfに置き換えると、すぐに4以下に下がります.
cin coutに何か同期スイッチがあるみたいでオフにすると速度が後ろに上がる
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

class mylist
{
public:
    list lst;
};

int main()
{
    char cmd[10];
    int n,tem;
    mylist lst[10001];
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",cmd);
        if(strcmp(cmd,"new") == 0)
        {
            scanf("%d",&tem);

        }
        else if(strcmp(cmd,"add") == 0)
        {
            int id,num;
            scanf("%d%d",&id,&num);
            lst[id].lst.push_back(num);
            lst[id].lst.sort();
        }
        else if(strcmp(cmd,"merge") == 0)
        {
            int id1,id2;
            scanf("%d%d",&id1,&id2);
            lst[id1].lst.merge(lst[id2].lst);
        }
        else if(strcmp(cmd,"unique") == 0)
        {
            int id;
            scanf("%d",&id);
            lst[id].lst.unique();
        }
        else if(strcmp(cmd,"out") == 0)
        {
            int id;
            scanf("%d",&id);
            list::iterator i;
            for(i = lst[id].lst.begin(); i != lst[id].lst.end(); ++i)
                cout<

テストデータ
リストは配列を直接定義できると思った
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
std::ios::sync_with_stdio(false);


//class mylist
//{
//public:
//    list lst;
//};

int main()
{
    char cmd[10];
    int n,tem;
    // mylist lst[10001];
    list lst[10001];
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",cmd);
        if(strcmp(cmd,"new") == 0)
        {
            scanf("%d",&tem);

        }
        else if(strcmp(cmd,"add") == 0)
        {
            int id,num;
            scanf("%d%d",&id,&num);
//            lst[id].lst.push_back(num);
//            lst[id].lst.sort();
            lst[id].push_back(num);
            lst[id].sort();
        }
        else if(strcmp(cmd,"merge") == 0)
        {
            int id1,id2;
            scanf("%d%d",&id1,&id2);
//            lst[id1].lst.merge(lst[id2].lst);
            lst[id1].merge(lst[id2]);

        }
        else if(strcmp(cmd,"unique") == 0)
        {
            int id;
            scanf("%d",&id);
            //lst[id].lst.unique();
            lst[id].unique();
        }
        else if(strcmp(cmd,"out") == 0)
        {
            int id;
            scanf("%d",&id);
            list::iterator i;
            for(i = lst[id].begin(); i != lst[id].end(); ++i)
                //cout<

このプログラムのテストに合格した時間は
3424kB
1210ms
1571 B
G++
そのままcin coutでやると同期スイッチを切る時間がないのは
3420kB
2750ms
1116 B
G++
これで同期スイッチを切ると(main関数に入れて)
std::ios::sync_with_stdio(false);

3420kB
2000ms
1154 B
G++
この二つで消すと
      std::cin.sync_with_stdio(false);
      std::cout.sync_with_stdio(false);

3420kB
2040ms
1236 B
G++
両者の差は多くないが、scanfとprintfを直接使うのとでは遅いので、データ量の大きい問題はscanfとprintfでやりましょう.
cinについて、coutとscanf、printfのスピードはいったいどのくらい違いますかこの文章とこの文章を見て、そしてこの文章を見てください.
#include 
#include 
#include 
#include 
#include 

using namespace std;


int main()
{
    string cmd;
    int n;
    list lst[10001];
 //   std::ios::sync_with_stdio(false);
      std::cin.sync_with_stdio(false);
      std::cout.sync_with_stdio(false);

//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    cin>>n;
    while(n--)
    {
        cin>>cmd;
        if(cmd == "new")
        {
            int tem;
            cin>>tem;

        }
        else if(cmd == "add")
        {
            int id,num;
            cin>>id>>num;
            lst[id].push_back(num);
        }
        else if(cmd == "merge")
        {
            int id1,id2;
            cin>>id1>>id2;
            lst[id1].merge(lst[id2]);
        }
        else if(cmd == "unique")
        {
            int id;
            cin>>id;
            lst[id].sort();
            lst[id].unique();
        }
        else if(cmd == "out")
        {
            int id;
            cin>>id;
            list::iterator i;
            lst[id].sort();
            for(i = lst[id].begin(); i != lst[id].end(); ++i)
                cout<

FC[/A][/L][/LBn][/N][/OFF[LINE][/T][/U][/U][/w][drive 1:][path 1]filename 1[drive 2:][path 2]filename 2 FC/B[drive 1:][path 1]filename 1[drive 2:][path 2]filename 2/Aは、それぞれの異なる箇所の最初の行と最後の行のみを表示します./Bはバイナリ比較を行う./C大文字と小文字を区別しない.LファイルをASCII文字として比較する./LBn連続不一致の最大値を指定した行数に設定します.N/N ASCII比較で行数を表示します./OFF[LINE]オフライン属性セットのあるファイルをスキップしないでください.T/Tタブをスペースに拡張しないでください./UファイルをUNICODテキストファイルとして比較する./W比較のために空白(タブとスペース)を圧縮します./nnnn不一致箇所後に連続的に一致する必要がある行数を指定します.[drive 1:][path 1]filename 1は、比較する最初のファイルまたは最初のファイルセットを指定します.[drive 2:][path 2]filename 2は、比較する2番目のファイルまたは2番目のファイルセットを指定します.
1.OJでinをダウンロードする.txtとout.txt、そしてもしあなたがコンパイルしたプログラムがa.exe 2であれば.そ把in.ひtxt,out.txtとa.exeは同じフォルダ(またはデスクトップ)3に入れる.フォルダの空白にshift+を右クリックし、ここでコマンドウィンドウを開く4を選択します.コマンドウィンドウでa.exeを実行し、出力結果を保存するテキストとしてcmdにa.exe out 1.txtを入力します.cmdにfc/a/n outを入力します.txt out1.txt,fcコマンドは、2つのファイルの違いを比較して画面に出力>ファイルを空にする>>ファイルの後ろに追加する
参考資料