【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 }
诶,满分