hdu 6058 Kanade's sum

hdu 6058 链表 枚举 考虑每个数的贡献,即满足区间第k大为该数的区间个数。其实就是对于两边比起大的数,两边卡出比该数大的个数为k - 1. 用链表维护,考虑从小到大枚举,枚举完成后删除该点,保证每次枚举链表中都是比其大的数。 O(n*k) 写的挫 #include #include #include #include using namespace std; const int MAXN = 阅读详情


Kanade's sum

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 516    Accepted Submission(s): 182


Problem Description
Give you an array  A[1..n] of length  n . 

Let  f(l,r,k)  be the k-th largest element of  A[l..r] .

Specially ,  f(l,r,k)=0  if  r−l+1<k .

Give you  k  , you need to calculate  ∑nl=1∑nr=lf(l,r,k)

There are T test cases.

1≤T≤10

k≤min(n,80)

A[1..n] is a permutation of [1..n]

∑n≤5∗105
 

Input
There is only one integer T on first line.

For each test case,there are only two integers  n , k  on first line,and the second line consists of  n  integers which means the array  A[1..n]
 

Output
For each test case,output an integer, which means the answer.
 

Sample Input
  
1 5 2 1 2 3 4 5
 

Sample Output
  
30
 

Source
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   6066  6065  6064  6063  6062 
 

Statistic |  Submit |  Discuss |  Note
题意:求所有区间的第k大的权值和,不存在第k大权值为0。

思路:问题等价于求每个数字分别是多少个区间的第k大,也就是可以枚举位置,然后再枚举左边x个数比这个数要大,那么右边必须要有k-1-x个数比这个位置要大,思路大概是这样。因为序列是1~n的排列,我们先记录每个数字出现的位置,我们维护一个链表,从最大值n开始枚举到1,每次把值插入到链表中,然后通过遍历链表用滑动窗口的办法达到O(n*(logn+k)),那个logn是我用set来记录已经插入的坐标有哪些,然后可以在logn的时间内找到第一个比当前插入坐标要大的坐标,从而达到修改链表的操作。

具体方法看代码吧。也有标注释,不懂留言。

//#pragma comment(linker, "/STACK:102400000,102400000") 
#include<iostream>  
#include<cmath>  
#include<queue>  
#include<cstdio>  
#include<queue>  
#include<algorithm>  
#include<cstring>  
#include<string>  
#include<utility>
#include<set>
#include<map>
#include<stack>
#include<vector>
#define maxn 500005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-8;
const int mod = 1e9 + 7;
int n, left1[maxn], right1[maxn], vis[maxn];
const int read()
{
	char ch = getchar();
	while (ch<'0' || ch>'9') ch = getchar();
	int x = ch - '0';
	while ((ch = getchar()) >= '0'&&ch <= '9') x = x * 10 + ch - '0';
	return x;
}
int main(){
	int t;
	scanf("%d", &t);
	while (t--){
		LL ans = 0;
		int k;
		scanf("%d%d", &n, &k);
		set<int>s;
		set<int>::iterator it;
		for (int i = 1; i <= n; i++){
			int x = read();
			left1[i] = 0;
			right1[i] = n + 1;
			vis[x] = i;//标记每个数字所在的位置
		}
		if (k < 1)
			printf("0\n");
		left1[n + 1] = 0;
		right1[n + 1] = n + 1;
		s.insert(0);
		s.insert(n + 1);//默认两位第0位和n+1位最大
		for (int i = n; i > 0; i--){
			s.insert(vis[i]);
			it = s.find(vis[i]);
			int l , r;
			it++;//找到第一个比当前位置大的位置
			r = *it;
			l = left1[r];
			left1[r] = vis[i];
			right1[vis[i]] = r;
			right1[l] = vis[i];
			left1[vis[i]] = l;//链表的插入
			int nowl = vis[i];
			for (int j = 0; j < k&&nowl; j++)
				nowl = left1[nowl];
			int nowr = nowl;
			for (int j = 0; j < k&&nowr != n + 1; j++)
				nowr = right1[nowr];//找到左端点和右端点
			for (int j = 0; j < k; j++){
				if (nowl == vis[i] || nowr == n + 1)
					break;
				int nextl = right1[nowl];
				int nextr = right1[nowr];
				ans += 1ll*(nextl - nowl)*(nextr - nowr)*i;
				nowl = nextl;
				nowr = nextr;
			}
		}
		printf("%lld\n", ans);
	}
}


UE5垃圾回收优化实战:定位GC卡顿与内存泄漏 垃圾回收(GC)是Unreal Engine 5中保障UObject内存安全的核心机制,其基于引用图的标记-清除原理决定了性能高度依赖引用结构合理性。当GC频繁触发或单次耗时突增,往往映射出蓝图强引用冗余、C++根对象管理失控或资源生命周期设计缺陷等底层问题。技术价值在于降低主线程阻塞、稳定60帧体验、抑制内存异常增长;典型应用场景包括关卡切换卡顿、UI打开后持续GC、打包后内存不释放等。本文聚焦UE5特有的Full GC模式、UObject生命周期约束及GC触发时机不可见性,提供从蓝图变量规范、TSoft 阅读详情

