牛客周赛 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

相关文章

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

电脑提示Winmm.dll缺失怎么办? Winmm.dll文件丢失的多种修复技巧

《电脑提示Winmm.dll缺失怎么办?Winmm.dll文件丢失的多种修复技巧》有时电脑会出现无法启动程序,因为计算机中丢失winmm.dll的情况,其实,winmm.dll丢失是一个比较常见的问... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

ubuntu16.04如何部署dify? 在Linux上安装部署Dify的技巧

《ubuntu16.04如何部署dify?在Linux上安装部署Dify的技巧》随着云计算和容器技术的快速发展,Docker已经成为现代软件开发和部署的重要工具之一,Dify作为一款优秀的云原生应用... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。它

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板