1. /*
  2. HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3
  3. 题意:
  4. 给出排列 a[N],求所有区间的第k大数之和
  5. N <= 5e5, k <= 80
  6. 分析:
  7. 先求出每个数的位置pos[]数组
  8. 然后维护一个单调链表,按数字从大到小向里面加该数字的位置
  9. 即对于i的位置 pos[i] 找到链表中比它大的第一个位置和比它小的第一个位置,将pos[i]加到两个之间
  10. 这部分用set实现,复杂度 O(nlogn)
  11.  
  12. 则对于数字i,链表中所有的位置均为比i大的数的位置
  13. 然后滑动窗口更新答案
  14. 即维护 l,r,要求 l 到 r 之间包含 pos[i] 且恰好 k 个数,这个时候 i 就是第k小
  15. 复杂度 O(nk)
  16.  
  17. 总复杂度 O(nlogn + nk)
  18. */
  19. #include <bits/stdc++.h>
  20. using namespace std;
  21. const int N = 5e5+5;
  22. int t, n, k;
  23. int a[N], pos[N];
  24. int pre[N], nxt[N];
  25. set<int> st;
  26. set<int>::iterator it;
  27. long long ans;
  28. void solve(int x)
  29. {
  30. int l, r, lx, rx, cnt = k-1;
  31. l = r = x;
  32. while (cnt && pre[l] != 0) l = pre[l], cnt--;
  33. while (cnt && nxt[r] != n+1) r = nxt[r], cnt--;
  34. while (l != nxt[x])
  35. {
  36. lx = l-pre[l];
  37. rx = nxt[r]-r;
  38. ans += (long long)lx * rx * a[x];
  39. if (nxt[r] == n+1) break;
  40. l = nxt[l];
  41. r = nxt[r];
  42. }
  43. }
  44. int main()
  45. {
  46. scanf("%d", &t);
  47. while (t--)
  48. {
  49. st.clear();
  50. scanf("%d%d", &n, &k);
  51. for (int i = 1; i <= n; i++)
  52. {
  53. scanf("%d", a+i);
  54. pos[a[i]] = i;
  55. }
  56. pre[n+1] = 0;
  57. nxt[0] = n+1;
  58. st.insert(0);
  59. st.insert(n+1);
  60. ans = 0;
  61. for (int i = n; i >= 1; i--)
  62. {
  63. it = st.lower_bound(pos[i]);
  64. nxt[pos[i]] = *it;
  65. pre[*it] = pos[i];
  66. --it;
  67. pre[pos[i]] = *it;
  68. nxt[*it] = pos[i];
  69. if (n-i+1 >= k) solve(pos[i]);
  70. st.insert(pos[i]);
  71. }
  72. printf("%lld\n", ans);
  73. }
  74. }

  

HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3的更多相关文章

  1. HDU 6058 Kanade's sum —— 2017 Multi-University Training 3

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. hdu 6058 Kanade's sum(模拟链表)

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  3. HDU 6058 Kanade's sum 二分,链表

    Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...

  4. 【链表】2017多校训练三 HDU 6058 Kanade's sum

    acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...

  5. HDU - 6058 Kanade's sum

    Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6058 /* 思路是:找出每个x为第k大的区间个数有多少 用pos[i]保存当前x的位置, ...

  6. 2017ACM暑期多校联合训练 - Team 3 1003 HDU 6058 Kanade's sum (模拟)

    题目链接 Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest elem ...

  7. hdu 6058 Kanade's sum (计算贡献,思维)

    题意: 给你一个全排列,要你求这个序列的所有区间的第k大的和 思路:比赛的时候一看就知道肯定是算贡献,也知道是枚举每个数,然后看他在多少个区间是第K大,然后计算他的贡献就可以了,但是没有找到如何在o( ...

  8. HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3

    思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ]  |  2017 Multi-University Training Conte ...

  9. HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3

    /* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...

随机推荐

  1. kafka producer partitions分区器(七)

    消息在经过拦截器.序列化后,就需要确定它发往哪个分区,如果在ProducerRecord中指定了partition字段,那么就不再需要partitioner分区器进行分区了,如果没有指定,那么会根据k ...

  2. [转帖]Google Chrome 解决 “您的连接不是私密连接”

    Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持 自己搭建了 k8s的 dashboard 结果 chrome 最新版本的打不开了.. 百度了下 园友的解决方案很完美 这里面转 ...

  3. redis集群(多机)分布

    一.实现原理 一致性哈希算法(Consistent Hashing): http://www.zsythink.net/archives/1182 二.配置两个redis服务,端口号要不一致 三.代码 ...

  4. Linux系列(12)之例行工作调度

    你知道工作调度有哪几种吗? 你知道在进行工作调度时需要哪些服务在运行吗? 你知道突发性工作调度的指令at的用法吗? 知道如何管理at的工作调度吗? 知道at指令进行工作调度的原理吗? 知道什么是背景任 ...

  5. python并发编程之多进程(实践篇)

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了multiproce ...

  6. 让 history 命令显示日期和时间

    echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile source /etc/profile

  7. Wannafly挑战赛2D Delete (最短路好题)

    大意: 给定DAG, 给定点$S,T$, 每次询问给出点$x$, 求删除$x$后的$S->T$的最短路, 询问之间独立. 删除点$x$的最短路一定要经过一条边$(u,v)$, 满足$u$拓扑序在 ...

  8. 数据库(mysql和oracle)

    1.   mysql索引:    https://www.jikewenku.com/22030.html 2.

  9. JArray

    [{ "A001033": "", ", ", ", ", ", ", ", " ...

  10. hdu 2767 强连通缩点处理加边问题

    #include <cstring> #include <cstdlib> #include <cstdio> 缩点的好处就是可以将乱七八糟的有向图 转化为无环的有 ...