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);}
}
转载于:https://www.cnblogs.com/nicetomeetu/p/7271813.html
HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3相关推荐
- 2017多校第3场 HDU 6058 Kanade's sum 双链表,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题外话:这场多校,真心感觉自己的无力,全队都发挥的很差,结束的时候排名掉到了90多,后期没做出字 ...
- HDU 6058 Kanade's sum 逆序求第k大
传送门:HTTP://acm.hdu.edu.cn/showproblem.php PID = 6058 题意:给你一个1-n的排列求所有自子区间的第K大的和 思路:从大到小插入位置维护当前数位置以及 ...
- HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点 源点 到行连流量为 所给的 ...
- 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...
- hdu 6059 Kanade's trio
Problem acm.hdu.edu.cn/showproblem.php?pid=6059 Reference HDU 6059 Kanade's trio (字典树, 2017 Multi-Un ...
- HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...
- HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2
/* HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2 题意: ...
- Sichuan University Programming Contest 2018 Preliminary
嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...
- hdu 4925 Apple Tree--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...
最新文章
- 参数调整 新部署rac_开工的欲望 | AI Studio悄然上线新功能,用你的模型生成在线预测服务...
- 苹果手机换了屏显示无服务器,苹果将​​为存在显示问题的iPhone 11提供免费更换...
- Group by优化
- BA(free scale) network 小结
- sql where中用case_从零学会SQL:求职面试题(汇总)
- asynchttpclient 超时_dnf这才是混子的毕业套装,却发现超时空漩涡不买账!
- MATLAB_平面几何_判断两平面矩形是否干涉
- 学习笔记 第六周 第一篇
- 【计算机视觉】人脸识别总结
- 嵌入式行业公司及所属产业
- 含泪推荐四款超级好用的电脑软件,值得收藏
- vsphere 6.5 HA 提示:此主机当前没有管理网络冗余,该主机的vSphere HA检测信号数据存储数目为0 告警消除
- android怎么用apk,手机如何安装APK应用教程 小白操作安卓系统教程 (全文)
- 分子模拟软件amber_分子模拟周刊: 第 23 期
- 黑吃黑第一季/全集Banshee迅雷下载
- 给高科技强国的后来者埋下的痛
- Centos7安装配置
- 用命令提示符运行java_怎么用命令提示符运行java程序?
- 工业手持PDA,你不得不知的重要性
- 10005---热部署