Atcoder ABC340 E - Mancala 2

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);
	}

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主流开发语言和开发环境介绍

主流开发语言和开发环境介绍文章目录 ⭐️ 主流开发语言&#xff1a;2024年2月编程语言排行榜&#xff08;TIOBE前十&#xff09;⭐️ 主流开发语言开发环境介绍1.Python2.C3.C4.Java5.C#6.JavaScript7.SQL8.GO9.Visual Basic10.PHP ⭐️ 主流开发语言&#xff1a;2024年2月编程…

2024年2月的TIOBE指数,go语言排名第8,JAVA趋势下降

二月头条&#xff1a;go语言进入前十 本月&#xff0c;go在TIOBE指数前10名中排名第8。这是go有史以来的最高位置。当谷歌于2009年11月推出Go时&#xff0c;它一炮而红。在那些日子里&#xff0c;谷歌所做的一切都是神奇的。在Go出现的几年前&#xff0c;谷歌发布了GMail、谷歌…

SpringBoot+WebSocket实现即时通讯(二)

前言 紧接着上文《SpringBootWebSocket实现即时通讯&#xff08;一&#xff09;》 本博客姊妹篇 SpringBootWebSocket实现即时通讯&#xff08;一&#xff09;SpringBootWebSocket实现即时通讯&#xff08;二&#xff09;SpringBootWebSocket实现即时通讯&#xff08;三&…

NestJS入门8:拦截器

前文参考&#xff1a; NestJS入门1&#xff1a;创建项目 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 NestJS入门4&#xff1a;MySQL typeorm 增删改查 NestJS入门5&#xff1a;加入Swagger NestJS入门6&#xff1a;日志中间件 Nes…

LeetCode 0105.从前序与中序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看)

【LetMeFly】105.从前序与中序遍历序列构造二叉树&#xff1a;分治&#xff08;递归&#xff09;——五彩斑斓的题解&#xff08;若不是彩色的可以点击原文链接查看&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-preorder-a…

小清新卡通人物404错误页面源码

小清新卡通人物404错误页面源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 蓝奏云&#xff1a;https://wfr.lanzout.com/i6XbU1olftde

区块链游戏解说:什么是 Nine Chronicles

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a; Nine Chronicles Dashboard 什么是 Nine Chronicles Nine Chronicles 是一款去中心化的在线角色扮演游戏&#xff0c;标志着在线游戏和区块链技术的发展。 Nine Chroni…

ubuntu分辨率更改、开机被重置、ubuntu屏幕小

ubuntu分辨率更改 分辨率改成&#xff1a;1920x1200 xrandr --size 1920x1200 在此之前可以先输入 xrandr 看支持哪些分辨率 开机被重置 我已经设置成这样了&#xff0c; 一开机变回这个 ubuntu屏幕小 输入命令行 xrandr --size 1920x1200 这个下次重启ubuntu又会重置…

C++(18)——适配器概念以及stack、queue、优先队列的模拟实现

上篇文章中&#xff0c;给出了对于模拟实现中功能的补全&#xff0c;本篇文章将优先介绍一个新的容器之后引入什么是适配器&#xff0c;以及适配器的使用方法&#xff0c;再通过适配器的思想来完成对于&#xff0c;、优先级队列_的实现。 目录 1. deque: 1.1 什么是deque&…

ASP.NET-实现图形验证码

ASP.NET 实现图形验证码能够增强网站安全性&#xff0c;防止机器人攻击。通过生成随机验证码并将其绘制成图像&#xff0c;用户在输入验证码时增加了人机交互的难度。本文介绍了如何使用 C# 和 ASP.NET 创建一个简单而有效的图形验证码系统&#xff0c;包括生成随机验证码、绘制…

树莓派4B傻瓜式安装系统配置(无显示器)

