HDU 6058 维护最近k个比本身大的数
来源:互联网 发布:荒潮 知乎 编辑:程序博客网 时间:2024/06/11 10:01
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=5e5+5;int read(){ int ret=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); for(; ch>='0'&&ch<='9'; ch=getchar()) ret=ret*10+ch-'0'; return ret;}int pos[N],nxt[N],pre[N];int main(){ int t; scanf("%d",&t); while(t--) { int n=read(),m=read(); for(int i=1; i<=n; i++) { int x=read(); pos[x]=i,pre[i]=i-1,nxt[i]=i+1; } pre[0]=0; nxt[n+1]=n+1; ll sum=0; for(int j=1; j<=n; j++) { int x=pos[j]; int rq[105]; int lc,rc; lc=rc=0; for(int i=x;i<=n&&rc<m;i=nxt[i]) rq[++rc]=nxt[i]-i; ll ans=0; for(int i=x; i>0&&lc<m; i=pre[i]) { lc++; if(m-lc+1>rc) continue; else ans+=(i-pre[i])*rq[m-lc+1]; } sum+=ans*j; pre[nxt[x]]=pre[x]; nxt[pre[x]]=nxt[x]; } printf("%I64d\n",sum); }}
阅读全文
0 0
- HDU 6058 维护最近k个比本身大的数
- 有序数组查找第一个比k大的数
- 二分查找第一个比k大的数
- 查询比a大的数中的第k大的数 树状数组 hdu 2852 KiKi's K-Number
- 【二分查找】查找数组中第一个比k大的数的下标
- 【二分查找】查找数组中第一个比k大的数的下标
- 得到第K个大的数
- hdu 1358 Period(给定一个字符串,求有多少个前缀(包括自己本身),它是由k(k>2,并且尽量大)个循环节组成的)
- K个最近的点
- K个最近的点
- 前m大的数HDU 1280(以和为下标比大小)输出M个最大和
- 找到比一个数大的距离最近的2的n次方的值
- K大的 数
- 【K-D树 K维最近距离的t个点】HDU
- 得到第K个大的数算法研究
- 关于求N个无序数中第K大的数。
- hdu(4006)优先队列求第K大的数
- hdu 4006 求第K大的数
- Android 01 selector状态选择器
- 训练总结8.1
- 循环
- 勤快的love 枫
- win10 java环境变量设置
- HDU 6058 维护最近k个比本身大的数
- python基础 字符串(上)
- (5)二叉树
- 案例:Js验证100以内的数都符合角谷定理
- 谷歌浏览器插件-jsonView插件安装与使用
- TCP协议中的三次握手和四次挥手(图解)
- scala 编程思想
- HDU
- 直接选择排序