当前位置: 首页 > news >正文

Linear Algebra in Competitive Programming

1. Basis

线性基 (v1,v2,...,vn)∈Rn(v_1,v_2,...,v_n)\in\R^n(v1,v2,...,vn)Rn 线性无关。

Properties

1.

kkk 维线性基组成的线性空间的大小为 2k2^k2k

2.

存在一种最简表示,使得每个 bit 之间无交,但每个 bit 的二进制表示不一定只有一位是 1。

Template

template<typename T> struct XORBasis {int bit_size, size;std::vector<int> bit;// bool good_pos;void resize(int _bit_size) {size = 0;// good_pos = 1;bit_size = _bit_size;bit.resize(bit_size);}XORBasis(int _bit_size) {resize(_bit_size);}~XORBasis() {std::vector<int>().swap(bit);}// void refresh() {//     for (int i = bit_size - 1; i >= 0; i--) {//         for (int j = i - 1; j >= 0; j--) {//             if (bit[i] >> j & 1) {//                 bit[i] ^= bit[j];//             }//         }//     }//     good_pos = 1;// }bool insert(T x, int index) {for (int i = bit_size - 1; i >= 0; i--) {if ((x >> i) & 1) {if (!bit[i]) {bit[i] = x;size++;// good_pos = 0;return true;} else {x ^= bit[i];}} else {continue;}}return false;}T get_kth(T k) {assert(k >= 0 && k <= (1ll << size));if (k == 0) return T(-1);if (k == 1) return T(0);T res = T(0);T cnt = (1ll << size);for (int i = bit_size - 1; i >= 0; i--) {if (bit[i]) {cnt >>= 1;if (k > cnt) {if (!(res >> i & 1)) {res ^= bit[i];}k -= cnt;} else {if (res >> i & 1) {res ^= bit[i];}}}}return res;// if (good_pos == 0) {//     refresh();// }// k--;// T res = T(0);// for (int i = 0; i < bit_size; i++) {//     if (!bit[i]) {//         continue;//     }//     if (k & 1) {//         res ^= bit[i];//     }//     k >>= 1;// }// return res;}T lower_bound(T x) {if (x < 0) {return T(0);}T res = T(0);T cnt = T(1ll << size);T mask = T(0);for (int i = bit_size - 1; i >= 0; i--) {if (bit[i]) {cnt >>= 1;if ((x >> i) & 1) {res += cnt;if (!(mask >> i & 1)) {mask ^= bit[i];}} else {if (mask >> i & 1) {mask ^= bit[i];}}} else {if ((x ^ mask) >> i & 1) {if (x >> i & 1) {return res + cnt + 1;} else {return res + 1;}}}}return res + 1;}// T get_rank(T x) {//     if (x < 0) {//         return T(0);//     }//     if (good_pos == 0) {//         refresh();//     }//     T res = T(0), now = T(x), base = T(1ll << (size - 1));//     for (int i = bit_size - 1; i >= 0; i--) {//         if (!bit[i]) {//             continue;//         }//         if ((now >> i) & 1) {//             res += base;//             now ^= bit[i];//         }//         base >>= 1;//     }//     return res + 1;// }
};

Problems

1. CF2143F

题意

给一个序列 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an,若干次询问,每次问一个区间 a[l,..,r]a[l,..,r]a[l,..,r],是否能进行任意有限次操作使得其严格增,一次操作为任取 l≤i≤j≤r,aj←aj⊕ail\le i\le j\le r,a_j\gets a_j\oplus a_ilijr,ajajai

n≤2e5,a≤220n\le2e5,a\le 2^{20}n2e5,a220

做法

发现固定左端点,答案有单调性,考虑确定最大可能的右端点,一个数的变化只能由它及其左侧的元素的某些的异或和造成,考虑使用异或线性基考虑这个问题。固定左端点后,右侧有至多有 202020 个点会造成基维度增加,这些关键位置之间能形成的数的可能性不变,考虑分这 202020 段计算,重点在从一段到下一段时之前的最后一项在下一段的所有可能性中的大小位置,可以通过维护异或线性空间第 kkk 小以及一个数在线性空间中的排位计算。

代码

cf

http://www.dtcms.com/a/391377.html

相关文章:

  • Decision Trees vs Neural Networks|决策树 vs 神经网络
  • FreeRTOS——任务管理
  • MSXML4.0是什么?下载安装+常见错误修复一网打尽
  • Claude Code生态
  • Node v22.19 Nest.js 安装 better-sqlite3
  • Android compose Room Sqlite 应用 (注入式)
  • 缓存穿透+缓存雪崩+缓存击穿(解决方法+实战)
  • Docker技术相对于虚拟机技术的优劣势对比!
  • MyBatis框架与参数详解
  • Confluent-Kafka-go 发布超过 1M 消息失败问题解决
  • 数字图像处理-函数矩阵
  • 基于 ST-Link 和 MDK-Keil 的 STM32 程序下载实验
  • 安防监控系统的架构与组成原理
  • 【前端】【threeJs】前端事件偏移问题完整总结
  • web:ts的类型兼容性
  • 黑盒测试:测试用例设计之场景法(流程图法)(模拟用户实际使用软件的场景来设计测试用例,适用于业务流程复杂的系统测试)基本流、备选流
  • Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第二章> 之 平台功能架构整理
  • 神经网络学习笔记14——高效卷积神经网络架构EfficientNet
  • Flutter实现滑动页面停留吸附
  • 【Linux】基本指令介绍
  • 爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】----待完成
  • 【软考-系统架构设计师】特定领域软件体系结构(DSSA)
  • idea git使用提示问题处理
  • 数据结构初阶——哈希表的实现(C++)
  • Problem: lab-week3- exercise01 Insertion sort
  • 金融级虚拟机安全:虚拟化平台5大安全风险与国产化防护实践
  • 可视化在智慧城市中的应用
  • C#实现高性能拍照(旋转)与水印添加功能完整指南
  • Pandas 2.x与PyArrow:深入探索内存优化与性能提升技巧
  • opencv之轮廓识别