2024牛客寒假算法基础集训营2

2024-02-11 17:36

本文主要是介绍2024牛客寒假算法基础集训营2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C Tokitsukaze and Min-Max XOR

题目大意

  • 给定一个数组a
  • a任取数构成序列b
  • 序列b满足b_i=min\ b,b_j=max\ b,b_i\ xor\ b_j \leq k,(可以只取一个数)
  • 问能构造出多少个b
  • mod=1e9+7

解题思路

  • maxmin
  • 双枚举时间复杂度到O(n^2),考虑利用01Trie加速统计b_i \ xor\ b_j< k的方案
  • 01Trie,即将数字按二进制位拆分挂在树上
  • 对于一个数,它在树上经过的点,均加上它对答案的贡献
  • 所以树上的某一点存的信息为,以这个点的数位为分界,在它之前(包括它)均为某固定值,而在它后均为任意值的数对答案的贡献
  • 若当前值为a_j,令其为max,则小于a_j的有j-1个,不考虑限制的话,共有2^{j-1}种选取min的方式
  • 若选取了a_i作为min,则1\rightarrow i均确定了是否选取
  • 所以min=a_i,max=a_j,方案数为2^{j-1}/2^i
  • 若在01Trie上,当前为第t位,则前t-1位均与a_j\ xor\ k对应数位相同
  • k的第t位为1,且01Trie存在着与a_j的第t位相同的点
  • a_j与该点往下的所有值异或后,第t位均为0
  • 答案加上该点值,即ans+=\sum_{i} Val(a_i),a_i\ xor\ a_j< k
  • 不必在从该点往下走挨个统计,实现了加速
  • 若能在01Trie上走到最后,则存在a_i\ xor\ a_j=k,答案加上该点值
  • 最后处理完了a_j,在将其加入01Trie
  • 由于b数组长度可以为1,所以初始ans=n
  • 最终复杂度为O(nlogn)
  • 注意Trie上为31\rightarrow 0

import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.Vector;public class Main{static long md=(long)1e9+7L;static long qm(long a,long b) {long res=1;while(b>0) {if((b&1)==1)res=(res*a)%md;a=a*a%md;b>>=1;}return res;}staticclass Trie{long[] cnt;//一个数分成32位,共32层,最后一层最多为nint[][] tr;//01trieint t;public Trie(int n) {cnt=new long[n*32];tr=new int[n*32][2];t=0;}void insert(int x,long y) {int p=0;for (int i = 31; i >= 0; i--) {int j=(x>>i)&1;if(tr[p][j]==0) {t++;tr[p][j]=t;}p=tr[p][j];cnt[p]=(cnt[p]+y)%md;//在沿途放上,便于统计小于k的情况}}long query(int x,int k) {long res=0;int p=0;for (int i = 31; i >= 0; i--) {int xt=(x>>i)&1;int kt=(k>>i)&1;if(kt==1&&tr[p][xt]!=0) {res=(res+cnt[tr[p][xt]])%md;//统计i^j<k}if(tr[p][xt^kt]==0) {return res;//不能满足前t-1位,i^j=k}p=tr[p][xt^kt];}res=(res+cnt[p])%md;//i^j=k的情况return res;}}public static void main(String[] args) throws IOException{AReader input=new AReader();PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int T=input.nextInt();while(T>0) {int n=input.nextInt();int k=input.nextInt();int[] a=new int[n+1];for(int i=1;i<=n;++i)a[i]=input.nextInt();Arrays.sort(a,1,n+1);Trie Tp=new Trie(n+1);long ans=n;//min=i,max=j,i=j的情况for(int i=1;i<=n;++i) {//此时trie上的数均小于a[i]int x=a[i];ans=(ans+Tp.query(x, k)*qm(2, i-1)%md)%md;long inv=qm(qm(2L, i), md-2);Tp.insert(x, inv);}out.println(ans);T--;}out.flush();out.close();}staticclass AReader{BufferedReader bf;StringTokenizer st;BufferedWriter bw;public AReader(){bf=new BufferedReader(new InputStreamReader(System.in));st=new StringTokenizer("");bw=new BufferedWriter(new OutputStreamWriter(System.out));}public String nextLine() throws IOException{return bf.readLine();}public String next() throws IOException{while(!st.hasMoreTokens()){st=new StringTokenizer(bf.readLine());}return st.nextToken();}public char nextChar() throws IOException{//确定下一个token只有一个字符的时候再用return next().charAt(0);}public int nextInt() throws IOException{return Integer.parseInt(next());}public long nextLong() throws IOException{return Long.parseLong(next());}public double nextDouble() throws IOException{return Double.parseDouble(next());}public float nextFloat() throws IOException{return Float.parseFloat(next());}public byte nextByte() throws IOException{return Byte.parseByte(next());}public short nextShort() throws IOException{return Short.parseShort(next());}public BigInteger nextBigInteger() throws IOException{return new BigInteger(next());}public void println() throws IOException {bw.newLine();}public void println(int[] arr) throws IOException{for (int value : arr) {bw.write(value + " ");}println();}public void println(int l, int r, int[] arr) throws IOException{for (int i = l; i <= r; i ++) {bw.write(arr[i] + " ");}println();}public void println(int a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(int a) throws IOException{bw.write(String.valueOf(a));}public void println(String a) throws IOException{bw.write(a);bw.newLine();}public void print(String a) throws IOException{bw.write(a);}public void println(long a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(long a) throws IOException{bw.write(String.valueOf(a));}public void println(double a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}public void print(double a) throws IOException{bw.write(String.valueOf(a));}public void print(char a) throws IOException{bw.write(String.valueOf(a));}public void println(char a) throws IOException{bw.write(String.valueOf(a));bw.newLine();}}
}

这篇关于2024牛客寒假算法基础集训营2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长,在这个色彩缤纷的季节,SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心(北京朝阳馆)隆重开幕。新老朋友共聚一堂,把酒话桑麻。 为期4天的国际学术会议以“先进复合材料,引领产业创新与可持续化发展”为主题,设立了34个主题分会场,其中包括了可持续化会场、国际大学生会场、中法复合材料制造技术峰会三个国际会场和女科技工作者委员会沙龙,

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

00 - React 基础

1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名如:npx create-react-app react-redux-pro JSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 JavaScript 代码中编写 HTML。 const element =

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo