灵茶八题 题目解析+核心代码

子数组+w+

  1. 由于仅存在加法,即满足交换律和结合律,故可考虑累加单个元素的总贡献
  2. 对当前元素g[i],包含该元素的子数组数为(i + 1) * (n - i + 1),则该元素的总贡献为(i + 1) * (n - i) * g[i],枚举所有元素累加即可
    • i起始为1
void solve(){int n;cin >> n;ll res = 0;for(int i = 1; i <= n; i++){int x;cin >> x;res += 1ll * i * (n - i + 1) * x;}cout << res << '\n';
}

子数组^w^

类似考虑单个元素总贡献,当元素g[i]的出现次数(i + 1) * (n - i)为奇数时总贡献为g[i],否则为0,计算异或和即可

void solve(){int n;cin >> n;ll res = 0;for(int i = 1; i <= n; i++){int x;cin >> x;x = (((n - i + 1) * i) & 1) * x;res ^= x;}cout << res << '\n';
}

子数组^w+

  1. 考虑异或前缀和sx[i],对任意子数组的异或和可表示为sx[r] ^ sx[l - 1]
  2. 考虑二进制拆位,即枚举累加每个二进制位的贡献
  3. 对当前位k,相当于在前缀和数组中选取两个元素,使sx[r] ^ sx[l - 1]中该位为1,即sx[r]sx[l - 1]必须恰好一个1一个0,此时贡献为1 << k
  4. 枚举统计前缀和数组中当前位下为1的元素个数cnt,则为0的个数为(n + 1 - cnt),故存在贡献的子数组的总贡献为cnt * (n + 1 - cnt) * (1 << k)
void solve(){int n;cin >> n;ve<int> sx(n + 1);for(int i = 1; i <= n; i++){cin >> sx[i];sx[i] ^= sx[i - 1];}ll res = 0;for(int k = 0; k < 22; k++){int cnt = 0;for(int i = 0; i <= n; i++) cnt += sx[i] >> k & 1;res += 1ll * cnt * (n + 1 - cnt) * (1 << k);}cout << res << '\n';
}

子数组+w^

  1. 考虑前缀和 s [ i ] s[i] s[i],对任意子数组和可表示为 s [ r ] − s [ l − 1 ] s[r] - s[l - 1] s[r]s[l1]

  2. 考虑二进制拆位,即枚举累加每个二进制位的贡献

  3. 对当前 k k k位,需要获取所有子数组和该位为1的数量,若为奇数则贡献为 2 k 2^k 2k,否则为0

  4. 问题转换为求指定位下所有子数组和该位为1的数量

  5. 只考虑低位到 k k k位,令所有 s [ i ] s[i] s[i] 2 k + 1 2^{k + 1} 2k+1取模,从而将 s [ r ] − s [ l − 1 ] s[r] - s[l - 1] s[r]s[l1]的结果及其 s [ r ] s[r] s[r] s [ l − 1 ] s[l - 1] s[l1]压缩到一定连续范围内

  6. k = 2 k = 2 k=2时, s [ r ] − s [ l − 1 ] s[r] - s[l - 1] s[r]s[l1]产生 k k k位为1的结果范围为[100, 111],考虑减法操作中高位的影响,如1000 - 1 = 111的结果满足条件,故当 s [ r ] ≥ 2 k + 1 s[r]≥2^{k + 1} s[r]2k+1时,在 k + 1 k+1 k+1位补1,此时结果范围为 [ 100 , 111 ] ∪ [ 1100 , 1111 ] [100,111]∪[1100,1111] [100,111][1100,1111],则 s [ l − 1 ] s[l - 1] s[l1]的范围为

    [ s [ r ] − 111 , s [ r ] − 100 ] ∪ [ s [ r ] − 1111 , s [ r ] − 1100 ] [s[r]-111, s[r]-100]∪[s[r]-1111,s[r]-1100] [s[r]111,s[r]100][s[r]1111,s[r]1100]

  7. 枚举所有 s [ r ] s[r] s[r],对当前 s [ r ] s[r] s[r]获取 [ 1 , r − 1 ] [1, r - 1] [1,r1]中在区间内的 s [ l − 1 ] s[l - 1] s[l1]的个数进行累加,最后得到当前位下所有子数组和该位为1的数量

  8. 由于 [ 1 , r − 1 ] [1, r-1] [1,r1]是动态区间,故使用树状数组维护即可

