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的更多相关文章

  1. HDU6058 Kanade's sum(思维 链表)

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. hdu6058 Kanade's sum 区间第k大

    /** 题目:Kanade's sum 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:给定[1,n]的排列,定义f(l,r,k)表示区间[l ...

  3. hdu-6058 Kanade's sum

    题意:略 思路:要我们求每个区间第K大数之和,其实可以转换为求多少个区间的第K大数是X,然后我们在求和就好了. 那么我们可以从小到大枚举所有可能成为第K大的数.为什么从小到大呢? 因为从小到大我们就略 ...

  4. 2017 Multi-University Training Contest - Team 3—HDU6058 Kanade's sum

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题目意思:给你一个排列,求所有区间长度大于等于k的区间第k大的数的和…… 思路:一开始看到区间k ...

  5. hdu 6058 Kanade's sum(模拟链表)

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  6. 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 ...

  7. 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 ...

  8. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  9. 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 ...

随机推荐

  1. Python面向对象学习2(面向对象的语法和特性,待更新)

    上一个内容我们介绍了面向对象和面向对象场景现在我们来学习下语法和特性 1,面向对象基本语法: # -*- coding:utf-8 -*- # Author: Colin Yao class Dog( ...

  2. html中的meta标签

    1.定义 meta元素提供页面的原信息,位于文档头部 2.必须的属性 content属性 该属性提供名称/值对中的值,使用要与http-equiv或name属性一起使用 3.可选的属性 3.1.htt ...

  3. linux子系统的初始化_subsys_initcall()【转】

    转自:http://my.oschina.net/u/572632/blog/305492 目录[-] 概述 section的声明 注册 调用 IN BUILDING 概述 内核选项的解析完成之后,各 ...

  4. 【bzoj4552】排序

    二分一个值,然后线段树上模拟. #include<bits/stdc++.h> #define lson (o<<1) #define rson (o<<1|1) ...

  5. FISCO-BCOS平台共识

    FISCO-BCOS 应用于区块链的多节点并行拜占庭容错共识算法 看了下微众平台的wiki共识知识 学习下 ()内是自己的思考  参考: https://github.com/FISCO-BCOS/W ...

  6. 如何消除类型是submit类型的按钮的默认文字 ‘确认提交’

    只需要加上value="" 即可.默认的文字就可以去掉了.

  7. input标签获取焦点时文本框内提示信息清空背景颜色发生变化

    <input type="text" id="username" onfocus="myFocus(this,'#f4eaf1')" ...

  8. 从设计图到CSS:rem+viewport+媒体查询+Sass

    根据UI图对移动端的h5页面做样式重构,是前端工程师的本职工作,看似简单,不过想做好却并不容易.下面总结一下其中要点. rem rem是一种相对长度单位,参考的基准是<html>标签定义的 ...

  9. javascript 实现图片拖动

    javascript实现图片拖动效果并不难,主要的思路如下 1:给图片绑定监听鼠标按下对象,设置拖动属性为true 2:鼠标抬起:拖动属性为false 鼠标移动:改变坐标即可,新坐标=图片原始坐标+鼠 ...

  10. [PAT] 1146 Topological Order(25 分)

    This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topol ...