HDU - 6058 Kanade's sum
http://acm.hdu.edu.cn/showproblem.php?pid=6058
/*
思路是:找出每个x为第k大的区间个数有多少
用pos[i]保存当前x的位置,pre[i]表示向x的左侧扩展k个,next[i]表示向x的右侧扩展k个
然后计算出在左侧到右侧这个范围有多少个区间数符合条件
计算出结果后将pre和next后挪以为,接着计算下一个值
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=5e5+10;
ll pos[MAXN+10];
ll pre[MAXN+10];
ll nxt[MAXN+10];
ll l[MAXN+10],r[MAXN+10];
ll n,k,x;
void del(int x)
{
pre[nxt[x]]=pre[x];
nxt[pre[x]]=nxt[x];
}
ll cal(ll x)
{
ll cnt=0;
ll c1=0,c2=0;
for(int i=x;i>0;i=pre[i])
{
l[++c1]=i-pre[i];
if(c1==k)break;
}
for(int i=x;i<=n;i=nxt[i])
{
r[++c2]=nxt[i]-i;
if(c2==k)break;
}
//计算从左侧区间到右侧区间的区间数
for(int i=1;i<=c1;i++)
{
if(k-i+1<=c2)
cnt=cnt+l[i]*r[k-i+1];
}
return cnt;//返回区间数量
}
int main()
{
int t;
cin>>t;
while(t--)
{
//ll n,k,x;
ll ans=0;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
{
cin>>x;
pos[x]=i;
pre[i]=i-1;
nxt[i]=i+1;
}
pre[0]=0;nxt[n+1]=n+1;
for(int i=1;i<=n;i++)//计算每个x的区间数
{
ll cnt=cal(pos[i]);
// cout<<cnt<<endl;
ans+=cnt*i;
del(pos[i]);
}
cout<<ans<<endl;
}
return 0;
}
HDU - 6058 Kanade's sum的更多相关文章
- 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(模拟链表)
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 ...
- 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 ...
- 【链表】2017多校训练三 HDU 6058 Kanade's sum
acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...
- 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( ...
- 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 ...
- hdu6058 Kanade's sum 区间第k大
/** 题目:Kanade's sum 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:给定[1,n]的排列,定义f(l,r,k)表示区间[l ...
随机推荐
- Android安装应用后点击"打开"(Open)带来的问题及解决方案
MainActivity例如以下: package cc.cc; import android.app.Activity; import android.content.Intent; import ...
- 直播:中国HBase技术社区第一届MeetUp
6月6日,由中国HBase技术社区组织,阿里云主办的中国第一届HBase Meetup将在北京举行,来自阿里.小米.滴滴.360等公司的各位大神会共同探讨HBase2.0的技术革新,HBase在国内各 ...
- Velocity模板引擎笔记
模板引擎中判断对象是否为空: #if(!${jsonObj.data.buyerName} || ${jsonObj.data.buyerName} == '') <p>采 ...
- 数据结构之 图论---bfs(邻接表)
数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...
- easyui 在日期不满足要求的情况下,让修改链接不可点,或者修改消失
*****略***** columns:[[ {field:'id',checkbox:true}, {field:'mDate',width:10,title:'菜单日期',align:'left' ...
- java在某个日期上添加n天的方法实现
//得到添加n天后的时间字符串 public String getAddDate(Date date,int n){ //格式转换 SimpleDateFormat sdf = new SimpleD ...
- Oracle:通过dbv查看数据文件是否有坏块
我们备份的数据文件,可以通过oacle自带的dbv工具来查看是否是好的. 下面实验如下: 环境:oracle10.2.0.1 1.检查数据文件是否有坏块 [oracle@app orcl]$ dbv ...
- Oracle的wm_concat函数(转)
wm_concat函数简单说就是行转列显示. 转自:http://christy-fang.iteye.com/blog/1299850 首先让我们来看看这个神奇的函数wm_concat(列名),该函 ...
- 初学者对springMVC的认识
首先是要一定说明的是,这倒是说明是什么?对吧 Spring MVC 是SpringFrameWork的后续产品,并且已经融入到Spring Web Flow中 同时Spring MVC 分离了控制器, ...
- DDK编写64位驱动时加入x64汇编的方法
上篇讲了如何在编写x64应用程序时加入x64汇编,这里来说说如何在编写x64驱动时加入x64汇编. 一.在asm文件中单独编写功能函数 比如要实现一个64位的加法函数,原型如下: ULONG64 my ...