相关推荐

从URDF到Gazebo:一个完整的ROS2机械臂仿真与运动控制实战指南

本文提供了一个完整的ROS2机械臂仿真与运动控制实战指南。详细讲解了从URDF建模、ROS2 Control配置到Gazebo物理仿真的全流程,重点介绍了如何利用MoveIt2快速搭建高级运动规划系统,并解决实际部署中的常见问题,帮助开发者高效、安全地进行机器人算法验证与开发。

red88的博客 574

HDU6058【(1-n排列从小到大处理)+链表】

思路: 由于数组数值是1-N的一个排列,可以从小到大处理([1, n-k+1]), 对于每个值x的贡献就是枚举左边有i个>=x的个数, 然后如果能知道存在一段长度区间Left_Len都满足左边有i个>=x的个数,还能知道存在一段长度区间Right_Len都满足左边有k+1-i个>=x的个数,那么对于x,i的贡献就是Left_len*Right_len*x,因为对于当前x,它一定是最小的,比它小

ONE MORE TRY 770

在VSCode中使用LaTex+(grammarly语法检测,chatgpt翻译,Sumatra PDF 轻量级pdf阅读器)

整个文章分为以下几个内容,打 * 的是必须要安装的。

u011895157的博客 2万+

HDU-6058 Kanade's sum(计数)

传送门:HDU-6058 题意:一个1~n的全排列,定义f(i,j,k)为在区间[i,j]内第k大的数,求 ∑nl=1∑nr=lf(l,r,k) 题解:对于每个数求自己对答案的贡献,首先要知道Ai在某个数有贡献当且仅当区间内只有k-1个数比Ai大,于是可以从大到小遍历,这样当枚举到A时,比Ai大的数的位置都已知道,这个可以用set进行保存,然后分别枚举Ai左右两边比Ai大的数的个数以及区

十分残念的博客 657

示波器学习(一):示波器的作用、类型和基本结构

示波器的作用、使用场景;示波器的类型和基本结构介绍

qq_41300605的博客 9141

摩擦纳米发电机测试系统全解析:从硬件配置到软件控制

本文全面解析摩擦纳米发电机(TENG)测试系统,涵盖硬件配置、软件控制及系统集成。详细介绍NI USB-6003等采集卡的选择与使用,以及一体化控制软件的功能与优势,帮助研究人员高效评估纳米材料发电性能。系统支持自动测试与数据分析,显著提升测试效率与准确性。

weixin_28720767的博客 460

【思维-链表】hdu 6058

Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2633    Accepted Submission(s): 1095 Problem Description Give you an array A

Hi_jiaxinwei的博客 420

AI工程化之生成式UI & A2UI(一)

本文系统介绍了生成式UI和Google A2UI技术。生成式UI通过AI直接生成前端代码(完全生成式)或DSL(混合式),实现千人千面的动态界面和研发提效。Google A2UI提出组件级和消息级协议,采用JSON规范实现渲染框架解耦,支持多端渲染。文章详细阐述了A2UI的架构设计,包括协议生成、服务端处理和渲染器实现,并对比了与传统前端框架的差异,指出A2UI本质是UI=F(AI(UI)+AI(state))的创新模式。最后通过playground项目展示了A2UI的实践应用。

qq_34306228的博客 590

hdu 6058 Kanade's sum [区间第k大数求和] [2017 Multi-University Training Contest - Team 3]

