• C. k-Amazing Numbers(思维)


    Problem - 1417C - Codeforces

     

    给你一个由1到n个整数组成的数组a。

    让我们把数组的k-amazing数定义为出现在数组所有长度为k的子段中的最小数字(记得长度为k的a的子段是a的连续部分,正好包含k个元素)。如果在所有长度为k的子段中没有整数出现,那么k-amazing的数字就是-1。

    对于从1到n的每一个k,计算数组a的k-amazing数。

    输入
    第一行包含一个整数t(1≤t≤1000)--测试案例的数量。接着是t个测试用例。

    每个测试用例的第一行包含一个整数n(1≤n≤3⋅105)--数组中的元素数。第二行包含n个整数a1,a2,...,an(1≤ai≤n)--数组中的元素。

    保证所有测试案例的n之和不超过3⋅105。

    输出
    对于每个测试案例打印n个整数,其中第i个整数等于数组的第i个整数。

    例子
    input
    3
    5
    1 2 3 4 5
    5
    4 4 4 4 2
    6
    1 3 1 5 3 1
    输出
    -1 -1 3 2 1 
    -1 4 4 4 2 
    -1 -1 1 1 1 1 

    题解:

    根据题意让我们找所有长度[1,n]的字段的共有元素最小值,如果没有共有元素输出-1

    我们可以转换一下题意,我们先不考虑一段的最小值,我们考虑相同的数之间相差最大的距离,

    两个相同数之间的距离的最大值不就是我们要找的k吗

    得到ans[距离最大值] = i

    然后找相同距离最大值中最小的i不就是我们所求结果

    最后对于长度大的一定覆盖长度小的子段,所以还要看一下比较一下长度大的子段最小值与长度小的字段最小值

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<map>
    4. #include<queue>
    5. #include<vector>
    6. #include<cstring>
    7. using namespace std;
    8. int a[300050];
    9. int ans[300050];
    10. vector<int> p[300050];
    11. void solve()
    12. {
    13. int n;
    14. cin >> n;
    15. for(int i = 1;i <= n;i++)
    16. {
    17. p[i].clear();
    18. }
    19. for(int i = 1;i <= n;i++)
    20. {
    21. ans[i] = 1e9;
    22. int x;
    23. cin >> x;
    24. p[x].push_back(i);
    25. }
    26. ans[0] = 1e9;
    27. for(int i = 1;i <= n;i++)
    28. {
    29. if(p[i].size())
    30. {
    31. int mx = 0;
    32. for(int j = 1;j < p[i].size();j++)
    33. {
    34. mx = max(mx,p[i][j]-p[i][j-1]);
    35. }
    36. mx = max(mx,p[i].front());
    37. mx = max(mx,n-p[i].back()+1);
    38. ans[mx] = min(ans[mx],i);
    39. }
    40. }
    41. for(int i = 1;i <= n;i++)
    42. {
    43. ans[i] = min(ans[i-1],ans[i]);
    44. }
    45. for(int i = 1;i <= n;i++)
    46. {
    47. if(ans[i] == 1e9)
    48. {
    49. cout<<"-1 ";
    50. }
    51. else
    52. {
    53. cout<<ans[i]<<" ";
    54. }
    55. }
    56. cout<<"\n";
    57. }
    58. int main()
    59. {
    60. int t = 1;
    61. cin >> t;
    62. while(t--)
    63. {
    64. solve();
    65. }
    66. }
    67. //
    68. //

     

  • 相关阅读:
    Spring Boot发送QQ邮件
    关于jQuery_DOM操作中的添加,删除,替换标签方法
    C语言for语句
    【MATLAB源码-第68期】基于matlab的802.11b 11Mbps CCK调制解调误码率仿真。
    Thinkpad E430c使用u盘安装系统
    Auto.js中的一般全局函数
    Java8 lamda函数式编程,常用的Consumer/Function/Operator/Supplier/Predicate
    腾讯云轻量应用服务器使用场景列举说明
    未来数据库需要关心的硬核创新
    string类模拟实现
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127885368