Atcoder ABC340 E - Mancala 2

news2025/1/11 8:38:04

Mancala 2(曼卡拉 2)

时间限制:2s 内存限制:1024MB

【原题地址】

所有图片源自Atcoder,题目译文源自脚本Atcoder Better!

点击此处跳转至原题

【问题描述】

在这里插入图片描述

【输入格式】

在这里插入图片描述
在这里插入图片描述

【输出格式】

在这里插入图片描述

【样例1】

【样例输入1】

5 3
1 2 3 4 5
2 4 0

【样例输出1】

0 4 2 7 2

【样例说明1】

在这里插入图片描述

【样例2】

【样例输入2】

3 10
1000000000 1000000000 1000000000
0 1 0 1 0 1 0 1 0 1

【样例输出2】

104320141 45436840 2850243019

【样例3】

【样例输入3】

1 4
1
0 0 0 0

【样例输出3】

1

【解题思路】

老汉使用到的是差分+数状数组的解题方式

本题要求进行几次操作后最终的数组数值。
如果只是对每一次分配进行单独计算,会tle(起初我就是单纯的以为如此简单,结果超时了)
那么我们需要考虑一个优化方式来降低我们的时间复杂度,分析到每次操作都是区间更新且最终是当点查询,那我们可以使用差分+树状数组的形式去解题(不懂的小伙伴们可以去搜索学习一下)

代码注释有详细过程

【代码】

package ABC340_E_Mancala2;

import java.util.*;