点击打开题目 题意:给你一个序列, 求每个区间的第k大的数的和, 如果不存在第k大的数, 则这个数为0. 分析:一个很直观的思路就是算每个数的贡献, 对于这个序列中的数$a_i$, 枚举有多少区间第k大的数为$a_i$. *往前枚举找到k - 1个比$a_i$大的数,往后枚举找到k - 1个比$a_i$大的数. 然后将左边第i大的数到第i + 1大(包含i但不

hint 512

IgH EtherCAT 从入门到精通:第 3 章 第一次运行 Hello EtherCAT

摘要:启动EtherCAT主站实践指南 本章详细介绍了如何配置和启动EtherCAT主站系统,主要内容包括: 配置文件详解:讲解/etc/ethercat.conf中的关键配置项,包括主网卡指定、冗余备份设置和网卡驱动选择。 启动流程:说明通过systemd服务和手动命令两种方式加载内核模块,重点介绍了ec_master和ec_generic模块的加载顺序及验证方法。 命令行工具:列举ethercat工具的常用命令,如查看主站状态、扫描从站设备、读取PDO/SDO数据等。 示例程序:简要介绍内核态示例min

从事嵌入式linux android驱动开发,拥有全栈能力 311

Vibe Coding 实战指南:用 3 类社区资源实现每周高效追新

介绍一种分层技术雷达校准方法,通过领域过滤器(L1技术栈锚定、L2能力映射、L3场景收敛)精准筛选AI编程相关更新,结合可验证的Shell命令与CI任务卡,将信息过载压缩为可执行、可审计的工程实践。

weixin_27251469的博客 330

hdu 6058 Kanade's sum(链表)

题目链接:hdu 6058 Kanade's sum 题意: 给你一个n个数的排列,问你全部区间第k大的总和为多少。 题解: 我们只要求出对于一个数x左边最近的k个比他大的和右边最近k个比他大的,扫一下就可以知道有几个区间的k大值是x。 我们考虑从小到大枚举xxx,每次维护一个链表,链表里只有>=x的数,那么往左往右找只要暴力跳kkk次,删除也是O(1)的。 时间复杂度:O(nk...

weixin_30823833的博客 149

固定效应模型-以stata为工具

固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学和健康研究中被广泛应用。

侯小啾技术博客 2839

hdu6058 Kanade's sum

题解:找出x左右两边大于x的k个数,左边记为cntl右边记为cntr,当cntl+cntr==k时,开始统计有多少个区间以x为第k大值。 重点是从小到大找x,x的情况全部考虑完后,把x从链表里删掉。 复杂度为O(n*k) #include #include using namespace std; typedef long long ll; const int maxn=1e6; int t

Nowara_Shinnosuke的博客 430

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【hdu6058】 Kanade's sum 模拟

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题目大意:给你一个$1$到$n$的排列,请求出该序列所有区间中第$k$大之和,若该区间内少于$k$个数,则不计算答案。 数据范围: $n≤5*10^5,k≤50$。 想出来了好像真的是模拟题(然而我并没完全独立思考)。 和上午做的某一题挺像的。 我们考虑数字$x$,不难发现...

diaoyoutun2652的博客 132

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

HDU6058 Kanade's sum【思维题】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 思路:记录每个点的前面的(k-1)个比它大的值和后面(k-1)个比它大的数,然后枚举每一种情况求和。 AC代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int a[500005]; int...

weixin_43499182的博客 207

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HDU6058 Kanade's sum

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=6058题目意思给你长度为n的a数组,问你数组a组成的区间第k大的总和。解题思路确定a数组一个元素x,判断x右边是否有k比x大的元素,没有左边补。找到右边第k个比x大的数a[j](或小于k),如果a[j]右边还有y个比x小的数,就多y个区间满足第k大。右边找找完往左找,每找到一个比x大数,右边比x的退

绝丶爵的博客 300

HDU 6058 Kanade's sum

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:   给一个长度为n(n<=5e5)数组a,a为1-n的一个全排列,然后给一个k(1<=k<=min(n,80)),和一个函数f(l,r,k):区间[l,r]的第k大的数(区间长度小于k时为0).求所有区间的第k大的数的和。 题解:   记录a中1-n每个数的下标...

weixin_30414155的博客 117

hdu 6058 Kanade's sum

/* 计算每个数的贡献, 找到左边k-1个大于 pi的,右边 大于pi 的, 所有有贡献的区间都在这个范围内。 用链表维护位置,结束后删除pi, 从小到大 枚举,可以保证链表中的数 >=pi; */ #include #include #include using namespace std; typedef long long ll; const int mod =1e9+7;

vvv_557的博客 374

Kanade's sum(hdu 6058)

Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest element of A[l..r]. Specially , f(l,r,k)=0 if r−l+1k. Give you k , you need to calculate

xiaohang3414的博客 292

HDU 6058 Kanade's sum(链表)

Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2320    Accepted Submission(s): 956 Problem Description Give you an ar

Mr_Treeeee的博客 396

HDU 6058 枚举 Kanade's sum

题目 Give you an array A[1..n]A[1..n]of length nn.  Let f(l,r,k)f(l,r,k) be the k-th largest element of A[l..r]A[l..r].  Specially , f(l,r,k)=0f(l,r,k)=0 if r−l+1kr−l+1.  Give you

北望村 1788

[HDU]6058 Kanade's sum

Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest element of A[l..r].Specially , f(l,r,k)=0 if r−l+1< k.Give you k , you need to calculate ∑nl=1∑nr=lf(l,r,k)\sum_{l=1}^{n}\sum_{r=l

chutzpah 424

HDU 6058 Kanade's sum 思维+ 模拟链表

传送门:HDU6058 题意:给出1-n的一个全排列,定义f(l, r, k)为[l, r] 区间中第k大的值,给定K,问 ∑nl=1∑nr=lf(l,r,k) 是多少。 思路:暴力区间肯定是不行的,我们可以考虑每个数的贡献,假设当前处理Ai,那么要使得Ai为第K大,我们要在i左边找k - 1个比Ai大且离i最近的数,在i右边找k - 1个比Ai大且离i最近的数,这样Ai能产生贡献的全部区间

WA是一笔财富 318

HDU6058-Kanade's sum

Kanade’s sumTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 664 Accepted Submission(s): 256Problem Description Give you an array A[1..n]of

algzjh的博客 1277
上一篇: hdu 6035 Colorful Tree
下一篇: hdu 6070 Dirt Ratio
overload1997
博客等级 码龄11年 328粉丝 210原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值