• Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional


    翻译:

    Polycarp是伯兰ICPC区域活动的组织者。伯兰有𝑛所大学,编号从1到𝑛。波利卡普认识这个地区所有有竞争力的程序员。有𝑛学生:𝑖-th学生在大学注册𝑢𝑖,有编程技能𝑠𝑖。

    Polycarp现在必须决定规则。特别是团队成员的数量。

    波利卡普知道,如果他选择团队的规模为某个整数𝑘,每个大学将把他们的𝑘最强(具有最高编程技能的𝑠)的学生派到第一个团队,然后把下一个𝑘最强的学生派到第二个团队,以此类推。如果剩下的学生少于𝑘,那么就不能组建团队。请注意,可能有些大学没有派出任何团队。

    该地区的实力是所有参赛队伍成员的技能总和。如果没有队伍在场,那么强度为0。

    帮助Polycarp找到每个选择𝑘从1到𝑛的区域的强度。

    输入
    第一行包含单个整数𝑡(1≤𝑡≤1000)—测试用例的数量。

    每个测试用例的第一行包含单个整数𝑛(1≤𝑛≤2⋅105)——大学数量和学生数量。

    每个测试用例的第二行包含𝑛整数𝑢1,𝑢2,…,𝑢𝑛(1≤𝑢𝑖≤𝑛)—𝑖-th学生就读的大学。

    每个测试用例的第三行包含𝑛整数𝑠1,𝑠2,…,𝑠𝑛(1≤𝑠𝑖≤109)-这是𝑖-th学生的编程技能。

    𝑛在所有测试用例上的总和不超过2⋅105。

    输出
    对于每个测试用例,打印𝑛整数:区域的强度—当前团队成员的总技能—对于每个团队规模的选择𝑘。

    例子
    inputCopy
    4
    7
    1 2 1 2 1 2 1 2 1
    6 8 3 1 5 1 5
    10
    1 1 1 2 2 2 2 2 3 3 3
    3435 3014 2241 2233 2893 2102 2286 2175 1961 2567
    6
    3 3 3 3 3 3 3 3 3
    5 9 6 7 9 7
    1
    1
    3083
    outputCopy
    29 28 26 19 0 0
    24907 20705 22805 9514 0 0 0 0 0 0 0
    43 43 43 32 38 43
    3083
    请注意
    在第一个测试用例中,每个𝑘的每个大学的团队是:

    𝑘= 1:
    大学1:[6],[5],[5],[3];
    大学2:[8],[1],[1];
    𝑘= 2:
    大学1:[6,5],[5,3];
    大学2:[8,1];
    𝑘= 3:
    大学1:[6,5,5];
    大学二:[8,1,1];
    𝑘= 4:
    大学1:[6,5,5,3];

    思路:

    每个大学都有不同的人数,强度要最强1~n次询问,所以我们要先预处理出来,让每次查询是O1。我们可以排序,然后用前缀和,来记录每个学校的团队,对于多出来的人,最后取余减一下,就能得出来该学校k个人组成的团队的值。然后我们对学校的数量和人数进行遍历,然后让符合的每个都加上,因为n过大,直接遍历肯定会TLE。

    代码:

    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. struct we{
    41. int x;
    42. ll y;
    43. }c[200005];
    44. bool cmp(we a,we b){
    45. return a.y>b.y;
    46. }
    47. ll an[200005],jj;
    48. vectorq[200005];
    49. void solv(){
    50. cin>>n;
    51. for (int i =1; i<=n; i++) {
    52. q[i].clear();
    53. q[i].push_back(0);
    54. an[i]=0;
    55. }
    56. int xu=-1;
    57. for (int i =1; i<=n; i++) {
    58. cin>>c[i].x;
    59. xu=max(xu, c[i].x);
    60. }
    61. for (int i =1; i<=n; i++) {
    62. cin>>c[i].y;
    63. }
    64. sort(c+1, c+1+n, cmp);
    65. for (int i =1; i<=n; i++) {
    66. q[c[i].x].push_back(c[i].y+q[c[i].x][q[c[i].x].size()-1]);
    67. }
    68. for (int i =1; i<=n; i++) {
    69. for (int k=1; k<=xu; k++) {
    70. if (q[k].size()<=i) {
    71. continue;
    72. }
    73. if (i==1) {
    74. an[i]+=q[k][q[k].size()-1];
    75. continue;
    76. }
    77. // printf("%d %lld \n",i,an[i]);
    78. // printf("%lld\n",q[k][q[k].size()-q[k].size()%i]);
    79. an[i]+=q[k][q[k].size()-1-(q[k].size()-1)%i];
    80. // printf("%d %lld \n",i,an[i]);
    81. }
    82. printf("%lld ",an[i]);
    83. }printf("\n");
    84. }
    85. int main(){
    86. ios::sync_with_stdio(false);
    87. cin.tie(); cout.tie();
    88. cin>>t;
    89. while (t--) {
    90. solv();
    91. }
    92. return 0;
    93. }
    94.  

  • 相关阅读:
    Java多线程之常用的相关方法总结(线程停止、线程休眠、线程礼让、线程优先级、守护线程等等)
    守护健康之光 —— 小脑萎缩患者的生活指南
    基于linux开发的实现类似unix的文件系统
    一文搞懂传统单节点网站的 Serverless 上云
    【Rust笔记】浅聊 Rust 程序内存布局
    计算机竞赛 深度学习实现行人重识别 - python opencv yolo Reid
    【计算机网络笔记九】I/O 多路复用
    Postgresql源码(88)简单复习HOT更新流程
    Java开发学习(二十四)----SpringMVC设置请求映射路径
    【C#语言】DataGridView隔行显示颜色
  • 原文地址:https://blog.csdn.net/weixin_63555280/article/details/128115878