【TFLSnoi李志帅】第⑩+②篇文章---考试题精选

E - 逆置换(进阶习题)

 

输入一个1到n的排列,p1 ,p2, …, pn
即1到n都出现了1次的一个长度为n的数组p。
对于每个满足1 <= i <= n的i,求下标j使得pj = i。

 

1 <= n <= 100000
 

Input第一行一个整数n,表示排列长度 接下来n行,每行一个整数pi,表示排列的内容。Output第一行输出一个排列长度n,为了方便造数据。 输出共n行,其中第i行包含一个整数j,使得pj=i。Sample Input

4
4
3
1
2

Sample Output

4
3
4
2
1



——————————————————————————————————————————————————————————————————————————————————————---------
我之前写的代码:

 

 

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     long long n,m,a[100005],ans[100005];//不必要用long long(应该都知道是改的代码吧
 6     long long sum;
 7     cin>>n;
 8     for(int i=1;i<=n;i++)cin>>a[i];
 9     for(int i=1;i<=n;i++){
10         for(int j=1;j<=n;j++){//因为n<=100000,所以这里双重循环上限是10^10,会超时
11             if(a[j]==i){
12                 ans[i]=j;
13                 break;
14             }
15         }
16     }
17     cout<<n<<endl;
18     for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
19     return 0;
20 }

结果它运行超时了(TAT)

 

后来。。。我把它改成了一重循环,如下图:

 

 

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     long long n;
 6     long long a[100005],b[100005];
 7     cin>>n;
 8     
 9     for(int i=1;i<=n;i++)
10     {
11         cin>>a[i];//边输入,边记录
12         b[a[i]]=i;//注意此处写法,i代表a【i】在数组中的位置
13     }
14     cout<<n<<endl;
15     for(int i=1;i<=n;i++){
16         cout<<b[i]<<endl;
17     }
18     return 0;
19 }

 

诶,满分

 

posted @ 2020-08-20 12:19  九州霜  阅读(130)  评论(0编辑  收藏  举报