const int N = 2e7 + 10;ve<int> tr(N);int lowbit(int x){return x & -x;
}void add(int idx, int val){idx++;for(int i = idx; i < N; i += lowbit(i)) tr[i] += val;
}int sum(int x){x++;int ans = 0;while(x > 0){ans += tr[x];x -= lowbit(x);}return ans;
}void solve(){int n;cin >> n;ve<int> s(n + 1);for(int i = 1; i <= n; i++){cin >> s[i];s[i] += s[i - 1];}int res = 0;for(int k = 0; (1 << k) <= s[n]; k++){add(0, 1);int cnt = 0;for(int i = 1; i <= n; i++){int ts = s[i] & ((1 << (k + 1)) - 1);if(s[i] >= 1 << (k + 1)) ts |= 1 << (k + 1);int r = ts - (1 << k), l = ts - (1 << (k + 1)) + 1;cnt += sum(r) - sum(l - 1);l -= 1 << (k + 1), r -= 1 << (k + 1);cnt += sum(r) - sum(l - 1);add(s[i] & ((1 << (k + 1)) - 1), 1);}if(cnt & 1) res |= 1 << k;fill(all(tr), 0);}cout << res << '\n';
}

子序列+w+

  1. 由于仅存在加法,即满足交换律和结合律,故可考虑累加单个元素的总贡献
  2. 对于元素g[i],包含该元素的子序列总数为 2 n − 1 2^{n-1} 2n1,即总贡献为 2 n − 1 ∗ g [ i ] 2^{n-1}*g[i] 2n1g[i]
  3. 所有元素总贡献为 2 n − 1 ∗ s u m 2^{n-1}*sum 2n1sum
void solve(){int n;cin >> n;ll res = 0;for(int i = 0; i < n; i++){int x;cin >> x;res += x;}for(int i = 0; i < n - 1; i++) res = 2 * res % mod;cout << res << '\n';
}

子序列^w^

  1. 类似可考虑累加异或单个元素的总贡献
  2. 当且仅当n = 1存在贡献g[0],否则 2 n − 1 2^{n-1} 2n1为偶数,总贡献为0
void solve(){int n;cin >> n;ve<int> g(n);for(int i = 0; i < n; i++) cin >> g[i];if(n == 1) cout << g[0] << '\n';else cout << 0 << '\n';
}

子序列^w+

  1. 考虑二进制拆位,即枚举累加每个二进制位的贡献
  2. 对于当前位k,若所有元素都为0,则总贡献为0
  3. 若存在元素为1,设数量为c,可用数学归纳法证明从c个数中选偶数个数和奇数个数的方案数都为 2 c − 1 2^{c-1} 2c1,再算上0可得异或和为0和为1的子序列数都为 2 n − 1 2^{n-1} 2n1
  4. 则此时该位总贡献为 2 n − 1 ∗ 2 k 2^{n-1}*2^{k} 2n12k
void solve(){int n;cin >> n;ve<int> g(n);for(int i = 0; i < n; i++) cin >> g[i];ll res = 0;for(int k = 0; k < 30; k++){bool ok = false;for(int i = 0; i < n; i++){if(g[i] >> k & 1){ok = true;break;}}if(ok) res += 1 << k;}for(int i = 0; i < n - 1; i++) res = 2 * res % mod;cout << res << '\n';
}

子序列+w^

  1. 考虑枚举累加每个子序列和的可能值的贡献
  2. 对当前序列数和sum,得到该和的方案数为奇数时贡献为sum,否则为0
  3. 考虑使用01背包推导序列数和的方案数的奇偶性
void solve(){int n;cin >> n;int m = 1 << 16;ve<int> dp(m + 1);dp[0] = 1;for(int i = 0; i < n; i++){int v;cin >> v;for(int j = m; j >= v; j--){dp[j] = dp[j] ^ dp[j - v];}}int res = 0;for(int i = 0; i <= m; i++){if(dp[i]){res ^= i;}}cout << res << '\n';
}

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

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

相关文章

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同&#xff0c;物化视图&#xff08;Materialized View&#xff09;会将查询结果"物化"并保存下来&#xff0c;这意味着物化视图会消耗存储空间&#xff0c;物化的数据需要一定的刷新策略才能和基表同步&#xff0c;在使用和管理上比…

【网络安全】网络安全之信息收集和信息收集工具讲解,告诉你黑客是如何信息收集的

一&#xff0c;域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集&#xff0c;比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具&#xff0c;汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境

参考的博客&#xff1a; Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter&#xff0c;并创建虚拟环境 理解和创建&#xff1a;Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址&#xff0c;可…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器&#xff1a;转发所有端口1.6.2交换机&#xff1a;MAC地址转换表转发对应端口1.6.3主机&#xff1a;网络分层从上到下封装1.6.4主…

