2023牛客暑假多校-5-I-The Yakumo Family

news2024/12/23 18:17:03

 解法:考虑枚举[l_{2},r_{2}]这个区间,设这个区间异或和为w。对于左端点 ,预处理出其左侧的所有子区间异或和的和pre[i] ,表示区间[1,i]上所有子区间异或和。对右侧也做同样操作预处理出suf[i],表示区间[i,n]上所有子区间异或和。那么最后答案就是\sum w*pre[l_{2}-1]*suf[r_{2}+1]。最重要的就是如何求pre、suf数组,以及如何枚举,答案就是通过拆位技巧得到,所谓拆位技巧就是按位计算。

pre数组的处理过程:定义s[i]表示前i个数异或和,则s[i]的二进制数第k位表示前i个数的二进制数第k位异或和,预处理好的。以拆位视角,仅考虑第 k个二进制位的贡献。对于一个右端点 i 确定的区间[x,i],考虑二进制第k位,该区间在该二进制位上贡献为1的次数等于:s[i]的第k位不等于s[x-1]的第k位,并且x\leq i的x的个数。在区间[1,i]上,讨论i对pre[i]的贡献,就相当于i固定去找x的个数。

suf数组处理过程类似。

枚举过程:也是通过拆位技巧实现,考虑第k位的贡献。此时s[i]设置成后i个数的异或和,对于区间[l_{2},r_{2}],先枚举左端点,右端点位置就是去区间[l_{2},n]上找一个x,使得[l_{2},x]上第k位异或和为1的x的个数,跟上面类似等于:s[l_{2}]的第k位不等于s[x+1]的第k位的个数。

代码具体如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const long long mod = 998244353;
ll a[200005];
ll pre[200005];//前缀子区间和
ll suf[200005];//后缀子区间和
ll s[200005];//异或和
ll f[3][205];//f[0/1][j]表示第j位是0/1的个数.
int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		s[i] = s[i - 1] ^ a[i];
	}
	//处理前缀
	memset(f, 0, sizeof(f));
	//0的个数要初始化位1。
	for (int i = 0; i <= 30; i++)
	{
		f[0][i] = 1;
	}
	for (int i = 1; i <= n; i++)
	{
		pre[i] = pre[i - 1];
		for (int j = 0; j <= 30; j++)
		{
			int u = (s[i] >> j) & 1;//取s[i]的第j位
			pre[i] = (pre[i] + (1 << j) * f[u ^ 1][j]%mod)%mod;//u=0就去找1的个数,u=1就去找0的个数,再乘上第j位十进制值
		}
		for (int j = 0; j <= 30; j++)
		{
			int u = (s[i] >> j) & 1;
			f[u][j]++;//依次更新0/1的个数
		}
	}
	//处理后缀
	memset(f, 0, sizeof(f));
	for (int i = n; i >= 1; i--)
	{
		s[i] = s[i + 1] ^ a[i];
	}
	for (int i = 0; i <= 30; i++)
	{
		f[0][i] = 1;
	}
	for (int i = n; i >= 1; i--)
	{
		suf[i] = suf[i + 1];
		for (int j = 0; j <= 30; j++)
		{
			int u = (s[i] >> j) & 1;
			suf[i] = (suf[i] + (1 << j) * f[u ^ 1][j]%mod)%mod;
		}
		for (int j = 0; j <= 30; j++)
		{
			int u = (s[i] >> j) & 1;
			f[u][j]++;
		}
	}
	//最后解决
	memset(f, 0, sizeof(f));
	//此时f[0/1][j]记录的是第j位为有k个0/1的k个suf数组的总和
	ll ans = 0;
	for (int i = n; i >= 1; i--)
	{
		for (int j = 0; j <= 30; j++)
		{
			int u = (s[i] >> j) & 1;
			ans = (ans + pre[i - 1] * (1 << j) % mod * f[u ^ 1][j])%mod;//pre*中间异或和*suf
		}
		for (int j = 0; j <= 30; j++)
		{
			int u = (s[i] >> j) & 1;
			f[u][j] = (f[u][j] + suf[i])%mod;
		}
	}
	cout << ans << endl;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/825253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下 Docker容器引擎基础(2)

目录 创建私有仓库 将修改过的nginx镜像做标记封装&#xff0c;准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…

【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历

递归与非递归实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树图 定义 前序遍历&#xff08;Preorder Traversal&#xff09;&#xff1a; 前序遍历的顺序是先访问根节点&#xff0c;然后按照先左后右的顺序访问子节点。对于上面的二叉树&#xff0c;前序遍历的结果是&…

IO流中「线程」模型总结

一、基础简介 在IO流的网络模型中&#xff0c;以常见的「客户端-服务端」交互场景为例&#xff1b; 客户端与服务端进行通信「交互」&#xff0c;可能是同步或者异步&#xff0c;服务端进行「流」处理时&#xff0c;可能是阻塞或者非阻塞模式&#xff0c;当然也有自定义的业务…

12.其他事件

12.1 页面加载事件 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 1.事件名&#xff1a;load ●监听页面所有资源加载完毕&#xff1a; ➢给window添加load事件 //页面加载事件 window.addEventListener( load, function () { //…

java后端富文本转word,再传递到浏览器下载。

思路参考&#xff0c;以及所有的工具类都使用了》牧羊人大佬的代码《 有帮助的话不用给到我点赞&#xff0c;给大佬点赞即可 这是前端代码&#xff0c;必须使用get。 post后端返回的流浏览器接收不到&#xff08;具体原因不详&#xff09;。get无法传递requestBody&#xff0c;…

