【set】【链表】hdu6058 Kanade's sum
f(l,r,K)表示区间l,r里面的K大值,问你所有连续子区间的f之和。
l(i)表示i左侧第一个比它大的数的位置,r(i)表示i右侧第一个比它大的数的位置。可以用set处理出来。
把数从大到小排序,依次插入。然后更新l(i),r(i),形成链形结构。
然后对于一个i,向左跳最多K次,将这些位置记录下来,然后向右跳最多K次,每个右侧的位置最多有一个左侧的位置合法。累计答案。
#include<cstdio>
#include<set>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
set<int>S;
typedef set<int>::iterator ITER;
ll ans;
int T,n,K,a[500010],b[500010],L[500010],R[500010];
int ls[500010],rs[500010];
bool cmp(const int &i,const int &j){
return a[i]>a[j];
}
int main(){
// freopen("1003.in","r",stdin);
// freopen("1003.out","w",stdout);
scanf("%d",&T);
for(;T;--T){
S.clear();
ans=0;
scanf("%d%d",&n,&K);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;++i){
b[i]=i;
}
sort(b+1,b+n+1,cmp);
for(int i=1;i<=n;++i){
ITER it=S.lower_bound(b[i]);
if(i>1 && it!=S.begin()){
--it;
L[b[i]]=*it;
R[*it]=b[i];
}
else{
L[b[i]]=-1;
}
it=S.upper_bound(b[i]);
if(i>1 && it!=S.end()){
R[b[i]]=*it;
L[*it]=b[i];
}
else{
R[b[i]]=-1;
}
int e1=0,e2=0;
ls[0]=rs[0]=b[i];
for(int j=b[i],l=1;l<=K && L[j]!=-1;j=L[j],++l){
ls[++e1]=L[j];
}
if(e1<K){
ls[++e1]=0;
}
for(int l=1,j=b[i];l<=K && R[j]!=-1;j=R[j],++l){
rs[++e2]=R[j];
if(e2-1+(ls[e1]==0 ? e1-1 : e1)>=K-1){
ans+=(ll)(ls[K-e2]-ls[K-e2+1])*(ll)(rs[e2]-rs[e2-1])*(ll)a[b[i]];
}
}
if(e2<K){
rs[++e2]=n+1;
}
if(rs[e2]==n+1 && e2-1+((e1==K || ls[e1]==0) ? e1-1 : e1)>=K-1){
ans+=(ll)(ls[K-e2]-ls[K-e2+1])*(ll)(rs[e2]-rs[e2-1])*(ll)a[b[i]];
}
else if(K==1){
ans+=(ll)(b[i]-(L[b[i]]==-1 ? 0 : L[b[i]]))*(ll)((R[b[i]]==-1 ? n+1 : R[b[i]])-b[i])*(ll)a[b[i]];
}
S.insert(b[i]);
}
cout<<ans<<endl;
}
return 0;
}
【set】【链表】hdu6058 Kanade's sum的更多相关文章
- HDU6058 Kanade's sum(思维 链表)
Kanade's sum Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- hdu6058 Kanade's sum 区间第k大
/** 题目:Kanade's sum 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:给定[1,n]的排列,定义f(l,r,k)表示区间[l ...
- hdu-6058 Kanade's sum
题意:略 思路:要我们求每个区间第K大数之和,其实可以转换为求多少个区间的第K大数是X,然后我们在求和就好了. 那么我们可以从小到大枚举所有可能成为第K大的数.为什么从小到大呢? 因为从小到大我们就略 ...
- 2017 Multi-University Training Contest - Team 3—HDU6058 Kanade's sum
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题目意思:给你一个排列,求所有区间长度大于等于k的区间第k大的数的和…… 思路:一开始看到区间k ...
- 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 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 6058 - Kanade's sum | 2017 Multi-University Training Contest 3
/* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...
- 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 ...
随机推荐
- Java常用开发思想与知识点小记(一)
1. 子类在覆盖父类的方法时,不能抛出比父类更多的异常(儿子不能比父亲干更多的坏事),所以只能捕捉异常,通常在web层捕获异常,给用户一个友好提示. 2.Java内存模型与并发编程三个特性 htt ...
- bind类成员函数
首先描述一个情景: 先贴出代码: class Solution { public: bool compare(int a, int b) { return a > b; } int functi ...
- skb管理函数之skb_put、skb_push、skb_pull、skb_reserve
四个操作函数直接的区别,如下图: /** * skb_put - add data to a buffer * @skb: buffer to use * @len: amount of data t ...
- Linux 入门记录:十七、Linux 命令行文本/文件处理工具
一.文件浏览 cat 查看文件内容 more 以翻页形式查看文件内容(只能向下翻页) less 以翻页形式查看文件内容(可以上下翻页) head 查看文件的头几行(默认10行) tail 查看文件的尾 ...
- python基础===中文手册,可查询各个模块
http://python.usyiyi.cn/translate/python_352/index.html
- python中的enumerate获取迭代元素的下标
以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())ind ...
- c++设计模式系列----builder模式
看了好几处关于builder模式的书和博客,总感觉不是很清楚,感觉不少书上的说的也不是很准确.最后还是看回圣经<设计模式>.看了好久终于感觉明白了一点了. 意图: builder模式提出的 ...
- node.js3
第一部分:express(MVC) 1.下载express npm install express --save 2.引入express require('express') 中间件 body-par ...
- expose a port on a living Docker container
if you have a container that with something running on its port 8000, you can run wget http://contai ...
- DNS解析原理与Bind部署DNS服务
DNS是什么? DNS(Domain Name System,域名系统)是互联网上最核心的带层级的分布式系统,它负责把域名转换为IP地址.反查IP到域名的反向解析以及宣告邮件路由等信息,使得基于域名提 ...