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

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...