django 实现:闭包表—树状结构

闭包表—树状结构数据的数据库表设计 闭包表模型 闭包表&#xff08;Closure Table&#xff09;是一种通过空间换时间的模型&#xff0c;它是用一个专门的关系表&#xff08;其实这也是我们推荐的归一化方式&#xff09;来记录树上节点之间的层级关系以及距离。 场景 我们 …

网页采集工具-免费的网页采集工具

在当今数字化时代&#xff0c;网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作&#xff0c;网页采集工具都扮演着不可或缺的角色。对于许多用户来说&#xff0c;寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

Spring Mvc的相关知识

一、初识MVC 1.Spring Mvc 是控制层的Spring框架&#xff0c;替换Servlet&#xff0c;除了它以外&#xff0c;还有 struct1和 struct2 区别&#xff1a; 1.struct1被struct2 取代 2.struct2&#xff1a;采用 prototype多例模式&#xff0c;内存消耗快&#xff0c;经常会出现内存…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

MySQL架构 InnoDB存储引擎

1. 什么是Mysql&#xff1f; 我们在开发的时候&#xff0c;我们都需要对业务数据进行存储&#xff0c;这个时候&#xff0c;你们就会用到MySQL、Oracal等数据库。 MySQL它是一个关系型数据库&#xff0c;这种关系型数据库就有Oracal、 MySQL&#xff0c;以及最近很火的PgSQL等。…

JSP学习笔记【三】——JQuery

前言 在写项目的时候需要动态对某组件的属性进行调整&#xff0c;我看网上的教程都是使用document.getElementById等&#xff0c;但我在eclipse编写.jsp文件的时候&#xff0c;却提示document cannot be resolved。由于我对jsp没有系统的了解以及无人可咨询&#xff0c;网上也…

Linux开发工具之文本编译器vim

●IDE例子 Linux编辑器-vim使用 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff…

金融生产存储亚健康治理:升级亚健康 3.0 ,应对万盘规模的挑战

随着集群规模的不断扩大&#xff0c;硬盘数量指数级上升&#xff0c;信创 CPU 和操作系统、硬盘多年老化、物理搬迁等多种复杂因素叠加&#xff0c;为企业的存储亚健康管理增加了新的挑战。 在亚健康 2.0 的基础上&#xff0c;星辰天合在 XSKY SDS V6.2 实现了亚健康 3.0&#…

渗透测试之打点

请遵守中华人民共和国网络安全法 打点的目的是获取一个服务器的控制权限 1. 企业架构收集 &#xff08;1&#xff09;官网 &#xff08;2&#xff09;网站或下属的子网站&#xff0c;依次往下 天眼查 企查查 2. ICP 备案查询 ICP/IP地址/域名信息备案管理系统 使用网站…

ElasticSearch 10000条查询数量限制

一、前言 我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错&#xff0c;这是因为ES通过index.max_result_window这个参数控制能够获取数据总数fromsize最大值&#xff0c;默认限制是10000条&#xff0c;因为ES考虑到数据要从其它节点上报到协调节点如果搜索请…

APACHE NIFI学习之—UpdateAttribute

UpdateAttribute 描述: 通过设置属性表达式来更新属性&#xff0c;也可以基于属性正则匹配来删除属性 标签: attributes, modification, update, delete, Attribute Expression Language, state, 属性, 修改, 更新, 删除, 表达式 参数: 如下列表中&#xff0c;必填参数则…

Leetcode 剑指 Offer II 046. 二叉树的右视图

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底…

react create-react-app v5 从零搭建项目

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

【C++】C++11------线程库

目录 线程库接口线程接口使用lock_guard与unique_lockmutex(互斥锁)lock_guardunique_lock 原子性操作库条件变量(condition_variable) 线程库接口 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#x…

使用Python进行App用户细分

App用户细分是根据用户与App的互动方式对用户进行分组的任务。它有助于找到保留用户&#xff0c;找到营销活动的用户群&#xff0c;并解决许多其他需要基于相似特征搜索用户的业务问题。这篇文章中&#xff0c;将带你完成使用Python进行机器学习的App用户细分任务。 App用户细…

图片分割处理(以玉米颗粒的图片分割为例)

问题&#xff1a; 为完成玉米颗粒分类任务&#xff0c;现需要处理训练图片&#xff0c;将以下图片中的玉米颗粒进行分割&#xff1a; 目标&#xff1a; 操作步骤&#xff08;完整代码附在最后&#xff0c;该部分为解释说明&#xff09; 一、提取通道并进行二值化 # 提取蓝…