首页 > 其他分享 >再论中位数:离线+链表法

再论中位数:离线+链表法

时间:2023-08-11 17:14:22浏览次数:40  
标签:pre suf int 离线 mid 链表 del ans 再论

离线先得到整个序列,从最终开始倒推答案
每次删掉一个数要么对中位数没有影响,要么向左/右移动一个
为了确定要删除的元素在链表中的位置,使用map记录,重复删完更新
向左向右可以按照删除的元素相对于中位数的位置确定,具体分类见代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
using namespace std ;

const int N = 10010 ;

int head, rnd, rid, n ;
int a[N], b[N], pre[N], suf[N] ;
vector <int> ans ;
map <int, int> ref ;
bool is_left = false ;

int main() {
	scanf("%d", &rnd) ;
	while (rnd--) {
		scanf("%d%d", &rid, &n) ;
		ans.clear() ;
		for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i] ;
		sort(b + 1, b + n + 1) ;
		for (int i = 1; i <= n; i++) ref[b[i]] = i ;
		for (int i = 1; i <= n; i++) pre[i] = i - 1, suf[i] = i + 1 ;
		pre[1] = suf[n] = 0 ;
		int mid = n / 2 + 1 ;
		ans.push_back(b[mid]) ;
		for (int i = n; i >= 1; i--) {
			int del = ref[a[i]] ;
			if (pre[del] && b[pre[del]] == b[del]) ref[a[i]] = pre[del] ;
			else if (suf[del] && b[suf[del]] == b[del]) ref[a[i]] = suf[del] ;
			if (i % 2 == 0) {
				if (is_left && del <= mid) mid = suf[mid] ;
				if (!is_left && del >= mid) mid = pre[mid] ;
				ans.push_back(b[mid]) ;
			} else {
				if (del == mid) mid = pre[mid], is_left = true ;
				else {
					if (del < mid) is_left = true ;
					else is_left = false ;
				}
			}
			suf[pre[del]] = suf[del] ;
			pre[suf[del]] = pre[del] ;
		}
		reverse(ans.begin(), ans.end()) ;
		printf("%d %d\n", rid, n / 2 + 1) ;
		for (int i = 0; i < ans.size(); i++) {
			printf("%d", ans[i]) ;
			if (i == ans.size() - 1) puts("") ;
			else if (i % 10 == 9) puts("") ;
			else printf(" ") ;
		}
	}
}

标签:pre,suf,int,离线,mid,链表,del,ans,再论
From: https://www.cnblogs.com/lighthqg/p/17623445.html

相关文章

  • pip离线下载安装工具包
    1,为什么需要pip离线安装工具包开发需要进行环境配置,如果在服务器上配置开发环境,由于各种各样的原因,可能会遇到服务器端是封闭环境,只能连接内网的情况。这就需要提前下载好安装包,在使用pip本地安装。2,如何安装单个离线包(1)如果环境配置端有联网条件,则直接在线安装即可:#pipinst......
  • 线性表-链表的操作实现
    LinkList.h#ifndef__LINKLIST__H__#define__LINKLIST__H__#include<stdio.h>#include<stdlib.h>typedefstructLinkNode{ intdata; structLinkNode*next;}LinkNode;typedefstructLinkList{ LinkNode*head;}LinkList;////遍历链表voi......
  • 使用vue+openLayers开发离线地图以及离线点位的展示
    1.下载引入到需要的组件中npminstallol2.需要用到的api...(根据开发需求以及实际情况进行引入)importolfrom"ol";import"ol/ol.css";importMapfrom"ol/Map";importViewfrom"ol/View";importFeaturefrom"ol/Feature";importPoin......
  • 160. 相交链表
    给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。示例1:输入:intersectVal=8,listA=[4,1,8,4,5],listB=[5,6,1,8,......
  • LRU机制:哈希表+双向链表 [labuladong-刷题打卡 day9]
    今天的知识点LRU缓存机制的实现。学过计组都知道LRU算法(leastrecentlyused最近最少使用算法)是资源管理中的常用算法。那么他是如何实现的呢?LRU原理和Redis实现146.LRU缓存此题算是对LRU机制的一个简化。为了使查找删除在O(1)中实现,我们结合哈希表和双向链表各自在查找和......
  • python离线打包
    1.导出已安装的列表pipfreeze>dependency.txt2.创建虚拟环境python-mvenvpath2venv3.在虚拟环境中安装导出的依赖列表path2venv/Script/pythoninstall-rdependency.txt4打包path2venv到自己的程序中,在程序中调用......
  • Django 离线脚本(数据库添加admin用户)
     importosimportsysimportdjangobase_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.path.append(base_dir)os.environ.setdefault('DJANGO_SETTINGS_MODULE','day06order.settings')django.setup()fromwebimportmodels......
  • 【代码设计】链表结构解决多流程校验
    目的 使用合理的代码设计,解决业务场景的中的实际问题。背景介绍 在实际的业务场景中,用户的一个操作行为,是否允许真正被执行,往往会涉及到多流程的校验,一旦有条件不满足将会被中止。以下面流程图为例:用户点击了打赏按钮,会进行是否有网络检查,没有网络,会有网络连接弹框,等待用户连接......
  • 递归反转链表局部[labuladong-刷题打卡 day8]
    写在前面前两天刷题打卡,感觉东哥的代码模板没有题解中的简洁,或者那些极限优化的代码中有很多优化技巧,但今天去感受递归的含义的时候,觉得毕竟我现在是在学习算法,理解算法含义才是学习的意义。至于优化,那是之后的事,所以刷题的时候不必过于追求简洁,就像追求简洁而降低可读性一样属......
  • 成功搞定H7-TOO的FreeRTOS Trace图形化链表方式展示任务管理
    之前推出了H7-TOOL的RTOSTrace功能,已经支持RTX5,ThreadX,uCOS-III,uCOS-II和FreeRTOS,特色是不需要目标板额外做任何代码,实时检测RTOS任务执行情况,支持在线和脱机玩法,效果是下面这样的:  这样的展示还不够直观,这几天开始研究图形化链表方式展示任务管理,从源码的角度来看,OS内核......