牛客周赛 Round 12 解题报告 | 珂学家 | 异或拆位技巧+加权前缀和

本文主要是介绍牛客周赛 Round 12 解题报告 | 珂学家 | 异或拆位技巧+加权前缀和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


前言

alt


整体评价

感觉前三题还是太简单,但第四题不错,不知道称呼为加权前缀和,还是前缀和的前缀和合适,真的太经典了。

比赛中,唯一的遗憾就是1000000007少写了一个0,哀叹一声。


A. 小美种果树

贪心,即第一天就施肥,

然后3天形成一个循环节, y + 3 * x

然后需要处理下尾巴

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));long x = sc.nextLong(), y = sc.nextInt(), z = sc.nextInt();long round = y + 3 * x;if (z % round == 0) {System.out.println(z / round * 3);} else {long r = z / round * 3;long left = z % round;if (left > 0) {r += 1; // 第一天(x+y)r += (Math.max(left - y - x, 0) + x - 1) / x;}System.out.println(r);}}}

B. 小美的子序列

双指针寻求匹配即可

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int h = sc.nextInt(), w = sc.nextInt();char[][] grid = new char[h][];for (int i = 0; i < h; i++) {grid[i] = sc.next().toCharArray();}char[] p = "meituan".toCharArray();int k = 0;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (k < p.length && grid[i][j] == p[k]) {// 在一行中找到了匹配字符k++;break;}}}System.out.println(k >= p.length ? "YES" : "NO");}}

C. 小美的游戏

贪心,要使得最后的元素和最大,那一定要使得单个元素最大

挑选最大的最多k个数(都大于1),然后累加剩下的数

import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int n = sc.nextInt(), k = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}Arrays.sort(arr);long mod = 10_0000_0007l;long res = 1l;// 挑选最大的k个数int t = Math.min(k + 1, n - 1);for (int i = 0; i < t; i++) {res = res * arr[n - 1 - i] % mod;}// 合并后产生的1res = ((res + (t - 1)) % mod + mod) % mod;// n-k个剩余的数for (int i = t; i < n; i++) {res = (res + arr[n - 1 - i]) % mod;}System.out.println(res);}}

D. 小美的区间异或和

先来解决下一个简单的前置问题

求一个集合S中所有任意两元素的异或和

关于这个问题,相对比较简单,就是拆位,按30个二进制位进行统计,分别统计0和1的个数,根据异或性质

alt

在回到本题,这题需要求解

所有连续子数组的 异或和

如果枚举所有的子数组,就算前缀和优化,时间复杂度依然达到 O ( n 2 ) , n = 1 0 5 O(n^2), n=10^5 O(n2),n=105

所以需要看看,如何降维

S i S_i Si为以第i元素为右端点的所有区间(集合)的异或和

alt

现在问题,就是如何优化下括号这块

异或和不满足分配律,且很难维护,但是拆位后就很容易了

  • 拆位+加权前缀和

a i ( j ) a_i(j) ai(j)表示第i个元素第j位的值, [ a t ( j ) = x ] [a_t(j)=x] [at(j)=x]相等为1,不等为0

定义p(i, j, x)表示前i个元素,在二进制的j位,等于x的加权前缀和

alt

简单来说,就是 加权 i i i (下标位置) 按位维护0,1的前缀加权和。

到这,基本这题就结束了。

import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}// 拆位// 0, 1的个数long mod = 10_0000_0007l;long[][] pre = new long[30][2];long[] s = new long[n + 1];for (int i = 0; i < n; i++) {long delta = 0;for (int j = 0; j < 30; j++) {if (((1 << j) & arr[i]) != 0) {delta = (delta + pre[j][0] * (1l << j) % mod) % mod;} else {delta = (delta + pre[j][1] * (1l << j) % mod) % mod;}}// s(i+1)=s(i)+增量s[i + 1] = (s[i] + delta) % mod;for (int j = 0; j < 30; j++) {if (((1 << j) & arr[i]) != 0) {// 加权体现在(i+1)上pre[j][1] = (pre[j][1] + (i + 1)) % mod;} else {pre[j][0] = (pre[j][0] + (i + 1)) % mod;}}}// 累加和long res = 0;for (int i = 1; i <= n; i++) {res = (res + s[i]) % mod;}System.out.println(res);}}

写在最后

alt

这篇关于牛客周赛 Round 12 解题报告 | 珂学家 | 异或拆位技巧+加权前缀和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622651

相关文章

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核