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 ...
 
随机推荐
- POJ 2892 Tunnel Warfare(树状数组+二分)
			
题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...
 - POJ 1703 Find them, Catch them(种类并查集)
			
题目链接 这种类型的题目以前见过,今天第一次写,具体过程,还要慢慢理解. #include <cstring> #include <cstdio> #include <s ...
 - 进程调度函数schedule()分析
			
1.功能简述: 最主要作用就是 从就绪进程中选择一个优先级最高的进程来代替当前进程运行. 2.代码分析 schedule(); struct task_struct *tsk = cur ...
 - linux驱动开发之九鼎板载蜂鸣器驱动测试【转】
			
本文转载自:http://whylinux.blog.51cto.com/10900429/1932491 字符设备驱动用的fileopretion结构体. 1.板载蜂鸣器的驱动测试 我手里有一个BS ...
 - hdu  1166 敌兵布阵  解题报告
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query ...
 - hadoop-3.0.0-alpha4启动
			
全部启动或者全部停止(注意:第一次启动需要先格式,以后就不需要格式了,不能多次格式化) 1.启动 [root@master sbin]# pwd /usr/hadoop/hadoop-3.0.0-al ...
 - Leetcode字符串专题
			
Leetcode38. Count and Say 分析:根据题意,数列的下一项就是统计上一项中每个数字出现的次数,理解清楚题意就很简单了 class Solution { public: strin ...
 - flask的config配置和给实例化传入参数
			
灵活性主要体现在配置上,需要什么就配置什么 from flask import Flask app = Flask(__name__) # type:Flask # 调试模式:是否开启调试模式并捕获异 ...
 - 平衡二叉树、B树、B+树、B*树、LSM树简介
			
平衡二叉树是基于分治思想采用二分法的策略提高数据查找速度的二叉树结构.非叶子结点最多只能有两个子结点,且左边子结点点小于当前结点值,右边子结点大于当前结点树,并且为保证查询性能增增删结点时要保证左右两 ...
 - noip2010引水入城
			
https://www.zybuluo.com/ysner/note/1334997 这道题fst了 题面 戳我 解析 我一开始的想法是,按照高度给第一行排序,然后贪心地选取目前到不了的,高度最高的第 ...