思路:

令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2。整体对价值二分,求能满足sum{v[l, r](0<= l <= r < n) <= val} >= k的最小的val即为第k小的区间价值。

在统计满足条件的区间个数的时候,可以用动态规划,令dp[i]表示v[0, i],则

dp[i+1] = dp[i] + {0~i-1位置a[i]出现的次数},再利用尺取法在迭代的过程中累加价值不超过val的区间个数。

还可用离散化的技巧预处理,将数据范围压缩到0~n-1。

时间复杂度O(n*log(n))。

实现:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f3f3f3f3f; int t, n, k, a[], num[];
map<int, int> mp; bool check(ll val)
{
for (int i = ; i < n; i++)
{
num[i] = ;
}
ll ans = , sum = ;
int start = ;
for (int i = ; i < n; i++)
{
sum += num[a[i]];
num[a[i]]++;
while (sum > val && start <= i)
{
sum -= --num[a[start]];
start++;
}
ans += i - start + ;
}
return ans >= k;
} int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d %d", &n, &k);
int cnt = ;
for (int i = ; i < n; i++)
{
scanf("%d", &a[i]);
if (mp.count(a[i]))
a[i] = mp[a[i]];
else
{
mp[a[i]] = cnt++;
a[i] = cnt - ;
}
}
mp.clear();
ll l = , r = (ll)n * (n - ) / , res = INF;
while (l <= r)
{
ll m = (l + r) >> ;
if (check(m))
{
res = m;
r = m - ;
}
else
{
l = m + ;
}
}
printf("%lld\n", res);
}
return ;
}

最新文章

  1. XSS Filter Evasion Cheat Sheet 中文版
  2. [LintCode] Trapping Rain Water
  3. How Tomcat Works(十)
  4. memcached linux / win32 1.4.13
  5. 教程-FastReport 的安装 心得
  6. [置顶] 【Git入门之十四】Git GUI
  7. C++在设计和使用智能指针
  8. PHP容器--Pimple运行流程浅析
  9. memcached企业面试题
  10. 说说struts2中拦截器的请求流程一(模拟大致流程)
  11. [Swift]LeetCode832. 翻转图像 | Flipping an Image
  12. Cordova IOT Lesson002
  13. C#中存储数据的集合:数组、集合、泛型、字典
  14. 在GDAL中添加GDALRasterizeGeometriesBuf函数
  15. JPA使用指南 javax.persistence的注解配置讲解
  16. HDU4287
  17. BZOJ1251序列终结者——非旋转treap
  18. unicodedata.normalize()/使用strip()、rstrip()和lstrip()/encode和decode 笔记(具体可看 《Python Cookbook》3rd Edition 2.9~2.11)
  19. Asp.net WebAPi gzip压缩和json格式化
  20. plsql连接远程oracle和like无法查询中文问题

热门文章

  1. jeesite快速开发平台
  2. Lightoj 1012 - Guilty Prince
  3. YTU 1010: 目标柏林
  4. C++ pair(对组)用法(转)
  5. inserting a large number of records with SQLiteStatement.
  6. BZOJ_3058_四叶草魔杖_kruscal+状压DP
  7. Python基础第八天
  8. 查看html元素绑定的事件与方法 visual Event 插件
  9. 2.jeesite增删改查
  10. 返回一个集合对象,同时这个集合的对象的属性又是一个集合对象的处理方法(ViewModel)