HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3
/*
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);
}
}
HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3的更多相关文章
- 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 ...
- hdu 6058 Kanade's sum(模拟链表)
Kanade's sum Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 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 ...
- 【链表】2017多校训练三 HDU 6058 Kanade's sum
acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...
- HDU - 6058 Kanade's sum
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6058 /* 思路是:找出每个x为第k大的区间个数有多少 用pos[i]保存当前x的位置, ...
- 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 ...
- hdu 6058 Kanade's sum (计算贡献,思维)
题意: 给你一个全排列,要你求这个序列的所有区间的第k大的和 思路:比赛的时候一看就知道肯定是算贡献,也知道是枚举每个数,然后看他在多少个区间是第K大,然后计算他的贡献就可以了,但是没有找到如何在o( ...
- HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3
思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ] | 2017 Multi-University Training Conte ...
- 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 ...
随机推荐
- 【AtCoder】AGC002
AGC002 A - Range Product #include <bits/stdc++.h> #define fi first #define se second #define p ...
- eclipse scala Could not reserve enough space for object heap
[学习笔记] 防盗版实名手机尾号:73203 Could not reserve enough space for object heap 解决方法:下面的缩写中:一个是memory max(Xmx) ...
- 三分钟搞定Python中的装饰器
python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能. 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用 ...
- Go-环境搭建-hello world-变量常量定义-函数使用基础
目录 编程语言科普 常见语言的背景 go 为什么这么火? 环境搭建(很重要) ide 编辑器 注释 第一个程序 Hello world! 编译与执行 变量类型 数字类型 字符串类型 布尔类型 常量 函 ...
- 移动端测试之APP安全测试
现在APP测试已经是测试行业的一个重要分支,对APP测试技能和经验的要求也越来越高,看到一篇关于APP安全测试的总结,分享给需要的朋友.1.软件权限1)扣费风险:包括发送短信.拨打电话.连接网络等2) ...
- 用Lua的协程实现类似Unity协程的语句块
local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...
- GAN——ModeCollapse
GAN——ModeCollapse 2017年05月21日 13:54:31 LiuSpark 阅读数 6821更多 分类专栏: 机器学习 版权声明:本文为博主原创文章,遵循CC 4.0 BY-S ...
- 作业13:Map相关知识点(一)
一 Map相关类图 二 Map接口 1 Map接口中的方法 jdk 方法名 简单描述 put(K,V):V 添加value,当Key对应无值,返回null;有值则返回上一个值.(覆盖式,可以反复覆盖前 ...
- ES6用来判断数值的相关函数
最近在学习ES6的基础知识,整理了一下ES6用来判断数值的相关函数 Math.sign() =>判断正负数的函数 Math.trunc() =>取整函数 Number.isInteger( ...
- SqlServer2008 R2发布订阅
网上好多大神写的贴子,自己也看着贴子弄的,写的已经很详细了,我就不重复写了,贴上参考资料: http://www.cnblogs.com/dudu/archive/2010/08/26/1808540 ...