首页 > 代码库 > YT14-HDU-找循环节 (关于std::ios::sync_with_stdio(false);的作用和疑问)

YT14-HDU-找循环节 (关于std::ios::sync_with_stdio(false);的作用和疑问)

Problem Description

技术分享

As a unicorn, the ability of using magic is the distinguishing feature among other kind of pony. Being familiar with composition and decomposition is the fundamental course for a young unicorn. Twilight Sparkle is interested in the decomposition of permutations. A permutation of a set S = {1, 2, ..., n} is a bijection from S to itself. In the great magician —— Cauchy‘s two-line notation, one lists the elements of set S in the first row, and then for each element, writes its image under the permutation below it in the second row. For instance, a permutation of set {1, 2, 3, 4, 5} σ can be written as:

技术分享

Here σ(1) = 2, σ(2) = 5, σ(3) = 4, σ(4) = 3, and σ(5) = 1.
Twilight Sparkle is going to decompose the permutation into some disjoint cycles. For instance, the above permutation can be rewritten as:

技术分享

Help Twilight Sparkle find the lexicographic smallest solution. (Only considering numbers).

Input

Input contains multiple test cases (less than 10). For each test case, the first line contains one number n (1<=n<=10^5). The second line contains n numbers which the i-th of them(start from 1) is σ(i).

Output

For each case, output the corresponding result.

Sample Input

5
2 5 4 3 1
3
1 2 3

Sample Output

(1 2 5)(3 4)
(1)(2)(3)

原代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
const int NUM=100000;
using namespace std;
int main()
{
    int i,j,n,m;
    int a[NUM];
    while(cin>>n)
    {
        for(i=1; i<=n; i++)
            cin>>a[i];
        for(i=1; i<=n; i++)
        {
            while(a[i])
            {
                cout<<"("<<i;
                j=a[i];
                a[i]=0;
                while(a[j])
                {
                    cout<<" "<<j;
                    m=a[j];
                    a[j]=0;
                    j=m;
                }
                cout<<")";
            }
        }
        cout<<endl;
    }
    return 0;
}

AC代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
const int NUM=100000;
using namespace std;
int main()
{
    std::ios::sync_with_stdio(false);
    int i,j,n,m;
    int a[NUM];
    while(cin>>n)
    {
        for(i=1; i<=n; i++)
            cin>>a[i];
        for(i=1; i<=n; i++)
        {
            while(a[i])
            {
                cout<<"("<<i;
                j=a[i];
                a[i]=0;
                while(a[j])
                {
                    cout<<" "<<j;
                    m=a[j];
                    a[j]=0;
                    j=m;
                }
                cout<<")";
            }
        }
        cout<<endl;
    }
    return 0;
}

运行结果:


技术分享

提交自己的代码之后经常是Time Limit Exceeded。

看网上找代码的时候别人用的通常都是C语言的scanf和printf输入输出,一直以为那是C语言的代码,但这次偶然看到了同学的代码(和我“抄”得居然是同一个。。。老师教导我们要”抄“之有道)但其用了

于是百度了一下:

cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几。

又学到了一手,最近做题总算出现时间超限,以后就不用担心了。不过不知道

std::ios::sync_with_stdio(false);

有什么弊端,


YT14-HDU-找循环节 (关于std::ios::sync_with_stdio(false);的作用和疑问)