public class Main {
	static long[] tree;
	// 差分数组
	static long[] sub;
	// 初始值数组
	static long[] arr;
	static int n;

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		int m = scan.nextInt();
		arr = new long[n + 1];
		sub = new long[n + 2];
		tree = new long[n + 2];
		// 为差分数组赋初值
		for (int i = 1; i <= n; i++) {
			arr[i] = scan.nextLong();
			sub[i] = arr[i] - arr[i - 1];
		}
		build();
		for (int i = 0; i < m; i++) {
			int x = scan.nextInt() + 1;
			long val = query(x);
			// x下标位置数值变化,x差分-val
			add(x, -val);
			sub[x] -= val;
			// x下标位置数值变化,x+1差分+val
			add(x + 1, val);
			sub[x + 1] += val;
			// 每个位置都能分配到的数
			long v = val / n;
			// 都+v,差分不变,唯独下标为1的差分增加v,sub[1]=sub[1]-0
			add(1, v);
			sub[1] += v;
			// 求余下无法每个位置平均分配的数
			val = val % n;
			// 当余下分配到x右半边的位置刚好分完时
			if (x + val <= n) {
				// 当刚好分配到最后一个点时,x+1下标位置差分+1即可
				if (x + val == n) {
					add(x + 1, 1);
					sub[x + 1] += 1;
				} else {
					add(x + 1, 1);
					sub[x + 1] += 1;
					// 否则要在分配到的最后一个点的下一个点的差分-1
					add((int) (x + val + 1), -1);
					sub[(int) (x + val + 1)] += -1;
				}
			} else {
				// 当x下标位置左边也被分配到时,x+1下标位置差分+1
				add(x + 1, 1);
				sub[x + 1] += 1;
				add(1, 1);
				sub[1] += 1;
				// 接着在分配到的最后一个点的下一个点的差分-1
				val -= (n - x);
				add((int) (1 + val), -1);
				sub[(int) (1 + val)] += -1;
			}
		}
		// 输出最终答案
		for (int i = 1; i <= n; i++) {
			System.out.print(query(i) + " ");
		}
		scan.close();
	}

	// 查询该下标数组当前值
	public static long query(int x) {
		long res = 0;
		while (x > 0) {
			res += tree[x];
			x -= lowbit(x);
		}
		return res;
	}

	// 更新树值
	public static void add(int x, long v) {
		while (x <= n) {
			tree[x] += v;
			x += lowbit(x);
		}
	}

	// 构建差分树
	public static void build() {
		for (int i = 1; i <= n; i++) {
			int t = i;
			tree[i] += sub[t];
			t += lowbit(t);
			if (t <= n)
				tree[t] += tree[i];
		}
	}

	public static int lowbit(int x) {
		return x & (-x);
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构(十四)动态Groovy脚本

一、引言 最近作者的平台项目需要实现前端输入脚本&#xff0c;后端在用户设置好的一些情况下运行这段脚本。后端是java&#xff0c;所以我们采用Groovy脚本。 所以要实现的功能就是动态的Groovy脚本&#xff01; 二、Groovy介绍 了解groovy和python的就可以直接到第三章了 2…

【git】提交信息写错了,使用 amend 或者 reset 修改最近一次的提交信息 ,修改上上次/以前的提交信息

如果你的提交信息写错了&#xff0c;比如下面&#xff0c;你想修改【初始化项目】这5个字 修改最近一次的提交新的两个办法 &#xff08;1&#xff09;使用 reset 把这个提交重置&#xff0c;然后重新提交&#xff0c;reset 的使用方法请参考这篇文章。但是 reset 这种方法只能…

django请求生命周期流程图,路由匹配,路由有名无名反向解析,路由分发,名称空间

django请求生命周期流程图 浏览器发起请求。 先经过网关接口&#xff0c;Django自带的是wsgiref&#xff0c;请求来的时候解析封装&#xff0c;响应走的时候打包处理&#xff0c;这个wsgiref模块本身能够支持的并发量很少&#xff0c;最多1000左右&#xff0c;上线之后会换成u…

Redis(十四)双写一致性工程案例

文章目录 问题概述canal功能安装部署mysql配置canal服务端canal客户端&#xff08;Java程序&#xff09; 问题概述 canal https://github.com/alibaba/canal 功能 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据…

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么&#xff1f;、能干什么&#xff1f;、怎么用&#xff1f; 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议&#xff0c;MQTT 全称为 Message Queuing Telemetry Transport&#xff08;消息队列遥测传输&#xff0…

IDEA查询对应功能的快捷键

首先要知道快捷键的key叫什么&#xff0c;然后通过key来找到对应的快捷键 比如下面这个查找删除导入未使用的类 跳转 或者安装对应插件

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、…

【Docker】docker常用命令

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、镜像仓库架构图 二、docker仓库命令 1、登录仓库docker login 2、拉取镜像docker pull 3、推送镜像docker pus…

TOUCHDESIGNER(1-2) 元件

元件来了 一级 二级 三级!!!

Git 客户端可视化工具tortoisegit

Git 使用教程 git一点通 (kdocs.cn) 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网 https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建…

说一下JVM类加载机制?

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。 在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊…

Python学习-数字类型、布尔类型

八、数字类型 1、整数&#xff08;integers&#xff09; Python的除法就算能被整除&#xff0c;也会产生带小数的结果。小数在Python中是以浮点数的形式存在的。 比如&#xff1a; >>>6/2 3.02、浮点数&#xff08;floating point numbers&#xff09; Python的浮…

排序算法之——直接插入排序

直接插入排序——以升序排列为例 1.1基本思想1.2动态图示感知1.3静态图示详解1.4代码实现1.5时间复杂度1.5.1最好情况1.5.2最差情况 1.6空间复杂度1.7稳定性1.7.1一个小问题 1.1基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直…

鸿蒙小案例-五子棋

鸿蒙小案例-五子棋 1.准备组件(组件布局) 2.下棋功能实现 3.机器人下棋功能实现 4.赢棋功能实现 5.附属功能实现刚开始以为挺简单的&#xff0c;越写越…emo 因为代码有点多&#xff0c;所以这里就简单讲下逻辑&#xff0c;文末贴上代码 逻辑只是我个人想的&#xff0c;不代…

Learn HTML in 1 hour

website address https://www.youtube.com/watch?vHD13eq_Pmp8 excerpt All right, what’s going on? everybody. It’s your Bro, hope you’re doing well, and in this video I’m going to help you started with html; so sit back, relax and enjoy the show. If y…

ABAP 导入Excel表示例程序

目录 ABAP 导入excel示例程序创建程序使用的结构上传下载模板 ABAP 导入excel示例程序 批量导入程序&#xff0c;需要使用到导入模板&#xff0c;首先需要创建程序&#xff0c;之后是需要创建excel导入模板&#xff0c;并且需要将excel导入模板上传到SAP系统里面&#xff0c;之…

【linux】查看openssl程序的安装情况

【linux】查看openssl程序的安装情况 1、查看安装包信息 $ rpm -qa |grep openssl 2、安装路径 $ rpm -ql openssl $ rpm -ql openssl-libs $ rpm -ql openssl-devel 3、相关文件和目录 /usr/bin/openssl /usr/include/openssl /usr/lib64/libssl.so.* /usr/lib64/libcrypto…

idea自动导包。已经无用导包自动移除

1.setting中勾选这两项&#xff0c;然后点击apply即可

【DDD】学习笔记-薪资管理系统的场景驱动设计

场景驱动设计的起点是领域场景&#xff0c;它不一定需要与事件风暴结合&#xff0c;只要识别并确定了领域场景&#xff0c;就可以进行任务分解。每个分解出来的子任务都可以视为是职责。分配职责时&#xff0c;场景驱动设计规定了履行职责的角色构造型&#xff0c;其中&#xf…

MongoDB 权限管理

文章目录 前言1. 权限控制1.1 MongoDB 默认角色1.1.1 读写角色1.1.2 管理角色1.1.3 其他角色1.1.4 超级用户角色 1.2 用户管理1.2.1 查看用户1.2.2 创建新用户1.2.3 调整角色1.2.4 删除用户1.2.4 修改密码 前言 上一篇 《MongoDB 单机安装部署》 文章中&#xff0c;为 MongoDB…