2022-12-20:二狗买了一些小兵玩具,和大胖一起玩,
一共有n个小兵,这n个小兵拍成一列,
第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列,
一共进行m次操作,二狗每次操作选择一个数k,将前k个小兵战斗力从小到大排列,
大胖每次操作选择一个数k,将前k个小兵战斗力从大到小排列,
问所有操作结束后,排列顺序什么样,
给定一个长度为n的数组arr,表示每个小兵的战斗力,
给定一个长度为m的数组op,
op[i] = { k , 0 }, 表示对前k个士兵执行从小到大的操作,
op[i] = { k , 1 }, 表示对前k个士兵执行从大到小的操作。
返回数组ans,表示最终的排列。
1 <= n, m <= 2 * 10^5,
-10 ^ 9<= arr[i] <= + 10^9。
来自百度。

答案2022-12-20:

单调栈+有序表。
rust语言里结构体的有序表需要实现Ord的trait。
时间复杂度O(M) + O(N*logN)。

rust代码如下:

use rand::Rng;
use std::cmp::Ordering;
use std::collections::BTreeSet;
use std::iter::repeat;
fn main() {
let mut arr = vec![3, 2, 6, 7, 5, 1];
let mut op = vec![vec![3, 0], vec![4, 1], vec![2, 0]];
let ans2 = game2(&mut arr, &mut op);
println!("ans2 = {:?}", ans2);
let nn: i32 = 200;
let mm: i32 = 100;
let vv: i32 = 200;
let test_time: i32 = 5000;
println!("测试开始");
for i in 0..test_time {
let n: i32 = rand::thread_rng().gen_range(0, nn) + 1;
let m: i32 = rand::thread_rng().gen_range(0, mm) + 1;
let mut arr = random_array(n, vv);
let mut op = random_op(m, n);
let ans1 = game1(&mut arr, &mut op);
let ans2 = game2(&mut arr, &mut op);
if ans1 != ans2 {
println!("出错了!");
println!("i = {}", i);
println!("ans1 = {:?}", ans1);
println!("ans2 = {:?}", ans2);
break;
}
}
println!("测试结束");
} // 暴力方法
// 为了验证
fn game1(arr: &mut Vec<i32>, op: &mut Vec<Vec<i32>>) -> Vec<i32> {
let n = arr.len() as i32;
let mut help: Vec<i32> = repeat(0).take(n as usize).collect();
for i in 0..n {
help[i as usize] = arr[i as usize];
}
for o in op.iter() {
if o[1] == 0 {
help[0..o[0] as usize].sort_by(|a, b| a.cmp(b));
} else {
help[0..o[0] as usize].sort_by(|a, b| b.cmp(a));
}
}
let mut ans: Vec<i32> = repeat(0).take(n as usize).collect();
for i in 0..n {
ans[i as usize] = help[i as usize];
}
return ans;
} // 正式方法
// 时间复杂度O(M) + O(N*logN)
fn game2(arr: &mut Vec<i32>, op: &mut Vec<Vec<i32>>) -> Vec<i32> {
let n = arr.len() as i32;
let m = op.len() as i32;
let mut stack: Vec<i32> = repeat(0).take(m as usize).collect();
let mut r = 0;
for i in 0..m {
while r != 0 && op[stack[(r - 1) as usize] as usize][0] <= op[i as usize][0] {
r -= 1;
}
stack[r as usize] = i;
r += 1;
}
let mut ans: Vec<i32> = repeat(0).take(n as usize).collect();
let mut ansi = n - 1;
let mut l = 0;
while ansi >= op[stack[l as usize] as usize][0] {
ans[ansi as usize] = arr[ansi as usize];
ansi -= 1;
}
let mut sorted: BTreeSet<Number> = BTreeSet::new();
for i in 0..op[stack[l as usize] as usize][0] {
sorted.insert(Number::new(arr[i as usize], i));
}
while l != r {
// 当前处理的指令
let cur = &op[stack[l as usize] as usize];
l += 1;
if l != r {
let mut next = &op[stack[l as usize] as usize];
let num = cur[0] - next[0];
if cur[1] == 0 {
for i in 0..num {
ans[ansi as usize] = sorted.pop_last().unwrap().value;
ansi -= 1;
}
} else {
for i in 0..num {
ans[ansi as usize] = sorted.pop_first().unwrap().value;
ansi -= 1;
}
}
} else {
if cur[1] == 0 {
while sorted.len() > 0 {
ans[ansi as usize] = sorted.pop_last().unwrap().value;
ansi -= 1;
}
} else {
while sorted.len() > 0 {
ans[ansi as usize] = sorted.pop_first().unwrap().value;
ansi -= 1;
}
}
}
}
return ans;
} struct Number {
value: i32,
index: i32,
} impl Number {
fn new(v: i32, i: i32) -> Self {
Self { value: v, index: i }
}
} impl Ord for Number {
fn cmp(&self, other: &Self) -> Ordering {
if self.value != other.value {
self.value.cmp(&other.value)
} else {
self.index.cmp(&other.index)
}
}
} impl PartialOrd for Number {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
} impl PartialEq for Number {
fn eq(&self, other: &Self) -> bool {
(self.value, &self.index) == (other.value, &other.index)
}
} impl Eq for Number {} // 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {
let mut ans: Vec<i32> = repeat(0).take(n as usize).collect();
for i in 0..n {
ans[i as usize] = rand::thread_rng().gen_range(0, v) + 1;
}
return ans;
} // 为了测试
fn random_op(m: i32, n: i32) -> Vec<Vec<i32>> {
let mut ans: Vec<Vec<i32>> = repeat(repeat(0).take(2).collect())
.take(m as usize)
.collect();
for i in 0..m {
ans[i as usize][0] = rand::thread_rng().gen_range(0, n + 1);
ans[i as usize][1] = rand::thread_rng().gen_range(0, 2);
}
return ans;
} // 为了测试
fn is_equal(arr1: &mut Vec<i32>, arr2: &mut Vec<i32>) -> bool {
if arr1.len() != arr2.len() {
return false;
}
for i in 0..arr1.len() {
if arr1[i as usize] != arr2[i as usize] {
return false;
}
}
return true;
}

