2024山东省赛回顾
2024山东省赛回顾 2024 CCPC 全国邀请赛(山东)暨山东省大学生程序设计竞赛是我参加的第一场线下赛 但是当时以几名之差痛失Cu牌,之前一直没有补题,现在来回看一下 题目链接:https://codeforces.com/gym/105385 顺序由简到难:I,A,K,F,C,J I - Left Shifting 签到题,若无相邻字符则无解,否则枚举左移次数 0≤d<n0 ≤ d < n0≤d<n,判断是否 sd=sd+n−1modns_d = s_{d+n−1 mod n}sd=sd+n−1modn 即可。 #include <bits/stdc++.h>using namespace std;int n;char a[500005];void solve(){ cin>>a; n=strlen(a); int ans=0; if(a[0]==a[n-1]){ cout<<ans<<"\n"; return; } for(int...
矩阵快速幂
矩阵快速幂 1. 什么是矩阵快速幂 矩阵快速幂是把「对一个方阵求大幂」的问题用二分法(指数快速幂 / 指数平方)加速计算的技巧。直接把矩阵乘 k 次需要 O(k∗m3)O(k * m^3)O(k∗m3) (m 为矩阵维度,方阵常见为 2),而矩阵快速幂可以把复杂度降到 O(logk∗m3)O(log k * m^3)O(logk∗m3)。 这个技巧常用于线性递推(线性齐次递推)问题,例如斐波那契、K 项线性递推、一些动态规划转化为线性变换的场景。 2. 为什么用矩阵可以求斐波那契数列 斐波那契数列满足递推: Fn=Fn−1+Fn−2F_n = F_{n-1} + F_{n-2} Fn=Fn−1+Fn−2 把状态向量设为 [Fn,Fn−1]T[F_n, F_{n-1}]^T[Fn,Fn−1]T,则可以写成矩阵形式: [FnFn−1]=[1110][Fn−1Fn−2]\begin{bmatrix} F_n \\ F_{n-1} \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 &...
2025ICPC网络赛第二场复盘
2025ICPC网络赛第二场复盘 题目链接:https://qoj.ac/contest/2524 D. Arcane Behemoths 每个子序列的值,显然是把子序列排序后每次去掉最大值,加到前面的每一项上,以此类推,直到只剩下一项 对每个子序列而言,依次取最大值加到其他所有项上,可以得到排序后从小到大第 nnn 项对于该子序列的贡献系数为n==1?1:2n−2n==1 ? 1:2^{n-2}n==1?1:2n−2。 对整个序列从小到大排序后,满足第 iii 项为子序列从小到大第 nnn 项的子序列的个数可求,即取小于该项中的 n−1n-1n−1...
2025ICPC网络赛第一场复盘
2025ICPC网络赛第一场复盘 顺序从易到难:G,B,A,I,C G:Sorting #include <bits/stdc++.h>using namespace std;int n,m;int vis[200005];int cnt=0;int x,y;int main(){ cin>>n>>m; for(int i=1;i<=m;i++) { cin>>x>>y; if(y==x+1) { if(!vis[x]) cnt++; vis[x]=1; } } if(cnt==n-1) cout<<"Yes\n"; else cout<<"No\n"; return 0;} B:Creating Chaos #include <bits/stdc++.h>using namespace std;int n,k;int...
深入理解 C++ 中的 memset:原理、实现与使用指南
深入理解 C++ 中的 memset:原理、实现与使用指南 在 C/C++ 编程中,memset是一个经常被使用的函数,尤其在算法竞赛、系统编程和性能要求较高的场景下。本文将从底层原理、常见用法、性能表现到潜在的陷阱,全面介绍memset。 1. memset 是什么? memset 是 C 标准库 <cstring>提供的一个内存操作函数,用于将一块连续的内存空间按字节设置为某个值。其原型如下: void* memset(void* ptr, int value, size_t num); ptr:目标内存块的起始地址。 value:要设置的值(按字节存储,只取低 8 位)。 num:要填充的字节数。 例如: int a[5];memset(a, 0, sizeof(a)); // 把整个数组 a 填充为 0 2. 底层原理 memset 本质是一个逐字节填充的过程。现代编译器和库的实现会做优化: 按字节写入:最基本的实现就是 for 循环一字节一字节写。 按机器字大小写入:为了提速,会在对齐的情况下,按 4 字节、8字节甚至更大块拷贝。 SIMD...
异或线性基
异或线性基 一、问题背景:为什么要引入“线性基”? 在算法竞赛中,常见的问题之一是: 给定一个数组 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an,考虑所有子集的异或和(即⊕),你可能需要: 求出所有子集异或和中的最大值; 判断某个数是否能由这些元素的异或组合得到; 求第 kkk 大的异或和; 维护动态插入、删除并查询异或值。 如果直接枚举所有子集,时间复杂度是 O(2n)O(2^n)O(2n),显然不可行。 于是引入 线性基(Xor Basis / Linear Basis) 来高效解决。 二、异或与线性独立 我们把每个数看作一个二进制向量。 异或操作相当于向量空间里的“加法(模 2)”。 一组数的子集异或和,正好对应了这组向量的 线性组合。 于是问题转化为: 在二进制向量空间中,找到一个“基”来表示所有可能的组合。 这就是 线性基: 一组最小的、互相线性独立的向量; 能表示原集合中所有数的异或和。 三、线性基的构造 1. 核心思想 高斯消元的简化版:逐位考虑(从高位到低位),尽量把每个数的最高位独立出来。 2....
C++中Vector的使用方法
C++中vector的使用方法 一、定义以及初始化 vector<int> a(n); 创建一个长度为n的int型数组,所有元素默认初始化为0 等价于: vector<int> a(n,0); 也可以指定初始值: vector<int> a(5,7); // a = {7, 7, 7, 7, 7} 二、一维vector的常用操作 1. 增加元素 a.push_back(10); 2.删除末尾元素 a.pop_back(); 3.访问元素 int x = a[2]; // 下标访问,不越界时最快int y = a.at(2); // 安全访问,越界会抛异常 4.遍历数组 for (int i = 0; i < a.size(); i++) { cout << a[i] << " ";}for(int val : a){ cout << val << " ";} 5.求长度 int...
QQ大模型机器人
windows系统下使用astrbot与napcatQQ协议,构建QQ大模型机器人 参考文档:https://astrbot.app 下载安装器 打开 https://github.com/Soulter/AstrBotLauncher/releases/latest 下载 Source code (zip) 并解压到电脑。 运行安装器 双击launcher_astrbot_en.bat运行 复制本地链接在浏览器打开进入AstrBot管理面板 通过 NapCatQQ 协议实现端接入 QQ NapCatQQ 的文档:NapCatQQ 文档 参考内容:NapCat.Shell - Win手动启动教程 前往 NapCatQQ 的 release 页面 下载NapCat.Shell.zip解压 确保QQ版本安装且最新 双击目录下launcher.bat即可启动 如果是win10 则使用launcher-win10.bat 如果需要快速登录 将 QQ 号传入参数即可,新建fastlaunch.bat文件,写入以下代码 launcher.bat...
linux文件管理系统
linux文件管理系统 程序功能 文件复制:通过 cp <source file> <target file> 命令将一个文件复制到另一个位置。 文件删除:通过 rm <filename> 命令删除指定文件。 文件压缩:使用 compress <filename> <compressed package name> 命令将文件压缩成指定文件。 文件解压:使用 decompress <compressed package name> <target directory> 命令将压缩包解压到指定目录。 退出程序:使用exit命令退出当前程序。 项目关键和遇到的问题 如何将程序中输入的字符改写成linux系统命令的格式? 经过搜索和查阅资料,我选择了c语言中的snprintf函数,它可以方便地将若干字符串插入到固定字符串中组成新的字符串,格式是snprintf(str,...
常用linux命令行命令
Linux常用命令 +++ 1. 文件和目录操作 ls - 列出目录中的文件和文件夹 使用方法:ls [选项] [目标路径] 例: ls # 列出当前目录内容ls -l # 以详细信息格式显示ls -a # 显示包括隐藏文件 cd - 切换目录 使用方法:cd [目录路径] 例: cd /home/user # 转到指定路径cd .. # 转到上一级目录cd ~ # 转到用户主目录 pwd - 显示当前所在目录 使用方法:pwd mkdir - 创建新目录 使用方法:mkdir [选项] 目录名 例: mkdir new_folder # 创建一个名为new_folder的目录mkdir -p parent/child # 创建多级目录 rm - 删除文件或目录 使用方法:rm [选项] 文件/目录 例: rm file.txt # 删除单个文件rm -r folder #...