当前位置: 首页 > news >正文

HDU-6058 Kanade's sum - 2017 Multi-University Training Contest - Team 3(思维+模拟链表)

题意:

给两个数n,k和1..n的某个排列,求∑(n,l=1)∑(n,r=l) f(l,r,k),其中f(l,r,k)是区间[l,r]第k大的值,如果区间数的个数不足k个,则f(l,r,k)为0。

思路:

由于n比较大而k最大为80,所以对于每个数x,我们只要求出其左边大于x的k个数的位置,和其右边大于x的k个数位置就可以求出所有以x为第k大数的所有区间。然而这样暴力去求肯定不行的,由于是1..n的某个排列,所以每个数只会出现一次且不同。所以我们是通过一个模拟链表去记录每个数位置后面的位置(其实就是为了官方题解说的实现O(1)地找大于当前数的数),并从1开始去进行上述操作,所以每次操作完便可以将这个数从链表"删除",因为前面的数不会影响后面的数寻找比它大的嘛。然后再求满足要求的区间就好了。


代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 5e5+5;
int t, n, k;
int pos[maxn], pre[maxn], net[maxn];
int zuo[85], you[85];
int main()
{
	//freopen("in.txt", "r", stdin);
	scanf("%d", &t);
	while(t--)
	{
		LL ans = 0;
		scanf("%d %d", &n, &k);
		for(int i = 1; i <= n; ++i)
		{
			int x;
			scanf("%d", &x);
			pos[x] = i;
			pre[i] = i-1; net[i] = i+1;
		}
		for(int x = 1; x <= n; ++x)
		{
			int i1, i2, j1, j2;
			i1 = i2 = pos[x];
			j1 = 0, j2 = 0;
			zuo[0] = you[0] = pos[x];
			while(i1 != 0 && j1 < k)
			{
				zuo[++j1] = pre[i1];
				i1 = pre[i1];
			}
			while(i2 != n+1 && j2 < k)
			{
				you[++j2] = net[i2];
				i2 = net[i2];
			}
			int i = 0;
			while(i < j1)
			{
				int j = k-1-i;
				if(j < j2) ans += 1ll*x*(zuo[i]-pre[zuo[i]])*(net[you[j]]-you[j]);
				++i;
			}
			net[pre[pos[x]]] = net[pos[x]];
			pre[net[pos[x]]] = pre[pos[x]];
		}
		printf("%lld\n", ans);
	}
	return 0;
}

继续加油~

相关文章:

  • PowerShell获取特定“描述”的虚拟机IP地址
  • HDU-6060 RXD and dividing - 2017 Multi-University Training Contest - Team 3(思维+最小斯坦纳树)
  • error while loading shared libraries错误处理
  • POJ-3270 Cow Sorting(贪心+置换)
  • php对gzip文件或者字符串解压实例参考
  • POJ-1637 Sightseeing tour(通过网络流判定混合图的欧拉回路)
  • 哈密顿图和欧拉图知识小结
  • POJ-2689 Prime Distance(区间素数筛--经典题)
  • c语言移位操作
  • HDU-6069 Counting Divisors - 2017 Multi-University Training Contest - Team 4(分解质因子区间筛法)
  • HDU-6073 Matching In Multiplication - 2017 Multi-University Training Contest - Team 4(拓扑+连通块处理)
  • 我的Java开发学习之旅------Java经典排序算法之插入排序
  • POJ-3352 Road Construction(边双连通分量+缩点)
  • 445port入侵详细解释
  • UVALive-5013 Similarity(二分图最大权匹配)
  • const let
  • Java多线程(4):使用线程池执行定时任务
  • python docx文档转html页面
  • redis学习笔记(三):列表、集合、有序集合
  • vagrant 添加本地 box 安装 laravel homestead
  • 解析带emoji和链接的聊天系统消息
  • 如何选择开源的机器学习框架?
  • 深入浅出webpack学习(1)--核心概念
  • 收藏好这篇,别再只说“数据劫持”了
  • 思维导图—你不知道的JavaScript中卷
  • 源码安装memcached和php memcache扩展
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • PostgreSQL之连接数修改
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​Java并发新构件之Exchanger
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​比特币大跌的 2 个原因
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #HarmonyOS:Web组件的使用
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (办公)springboot配置aop处理请求.
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)RocketMQ初步认识
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)关于pipe()的详细解析
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .htaccess 强制https 单独排除某个目录
  • .NET Core中的去虚
  • .Net 垃圾回收机制原理(二)
  • .NET 命令行参数包含应用程序路径吗?
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .Net中ListT 泛型转成DataTable、DataSet
  • @property括号内属性讲解
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [20160807][系统设计的三次迭代]