牛客周赛 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使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S