Codeforces Round 940 (Div. 2) and CodeCraft-23 D. A BIT of an Inequality

2024-05-09 01:44

本文主要是介绍Codeforces Round 940 (Div. 2) and CodeCraft-23 D. A BIT of an Inequality,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A BIT of an Inequality

题目描述

给你一个数组 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an 。求这样的图元( x , y , z x, y, z x,y,z )的个数:

  • 1 ≤ x ≤ y ≤ z ≤ n 1 \leq x \leq y \leq z \leq n 1xyzn , 和
  • f ( x , y ) ⊕ f ( y , z ) > f ( x , z ) f(x, y) \oplus f(y, z) > f(x, z) f(x,y)f(y,z)>f(x,z) .

我们定义 f ( l , r ) = a l ⊕ a l + 1 ⊕ … ⊕ a r f(l, r) = a_l \oplus a_{l + 1} \oplus \ldots \oplus a_{r} f(l,r)=alal+1ar ,其中 ⊕ \oplus 表示 bitwise XOR。

输入描述

第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1t104 ) - 测试用例数。

每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 )。

每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an ( 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109 )。

保证所有测试用例中 n n n 的总和不超过 1 0 5 10^5 105

输出描述

对于每个测试用例,在一行中输出一个整数 – 描述的图元的组数。

样例输入

3
3
6 2 4
1
3
5
7 3 7 2 1

样例输出

4
0
16

原题

CF——传送门

思路

显然根据异或运算的交换律, f ( x , y ) ⊕ f ( y , z ) > f ( x , z ) f(x, y) \oplus f(y, z) > f(x, z) f(x,y)f(y,z)>f(x,z) 等价于 f ( x , z ) ⊕ a y > f ( x , z ) f(x, z) \oplus a_y > f(x, z) f(x,z)ay>f(x,z)。那么,问题就可以转化为对于 a 1 a_1 a1 a n a_n an 的每个 a i a_i ai,其与 f ( x , z ) f(x, z) f(x,z) 进行异或运算是否会使结果变小。如果能使结果变小,则将该方案统计到答案中。而对于异或后对结果的影响,我们只需要考虑 a i a_i ai 的最高位的 1,若该位在左式即 f ( x , y ) ⊕ f ( y , z ) f(x, y) \oplus f(y, z) f(x,y)f(y,z) 中的异或结果为 1,则将该方案统计进答案中。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxn = 1e5 + 6;
const int maxbit = 30;// 第i个元素,第j+1个bit位,前缀以及后缀异或结果为k(0或1)
int prefix[maxn][maxbit][2]; // 该条件下 包含第i-1个元素的前缀的个数
int suffix[maxn][maxbit][2]; // 该条件下 包含第i+1个元素的后缀的个数int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while (t--){int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];}// dp转移for (int j = 0; j < 30; j++){// 初始化prefix[0][j][0] = 0;prefix[0][j][1] = 0;suffix[n + 1][j][0] = 0;suffix[n + 1][j][1] = 0;for (int i = 1; i <= n; i++){int bit = (a[i] >> j) & 1; // 第j+1个bit位是1或是0for (int k = 0; k <= 1; k++){prefix[i][j][k] = (bit == k) + prefix[i - 1][j][k ^ bit];}}for (int i = n; i >= 1; i--){int bit = (a[i] >> j) & 1; // 第j+1个bit位是1或是0for (int k = 0; k <= 1; k++){suffix[i][j][k] = (bit == k) + suffix[i + 1][j][k ^ bit];}}}ll ans = 0; // 统计个数for (int i = 1; i <= n; i++){int highbit = -1; // 当前元素bit位为1的最高位置for (int j = 0; j < 30; j++){if ((a[i] >> j) & 1)highbit = j;}ans += 1LL * prefix[i - 1][highbit][1] * (suffix[i + 1][highbit][0] + 1);ans += 1LL * (prefix[i - 1][highbit][0] + 1) * suffix[i + 1][highbit][1];}cout << ans << '\n';}return 0;
}

这篇关于Codeforces Round 940 (Div. 2) and CodeCraft-23 D. A BIT of an Inequality的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。 每个单元格可以有以下三种状态:  值 0 代表空地,无法传递信号;  值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔; 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms