/*
HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3
题意:
给出排列 a[N],求所有区间的第k大数之和
N <= 5e5, k <= 80
分析:
先求出每个数的位置pos[]数组
然后维护一个单调链表,按数字从大到小向里面加该数字的位置
即对于i的位置 pos[i] 找到链表中比它大的第一个位置和比它小的第一个位置,将pos[i]加到两个之间
这部分用set实现,复杂度 O(nlogn) 则对于数字i,链表中所有的位置均为比i大的数的位置
然后滑动窗口更新答案
即维护 l,r,要求 l 到 r 之间包含 pos[i] 且恰好 k 个数,这个时候 i 就是第k小
复杂度 O(nk) 总复杂度 O(nlogn + nk)
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int t, n, k;
int a[N], pos[N];
int pre[N], nxt[N];
set<int> st;
set<int>::iterator it;
long long ans;
void solve(int x)
{
int l, r, lx, rx, cnt = k-1;
l = r = x;
while (cnt && pre[l] != 0) l = pre[l], cnt--;
while (cnt && nxt[r] != n+1) r = nxt[r], cnt--;
while (l != nxt[x])
{
lx = l-pre[l];
rx = nxt[r]-r;
ans += (long long)lx * rx * a[x];
if (nxt[r] == n+1) break;
l = nxt[l];
r = nxt[r];
}
}
int main()
{
scanf("%d", &t);
while (t--)
{
st.clear();
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
{
scanf("%d", a+i);
pos[a[i]] = i;
}
pre[n+1] = 0;
nxt[0] = n+1;
st.insert(0);
st.insert(n+1);
ans = 0;
for (int i = n; i >= 1; i--)
{
it = st.lower_bound(pos[i]);
nxt[pos[i]] = *it;
pre[*it] = pos[i];
--it;
pre[pos[i]] = *it;
nxt[*it] = pos[i];
if (n-i+1 >= k) solve(pos[i]);
st.insert(pos[i]);
}
printf("%lld\n", ans);
}
}

  

最新文章

  1. c++保留小数问题,如有不足或错误,欢迎指出
  2. 练习1-23:删去C语言程序中所有的注释语句(C程序设计语言 第2版)
  3. Lattice 的 Framebuffer IP核使用调试笔记之IP核生成与参数设置
  4. Clr Via C#读书笔记---程序集的加载和反射
  5. solr与.net系列课程(一)solr的安装与配置
  6. Android Studio使用教程(二)
  7. div+css的前端工程师的价值体现在哪些方面?
  8. ECMAScript 6 模块简介
  9. SRM 601 DIV1
  10. Mysql update 错误
  11. 金融管理 - MBA智库百科
  12. 计算BMI
  13. UILabel-UITextField-UIBotton&amp;nbsp;UI_…
  14. 【freeradius2.x】 安装和学习
  15. Springboot 系列(十)使用 Spring data jpa 访问数据库
  16. shell脚本if语句的多种条件参数
  17. [C#.net]SqlDataAdapter 执行超时已过期 完成操作之前已超时或服务器未响应
  18. vuejs 1.x - 实例:搜索过滤
  19. 完全二叉树的节点个数 Count Complete Tree Nodes
  20. 2017/2/10:Manven简介与项目管理(入门)

热门文章

  1. SVN常用命令--Mac端【转载】
  2. iframe/frameset/frame的区别
  3. 网络编程[第二篇]基于udp协议的套接字编程
  4. 第9章:Python自动化管理
  5. JAVA中线程到底起到什么作用!
  6. Java集合--Hash、Hash冲突
  7. DDD 理解
  8. 一次解决黑帽SEO的经历
  9. 【ES6 】ES6 解构赋值--对象解构赋值
  10. 二元变量图形的pandas方法