一、前言&#xff1a; 本教程详细描述树莓派如何装系统&#xff0c;如何连接电脑显示屏&#xff0c;有详细安装包&#xff0c;有需要的可以点击链接下载&#xff0c;没有会员的宝宝可以关注后私信我。 &#xff08;树莓派4B傻瓜式安装系统配置&#xff08;无显示器&#xff0…

onlyoffice基础环境搭建+部署+demo可直接运行 最简单的入门

office这个体系分为四个大教程 1、【document server文档服务器基础搭建】 2、【连接器(connector)或者jsApi调用操作office】-进阶 3、【document builder文档构造器使用】-进阶 4、【Conversion API(文档转化服务)】-进阶 如果需要连接器&#xff0c;可以查看&#xff1a;onl…

Fiddler如何比较两个接口请求?

进行APP测试时&#xff0c;往往会出现Android和iOS端同一请求&#xff0c;但执行结果不同&#xff0c;这通常是接口请求内容差异所致。 我习惯于用Fiddler抓包&#xff0c;那此时应该如何定位问题呢&#xff1f; 分别把Android和iOS的接口请求另存为TXT文件&#xff0c;然后用…

leetcode hot100零钱兑换Ⅱ

本题可以看出也是背包问题&#xff0c;但区别于之前的01背包问题&#xff0c;这个是完全背包问题的变形形式。 下面介绍01背包和完全背包的区别与联系&#xff1a; 01背包是背包中的物品只能用一次&#xff0c;不可以重复使用&#xff0c;而完全背包则是可以重复使用。01/完全…

体验一下UE5.3的Skeletal Editor

UE5.3中增加了蒙皮网格骨架编辑工具&#xff0c;用户无需导出Fbx就可以直接编辑蒙皮网格&#xff0c;支持修改绑定姿势的骨骼位置、修改蒙皮权重、对已蒙皮多边形进行编辑以及对蒙皮网格减免等操作&#xff0c;就来体验一下。 1.加载插件 要使用Skeletal Editor功能&#xff…

使用系统调用实现shell命令之【ls -l】

时间获取: 1.time time_t time(time_t *tloc); 功能: 返回1970-1-1到现在的秒数&#xff08;格林威治时间&#xff09; 参数: tloc:存放秒数空间首地址 返回值: 成功返回秒数 失败返回-1 2.localtime stru…

Stable Diffusion——基础模型、VAE、LORA、Embedding各个模型的介绍与使用方法

前言 Stable Diffusion&#xff08;稳定扩散&#xff09;是一种生成模型&#xff0c;基于扩散过程来生成高质量的图像。它通过一个渐进过程&#xff0c;从一个简单的噪声开始&#xff0c;逐步转变成目标图像&#xff0c;生成高保真度的图像。这个模型的基础版本是基于扩散过程…

ESMFold conda安装、使用及与AlphaFold的简单比较

文章目录 前言一、ESMFold是什么&#xff1f;二、安装步骤1. 确认安装环境&#xff1a;cuda toolkit版本2. 创建ESMFold conda环境并安装Step 1&#xff1a;创建conda环境&#xff0c;下载需要的包Step 2&#xff1a;激活conda环境&#xff0c;继续pip安装 3. 运行结构预测 三、…

pom.xml常见依赖及其作用

1.org.mybatis.spring.boot下的mybatis-spring-boot-starter&#xff1a;这个依赖是mybatis和springboot的集成库&#xff0c;简化了springboot项目中使用mybatis进行持久化操作的配置和管理 2.org.projectlombok下的lombok&#xff1a;常用注解Data、NoArgsConstructor、AllA…

【Vuforia+Unity】AR02-长方体物体识别

1.创建模型 选择多维长方体图&#xff0c;这个长方体是生活中的真实物体的拍摄图&#xff0c;提前把6个面拍摄好并裁剪干净。 官网创建模型https://developer.vuforia.com/targetmanager/project/targets?projectId0ddbb5c17e7f4bf090834650bbea4995&avfalse 设置长宽高…