zoukankan      html  css  js  c++  java
  • 【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 }

    诶,满分

  • 相关阅读:
    樊登读书 认知天性
    【笔记】Tapable源码解析图以及webpack怎样实现一个插件plugin
    web前端使用mcg-helper代码生成工具学习笔记
    博客记录
    15ISK 驱动 BIOS等
    蒙特卡洛方法和蒙特卡洛树搜索
    求最大k个数
    求阶乘的位数和后缀0个数
    五分钟看懂一致性哈希算法
    Windows下查看GPU(NVIDIA)使用情况
  • 原文地址:https://www.cnblogs.com/TFLSc1908lzs/p/13534343.html
Copyright © 2011-2022 走看看