• D. Divide and Sum(组合数学)


    Problem - 1445D - Codeforces

    题意:

    给你一个长度为2n的数组a。考虑将数组a划分为两个子序列p和q,每个子序列的长度为n(数组a的每个元素应该正好在一个子序列中:要么在p中,要么在q中)。

    让我们以非递减顺序对p进行排序,以非递增顺序对q进行排序,我们可以分别用x和y来表示排序后的版本。那么一个分区的成本被定义为f(p,q)=∑ni=1|xi-yi|。

    求数组a所有正确分区的f(p,q)之和。由于答案可能太大,请打印其余数,即998244353。

    输入
    第一行包含一个整数n(1≤n≤150000)。

    第二行包含2n个整数a1,a2,...,a2n(1≤ai≤109)--数组a的元素。

    输出
    打印一个整数 - 问题的答案,模数998244353。

    例子
    输入复制
    1
    1 4
    outputCopy
    6
    输入副本
    2
    2 1 2 1
    输出拷贝
    12
    输入复制
    3
    2 2 2 2 2 2
    输出拷贝
    0
    输入复制
    5
    13 8 35 94 9284 34 54 69 123 846
    输出拷贝
    2588544
    注意
    如果一个数组的两个分区包含在子序列p中的元素索引集不同,则认为是不同的。

    在第一个例子中,有两个正确的数组a的分区。

    p=[1], q=[4], 那么x=[1], y=[4], f(p,q)=|1-4|=3;
    p=[4], q=[1], then x=[4], y=[1], f(p,q)=|4-1|=3.
    在第二个例子中,数组a有六个有效分区。

    p=[2,1], q=[2,1](原数组中指数为1和2的元素在子序列p中被选中)。
    p=[2,2], q=[1,1];
    p=[2,1], q=[1,2](在子序列p中选择指数为1和4的元素)。
    p=[1,2], q=[2,1];
    p=[1,1], q=[2,2];
    p=[2,1], q=[2,1](指数为3和4的元素在子序列p中被选中)。

    题解:
    题意很简单,本题关键处在于能否看出构建出的序列得到的之都相等

    我们列几个例子就可以发现

    //1 2 3 4 5 6
    //3 2 1
    //4 5 6    9

    //6 2 1
    //3 4 5    9

    只要是符合的结果肯定都一样

    先排序一下计算,得出一个的成本

    剩下的就是看有多少种情况即可,从2*n里去n个,答案很明显,组合数

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<map>
    4. #include<queue>
    5. #include<vector>
    6. #include<cstring>
    7. #include<stack>
    8. using namespace std;
    9. long long n;
    10. long long a[400000];
    11. long long fac[400000];
    12. long long infac[400000];
    13. int mod = 998244353;
    14. long long qpow(long long a,long long x)
    15. {
    16. long long ans = 1;
    17. while(x)
    18. {
    19. if(x&1)
    20. ans = ans*a%mod;
    21. a = a*a%mod;
    22. x = x/2;
    23. }
    24. return ans;
    25. }
    26. void solve()
    27. {
    28. int n;
    29. cin >> n;
    30. for(int i = 1;i <= n*2;i++)
    31. cin >> a[i];
    32. sort(a+1,a+1+2*n);
    33. long long ans = 0;
    34. for(int i = 1;i <= n;i++)
    35. {
    36. ans = (ans+a[i+n]-a[i]+mod)%mod;
    37. }
    38. infac[1] = 1;
    39. fac[1] = 1;
    40. for(int i = 2;i <= 2*n;i++)
    41. {
    42. fac[i] = (fac[i-1]*i)%mod;
    43. infac[i] = infac[i-1]*qpow(i,mod-2)%mod;
    44. }
    45. cout<<ans*fac[2*n]%mod*infac[n]%mod*infac[n]%mod;
    46. }
    47. int main()
    48. {
    49. int t = 1;
    50. // cin >> t;
    51. while(t--)
    52. {
    53. solve();
    54. }
    55. }
    56. //1 2 3 4 5 6
    57. //3 2 1
    58. //4 5 6 9
    59. //6 2 1
    60. //3 4 5
    61. //c 5 2
    62. //a5 / a2 a3


     

  • 相关阅读:
    model_state_dict网络部分参数的更新
    22级第三次比赛题解
    hibernate源码(2)--- springboot-jpa是如何引入的
    对中纠偏系统比例伺服阀放大器
    rollout
    C++ 深拷贝、浅拷贝
    微信小程序名称、简称设置规范
    requests处理 multipart/form-data 请求以及 boundary值问题
    Python if-for-while使用
    Spring Cloud父子容器及容器的启动源码
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127924351