• Codeforces Round #721 (Div. 2) C. Sequence Pair Weight


    翻译:

    序列的权值定义为具有相同值(𝑎𝑖=𝑎𝑗)的无序索引对(𝑖,𝑗)(这里𝑖<𝑗)的数量。例如,序列𝑎=[1,1,2,2,1]的权值为4。具有相同值的无序索引对的集合是(1,2),(1,5),(2,5)和(3,4)。

    给您一个𝑛整数的序列𝑎。打印𝑎的所有子段的权重之和。

    序列𝑏是序列𝑎的子段,如果可以通过删除开始部分的几个(可能是零或全部)元素和结束部分的几个(可能是零或全部)元素从𝑎获得𝑏。

    输入
    每个测试包含多个测试用例。第一行包含测试用例的数量𝑡(1≤𝑡≤105)。测试用例的描述如下。

    每个测试用例的第一行包含一个整数𝑛(1≤𝑛≤105)。

    每个测试用例的第二行包含𝑛整数𝑎1,𝑎2,…,𝑎𝑛(1≤𝑎𝑖≤109)。

    可以保证所有测试用例中𝑛的总和不超过105。

    输出
    对于每个测试用例,打印一个整数—𝑎的所有子段的权值之和。

    例子
    inputCopy
    2
    4
    1 2 1 1
    4
    1 2 3 4
    outputCopy
    6
    0
    请注意
    在测试用例1中,序列[1,2,1,1]的大小大于1的所有可能的子段为:
    [1,2]有0个有效的无序对;
    [2,1]有0个有效的无序对;
    [1,1]具有1个有效的无序对;
    [1,2,1]具有1个有效的无序对;
    [2,1,1]具有1个有效的无序对;
    [1,2,1,1]有3个有效的无序对。
    答案是6。
    在测试用例2中,序列的所有元素都是不同的。因此,对于任何子数组,都没有具有相同值的有效无序对。答案是0。

    思路:所有子段可能,因为有有效的的无序对,对答案才有贡献。然后是所以子段和,我们可以分别对两边进行扩展,这样就是左右两边相乘,累加,就可以得出答案。

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace::std;
    15. typedef long long ll;
    16. int n,t;
    17. inline __int128 read(){
    18. __int128 x = 0, f = 1;
    19. char ch = getchar();
    20. while(ch < '0' || ch > '9'){
    21. if(ch == '-')
    22. f = -1;
    23. ch = getchar();
    24. }
    25. while(ch >= '0' && ch <= '9'){
    26. x = x * 10 + ch - '0';
    27. ch = getchar();
    28. }
    29. return x * f;
    30. }
    31. inline void print(__int128 x){
    32. if(x < 0){
    33. putchar('-');
    34. x = -x;
    35. }
    36. if(x > 9)
    37. print(x / 10);
    38. putchar(x % 10 + '0');
    39. }
    40. ll w;
    41. void solv(){
    42. mapq;
    43. cin>>n;
    44. ll ans=0;
    45. for (int i =1; i<=n; i++) {
    46. cin>>w;
    47. ans+=q[w]*(n-i+1);
    48. q[w]+=i;
    49. }
    50. printf("%lld\n",ans);
    51. }
    52. int main(){
    53. ios::sync_with_stdio(false);
    54. cin.tie(); cout.tie();
    55. cin>>t;
    56. while (t--) {
    57. solv();
    58. }
    59. return 0;
    60. }
    61.  

  • 相关阅读:
    量化投资工具-AKShare是如何进行投资交易的?
    民安智库(第三方社会评估调研公司)华为Mate60Pro携麒麟芯片回归
    linux 用户名和密码的处理
    ubuntu下的GDB的基本使用及CMake设置调试
    使用 2 个 HSplitView 在 swiftUI 中创建一个 3 窗格界面
    2022/8/17 考试总结
    【Linux--进程间通信】
    修改Docker镜像默认下载地址
    PMP每日一练 | 考试不迷路-7.6
    初识C++多态
  • 原文地址:https://blog.csdn.net/weixin_63555280/article/details/128116845