2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k,的更多相关文章

  1. Daily Scrum 12.20

    Member Task on 12.20 Task on 12.21 仇栋民 继续Task972 : 完成活动评分基础功能 完成Task972 : 完成活动评分基础功能 康家华 完成 Task1010 ...

  2. 2022.02.20 SA

    2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...

  3. jQuery二——属性操作、文档操作、位置属性

    一.jquery的属性操作 jquery对象有它自己的属性和方法. 其中jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作. 1.html属性操作 是对htm ...

  4. Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让你成为耍猴高手 - Monkey(猴子) - MonkeyScript(超详解)

    简介 一年一度的暑假如期而至,每年必不可少的,便是<西游记>这部经典电视连续剧的播出,作为一名90后,对于这部经典剧的情谊,就是观看已成为一种习惯.依然深刻的记得,小时候妈妈为了催促我睡觉 ...

  5. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询

    MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...

  6. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  7. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)

    昨日内容回顾 1.app播放音乐 plus.audio.createPlayer(文件路径/URL) player.play() 播放音乐 player.pause() 暂停播放 player.res ...

  8. GIS基础软件及操作(二)

    原文 GIS基础软件及操作(二) 练习二.管理地理空间数据库 1.利用ArcCatalog 管理地理空间数据库 2.在ArcMap中编辑属性数据 第1步 启动 ArcCatalog 打开一个地理数据库 ...

  9. PHP操作 二维数组模拟mysql函数

    PHP操作 二维数组模拟mysql函数<pre>public function monimysqltest(){ $testarray=array( array('ss'=>'1', ...

  10. Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

    原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...

随机推荐

  1. OSPF之Router id冲突

  2. ⾼性能IO模型:为什么单线程Redis能那么快

      Redis是单线程,主要是指Redis的⽹络IO和键值对读写是由⼀个线程来完成的,这也是Redis对外提供键值存储服务的主要流程.但Redis的其他功能,⽐如持久化.异步删除.集群数据同步等,其实 ...

  3. ChatGPT对于滤除微多普勒运动目标的解决方案

    上一篇体验了一把GPT的真香定律,赶紧又问了一些同事问的如何滤除微多普勒目标的问题.感觉还可以,后面可以试试看,具体大家可以一起看看这个回答,还是有一些可以采纳的意见(文章内容为GPT回答的内容,可能 ...

  4. Django笔记五之字段类型

    这篇笔记介绍字段的类型 Field Type. Django 的model 下的 field 对应的是 MySQL 中的表字段,而我们定义的 field 的类型则对应 MySQL 中的字段类型. 本次 ...

  5. 如何单机部署多个 MySQL 8.0 实例 ?

    在服务器资源有限的情况下,可利用该方案快速搭建各类 mysql 架构方案.各 MySQL 实例共享一个 mysqld 主程序,但各实例数据目录是独立的,存放在不同的文件夹中:好了.废话不多说,直接上干 ...

  6. 机器学习基础09DAY

    分类算法之逻辑回归 逻辑回归(Logistic Regression),简称LR.它的特点是能够是我们的特征输入集合转化为0和1这两类的概率.一般来说,回归不用在分类问题上,因为回归是连续型模型,而且 ...

  7. 全网最详细 二进制 k8s v1.25.x文档

    二进制安装k8s v1.25.0 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支持IPv4+IPv6双栈 ...

  8. pandas之loc/iloc操作

    在数据分析过程中,很多时候需要从数据表中提取出相应的数据,而这么做的前提是需要先"索引"出这一部分数据.虽然通过 Python 提供的索引操作符"[]"和属性操 ...

  9. [Java SE]javac编译时编码错误

    1 问题复现 Information:java: javacTask: 源发行版 8 需要目标发行版 1.8 Information:java: Errors occurred while compi ...

  10. OpenTiny 跨端、跨框架组件库升级TypeScript,10万行代码重获新生

    摘要:一份精心准备的<JS项目改造TS指南>文档供大家参考,顺便介绍TS 基础知识和 TS 在 Vue 中的实践. 本文分享自华为云社区<历史性的时刻!OpenTiny 跨端.跨框架 ...