Python实现GA遗传算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

STM32F4_内存管理(Malloc、Free)

目录 前言 1. 内存管理介绍 1.1 分块式内存管理 2. 实验程序 2.1 main.c 2.2 Malloc.c 2.3 Malloc.h 前言 相信大家在学习C语言的过程中&#xff0c;都会学习到 malloc 动态开辟函数和 free 释放内存函数&#xff1b;这两个函数带给我们的优越性是&#xff1a; 我们在使…

[深度学习] GPU处理能力(TFLOPS/TOPS)

计算能力换算 理论峰值 &#xff1d; GPU芯片数量GPU Boost主频核心数量*单个时钟周期内能处理的浮点计算次数 只不过在GPU里单精度和双精度的浮点计算能力需要分开计算&#xff0c;以最新的Tesla P100为例&#xff1a; 双精度理论峰值 &#xff1d; FP64 Cores &#xff0a;…

Scratch Blocks自定义组件之「下拉图标」

一、背景 由于自带的下拉图标是给水平布局的block使用&#xff0c;放在垂直布局下显得别扭&#xff0c;而且下拉选择后回修改image字段的图片&#xff0c;这让我很不爽&#xff0c;所以在原来的基础上稍作修改&#xff0c;效果如下&#xff1a; 二、使用说明 &#xff08;1&am…

转机来了,国内全新芯片技术取得突破,关键驱动引擎开始提速

芯片技术转机来了 我们都知道&#xff0c;芯片技术是现代信息技术的基石&#xff0c;它驱动着计算机、智能手机、物联网设备等各类电子设备的运行。 科技的不断进步&#xff0c;芯片技术也在不断演进。 从传统的集成电路到现代的微处理器和系统芯片&#xff0c;其计算能力和能…

Total Variation loss

Total Variation loss 适合任务 图像复原、去噪等 处理的问题 图像上的一点点噪声可能就会对复原的结果产生非常大的影响&#xff0c;很多复原算法都会放大噪声。因此需要在最优化问题的模型中添加一些正则项来保持图像的光滑性&#xff0c;图片中相邻像素值的差异可以通过…

Pytorch深度学习框架入门

1.pytorch加载数据 唤醒指定的python运行环境的命令&#xff1a; conda activate 环境的名称 from torch.utils.data import Dataset #Dataset数据处理的包 from PIL import Image import os#定义数据处理的类 class MyData(Dataset):#数据地址处理方法def __init__(self,ro…

从《信息技术服务数据中心业务连续性等级评价准则》看数据备份

​​​​​​​ 5月23日&#xff0c;国家标准化管理委员会与国家市场监督管理总局发布了《信息技术服务数据中心业务连续性等级评价准则》&#xff0c;旨在适应各行各业逐步深入的数字化转型&#xff0c;提升全社会对数据中心服务中断风险的重视。 信息技术服务数据中心业务连续…

KL15 是什么?ACC,crank,on等

KL含义 KL is the abbreviation for klemme which is the German term for connector / connection.KL是“ klemme”的缩写&#xff0c;这是德语中连接器或连接的术语。 KL30 &#xff0c;通常表示电瓶的正极。positive KL31&#xff0c;通常表示电瓶的负极。negative KL15, 通…

【NLP概念源和流】 04-过度到RNN(第 4/20 部分)

接上文 【NLP概念源和流】 03-基于计数的嵌入,GloVe(第 3/20 部分) 一、说明 词嵌入使许多NLP任务有了显著的改进。它对单词原理图的理解以及将不同长度的文本表示为固定向量的能力使其在许多复杂的NLP任务中非常受欢迎。大多数机器学习算法可以直接应用于分类和回归任务的…

go初识iris框架(三) - 路由功能处理方式

继了解get,post后 package mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()//app.Handle(请求方式,url,请求方法)app.Handle("GET","/userinfo",func(ctx iris.Context){path : ctx.Path()app.Logger().Info(path) //获…

MTS性能监控你知道多少

前言 说到MySQL的MTS&#xff0c;相信很多同学都不陌生&#xff0c;从5.6开始基于schema的并行回放&#xff0c;到5.7的LOGICAL_CLOCK支持基于事务的并行回放&#xff0c;这些内容都有文章讲解&#xff0c;在本篇文章不再赘述。今天要讲的是&#xff0c;你知道如何查看并行回放…

最新AI系统ChatGPT网站源码/支持GPT4.0/GPT联网功能/支持ai绘画/mj以图生图/支持思维导图生成

使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到系统&#xff01; 同步mj图片重新生成指令 同步 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GPT联网提问功能、签到功能 一、功能演示 …

基于springboot生鲜物流系统-计算机毕设 附源码13339

springboot生鲜物流系统 摘要 生鲜产品易于腐烂、难贮存、不易长时间运输&#xff0c;生产者所面临的市场风险很大&#xff0c;很多生鲜产品无法实现“货畅其流”和“物尽其值”&#xff0c;适宜的生鲜产品物流体系就显得尤为重要。本文将广东省生鲜产品物流体系的构建作为一个…

删除链表中等于给定值 val 的所有节点

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 给出链表 1->2->3->3->4->5->3, 和 val 3, 你需要返回删除3之后的链表&#xff1a;1->2->4->5。 分析思路&#xff1a;这道题的思路&#xff0c;与之前删除链表中重复的结点相似。 因…