• A. Tokitsukaze and Strange Inequality(前缀和+桶)


    Problem - 1677A - Codeforces

     

    时津风有一个长度为n的排列组合p。回顾一下,长度为n的排列组合p是由n个不同的整数组成的序列p1,p2,...,pn,每个整数从1到n(1≤pi≤n)。

    她想知道在这个排列组合中,有多少个不同的指数图组[a,b,c,d](1≤a不等式。

    papd。
    请注意,如果a1≠a2或b1≠b2或c1≠c2或d1≠d2,两个图元[a1,b1,c1,d1]被认为是不同的。

    输入
    第一行包含一个整数t(1≤t≤1000)--测试案例的数量。每个测试用例由两行组成。

    第一行包含一个整数n(4≤n≤5000)--包络的长度p。

    第二行包含n个整数p1,p2,...,pn(1≤pi≤n)--包络p。

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

    输出
    对于每个测试案例,打印一个整数--不同的[a,b,c,d]图组的数量。

    例子
    输入复制
    3
    6
    5 3 6 1 4 2
    4
    1 2 3 4
    10
    5 1 6 2 8 3 4 10 9 7
    输出拷贝
    3
    0
    28
    注意
    在第一个测试案例中,有3个不同的[a,b,c,d]图组。

    p1=5, p2=3, p3=6, p4=1,其中p1p4满足不等式,所以[a,b,c,d]图组中的一个是[1,2,3,4]。

    同样地,另外两个图元是[1,2,3,6],[2,3,5,6]。

    题解:
    我们可以枚举b,过程中,利用桶排的思想把对b前面的数标记,利用前缀和,找到,b后面的数c有多少个是大于a的res,然后在内部循环,c后面的数,找到大于当前b的加上,然后更新res,因为b后面的数可以成为d,也可以为c

    (说的有点乱,具体代码有体现)

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. #define int long long
    10. //1 1 3 3 3
    11. int n,ans;
    12. int a[200050];
    13. int tong[5005];
    14. int d[5005];
    15. void solve()
    16. {
    17. int n;
    18. cin >> n;
    19. for(int i = 1;i <= n;i++)
    20. cin >> a[i],tong[i] = 0;
    21. int ans = 0,res;
    22. for(int i = 2;i < n-1;i++)(枚举b的位置)
    23. {
    24. tong[a[i-1]]++;(对a的位置进行桶排标记)
    25. for(int j = 1;j <= n;j++)
    26. {
    27. d[j] = d[j-1] + tong[j];(统计每个位置大于前面的有几个数)
    28. }
    29. res = d[a[i+1]];//得到c大于a的个数
    30. for(int j = i+2;j <= n; j++)//枚举d
    31. {
    32. if(a[i] > a[j])//如果b > d
    33. {
    34. ans += res;
    35. }
    36. res += d[a[j]];//更新res如果a[j]前面有数,说明这个数也可以a[j]也可以为c
    37. }
    38. }
    39. cout<<ans<<"\n";
    40. }
    41. signed main()
    42. {
    43. int t = 1;
    44. cin >> t;
    45. while(t--)
    46. {
    47. solve();
    48. }
    49. }
    50. //2 5
    51. //3
    52. //9 7
    53. //2 3 4 3
    54. //1 2 3 4 5
    55. // 3

  • 相关阅读:
    Java 中的 Iterator 迭代器详解
    VBA学习(17):使用条件格式制作Excel聚光灯
    GO学习之 goroutine的调度原理
    德国激荡50年的荆棘之路
    这个需求怎么做java面试题
    13.前端笔记-CSS-盒子样式应用(圆角、阴影)
    【数据挖掘】生成模型和判别模型的区别及优缺点
    患上肝内胆管结石症状有哪些?
    Eureka服务注册与发现
    【多线程案例】Java实现线程池
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/128018545