2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k,
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,的更多相关文章
- Daily Scrum 12.20
Member Task on 12.20 Task on 12.21 仇栋民 继续Task972 : 完成活动评分基础功能 完成Task972 : 完成活动评分基础功能 康家华 完成 Task1010 ...
- 2022.02.20 SA
2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...
- jQuery二——属性操作、文档操作、位置属性
一.jquery的属性操作 jquery对象有它自己的属性和方法. 其中jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作. 1.html属性操作 是对htm ...
- Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让你成为耍猴高手 - Monkey(猴子) - MonkeyScript(超详解)
简介 一年一度的暑假如期而至,每年必不可少的,便是<西游记>这部经典电视连续剧的播出,作为一名90后,对于这部经典剧的情谊,就是观看已成为一种习惯.依然深刻的记得,小时候妈妈为了催促我睡觉 ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询
MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...
- 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...
- python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)
昨日内容回顾 1.app播放音乐 plus.audio.createPlayer(文件路径/URL) player.play() 播放音乐 player.pause() 暂停播放 player.res ...
- GIS基础软件及操作(二)
原文 GIS基础软件及操作(二) 练习二.管理地理空间数据库 1.利用ArcCatalog 管理地理空间数据库 2.在ArcMap中编辑属性数据 第1步 启动 ArcCatalog 打开一个地理数据库 ...
- PHP操作 二维数组模拟mysql函数
PHP操作 二维数组模拟mysql函数<pre>public function monimysqltest(){ $testarray=array( array('ss'=>'1', ...
- Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)
原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...
随机推荐
- .net core中使用HttpClient碰到的问题:This instance has already started one or more requests. Properties can only be modified before sending the first request
项目里使用httpclient一般加staic或者单例来防止每次请求都会新建立一个连接,从而占用太多的服务器资源, 问题产生 但是今天新加的一个方法中每次需要请求不同的url,这时候就出现了错误: 就 ...
- UniDBGrid控件的几个功能优化
内容自动换行 默认UniDBGrid的cell内的内容如果超出表格列宽并不自动换行和调整行高,给客户带来极大的不方便,通过修改ServerModule的属性CustomCSS可以实现. <sty ...
- sql函数的用法
1.codename 作为翻译函数 CREATE DEFINER=`root`@`localhost` FUNCTION `codename`(`sys_code` varchar(20),`stat ...
- 白鹭egret 控制屏幕方向
this.stage.orientation=fangxiang; fangxiang值: portrait landscape auto
- Gym - 101845E (图形转换思维)
题意:给你个边长为n(1 <= n <= 50)的下图这种三角形,图形所有点构成集合.找多少对a,b满足条件,条件为:ab两点之间还有其他点. 题解:刚开始以为直接找规律就行,wa了两次发 ...
- MyBatis 源码
一.准备工作 MyBatis 工作流程:应用程序首先加载 mybatis-config.xml 配置文件,并根据配置文件的内容创建 SqlSessionFactory 对象:然后,通过 SqlSess ...
- MyBatisPlus 整合 SpringBoot 遇见的问题(二)
[异常]:Cause: java.sql.SQLSyntaxErrorException: Unknown column 'udf1' in 'field list'...... SQL: SELEC ...
- tModLoader随机掉落模组编写
pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 1. 整体思路 目标是实 ...
- 学习httprunner遇到的问题记录
今天研究httprunner遇到了几个问题 1.问题1: 最新的版本4.3.0已经舍弃了locusts,har2case这两个东西 导致运行的时候,出现har2case不是内部命令 一开始以为是没有配 ...
- Charlotte Holmes series
Charlotte Holmes Novel The charactors are adorable. Jamie and Charlotte are a very cute couple. More ...