[{
        "title": "算法竞赛（高级数据结构）——《算法竞赛》第4章",
        "url": "/posts/%E9%AB%98%E7%BA%A7%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/",
        "date": "2025-06-04",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "《算法竞赛》第 4 章 高级数据结构 1. 并查集 并查集的基本操作 DSU用于处理一些不相交结合的合并问题。 初始化：表示 s[i] 是元素 i 所属的并查集。 s[i]=i; 查询：查找元素属于哪个并查集。（路径压缩） int find_set(int x){ if(x!=s[x]) s[x]=find_set(s[x]); return s[x]; } 合并：将两个元素并查集合并一起。 void join(int x,int y){ int fx=find_set(x),fy=find_set(y); if(fx!=fy) s[fx]=s[fy]; } 统计：s[i]=i 的数量就...",
        "content": "《算法竞赛》第 4 章 高级数据结构 1. 并查集 并查集的基本操作 DSU用于处理一些不相交结合的合并问题。 初始化：表示 s[i] 是元素 i 所属的并查集。 s[i]=i; 查询：查找元素属于哪个并查集。（路径压缩） int find_set(int x){ if(x!=s[x]) s[x]=find_set(s[x]); return s[x]; } 合并：将两个元素并查集合并一起。 void join(int x,int y){ int fx=find_set(x),fy=find_set(y); if(fx!=fy) s[fx]=s[fy]; } 统计：s[i]=i 的数量就是并查集的数量。 带权并查集 额外定义一个权值数组 d[] ，把节点 i 到父节点的权值记为 d[i] 。 带权路径压缩查询 int find_set(int x){ if(x!=s[x]){ int t=s[x];//记录父节点 s[x]=find_set(s[x]);//路径压缩 d[x]+=d[t];//更新x到祖宗节点的权值 } return s[x]; } 带权合并：根据具体题意修改 例题 Problem - 3038 #include &lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; const int N=2e5+5; int n,m,s[N],d[N],ans; int find_set(int x){ if(x!=s[x]){ int t=s[x];//记录父节点 s[x]=find_set(s[x]);//路径压缩 d[x]+=d[t];//更新x到祖宗节点的权值 } return s[x]; } void join(int x,int y,int z){//合并 int fx=find_set(x),fy=find_set(y); if(fx==fy){ if(d[x]-d[y]!=z) ans++; }else{ s[fx]=fy; d[fx]=d[y]-d[x]+z; } } void solve(){ for(int i=0;i&lt;N;i++) s[i]=i,d[i]=0; ans=0; for(int i=1;i&lt;=m;i++){ int x,y,z;cin&gt;&gt;x&gt;&gt;y&gt;&gt;z; join(x-1,y,z); } cout&lt;&lt;ans&lt;&lt;\"\\n\"; } int main(){ while(cin&gt;&gt;n&gt;&gt;m) solve(); return 0; } P2024 食物链 - 洛谷 int n,m,k,s[N],d[N],ans; int find_set(int x){ if(x!=s[x]){ int t=s[x];//记录父节点 s[x]=find_set(s[x]);//路径压缩 d[x]=(d[t]+d[x])%3;//更新x到祖宗节点的权值 } return s[x]; } void join(int x,int y,int z){//合并 int fx=find_set(x),fy=find_set(y); if(fx==fy){ if((z-1)!=((d[x]-d[y]+3)%3)) ans++; }else{ s[fx]=fy; d[fx]=(d[y]-d[x]+z-1)%3; } } void solve(){ cin&gt;&gt;n&gt;&gt;m; for(int i=0;i&lt;N;i++) s[i]=i,d[i]=0; ans=0; while(m--){ int x,y,z;cin&gt;&gt;z&gt;&gt;x&gt;&gt;y; if(x&gt;n||y&gt;n||(z==2&amp;&amp;x==y)) ans++; else join(x,y,z); } cout&lt;&lt;ans&lt;&lt;\"\\n\"; } 2.树状数组 树状数组可以 \\(O(log_2n)\\) 的时间查询和维护前缀和，前缀和可以用来区间修改或者区间查询。 需要借助一个神奇的函数 #define lowbit(x) ((x)&amp;-(x))。 如果当前节点为 x ，父节点为 x+lowbit(x)。 在树状数组中，每个元素 \\(tree[]\\) 中存储的是区间 \\([x-lowbit(x)+1,x]\\) 中每个数之和。 单点修改+区间查询 #define lowbit(x) ((x)&amp;-(x)) int tree[N]; void update(int x,int d){//单点修改 while(x&lt..."
      },{
        "title": "24年CCPC郑州邀请赛VP",
        "url": "/posts/24%E5%B9%B4CCPC%E9%83%91%E5%B7%9E%E9%82%80%E8%AF%B7%E8%B5%9BVP/",
        "date": "2025-06-01",
        "categories": ["algorithms"],
        "tags": ["ACM-ICPC","algorithms"],
        "excerpt": "24年CCPC郑州邀请赛暨第六届CCPC河南省赛 A. Once In My Life 题意：一个数的数位包含 1~9 并且至少两个数位是 d 的十进制正整数都是幸运数。给出 d 和一个正整数 n，输出一个 k 使得 n*k 是幸运数。 题解：我们需要先构造出乘积。1234567890 满足包含 1~9 的条件，再加上 d 满足幸运数。为了不影响这个数幸运数的性质，我们可以在这个数后面添加几位使得这个数变成 n 的倍数。先在 123456789d 后面添加 n 位数个 0，加上 n-c%n 使这个数变成 n 的倍数，除以 n 即可得到 k。 void solve(){ ll n,d;ci...",
        "content": "24年CCPC郑州邀请赛暨第六届CCPC河南省赛 A. Once In My Life 题意：一个数的数位包含 1~9 并且至少两个数位是 d 的十进制正整数都是幸运数。给出 d 和一个正整数 n，输出一个 k 使得 n*k 是幸运数。 题解：我们需要先构造出乘积。1234567890 满足包含 1~9 的条件，再加上 d 满足幸运数。为了不影响这个数幸运数的性质，我们可以在这个数后面添加几位使得这个数变成 n 的倍数。先在 123456789d 后面添加 n 位数个 0，加上 n-c%n 使这个数变成 n 的倍数，除以 n 即可得到 k。 void solve(){ ll n,d;cin&gt;&gt;n&gt;&gt;d; ll len=to_string(n).size();//求n的位数 ll c=1234567890ll+d;//构造幸运数 c=c*pow(10,len);//后面添0 c+=(n-c%n);//使这个数变成n的倍数 ll ans=c/n; cout&lt;&lt;ans&lt;&lt;\"\\n\"; } C. 中二病也要打比赛 题意：给定一个序列 A，元素范围在 1~n 内。使用某个映射将序列 A 变为一个单调不降的序列。代价为 \\(f(x)≠x\\) 的数量。求最小代价。 题解：如果某两个数值相等，则这两数之间所有的数也全部相等。可以仅保留某个数的第一次出现和最后一次出现。问题就转化为每一段取一个数，求 LIS。将每一段中的数降序排列，求出最长严格上升子序列后即得。用数组总长度减去 LIS 长度就是答案。 K. 树上问题 题意：有一颗 n 个节点组成的无根树，每个节点有正整数点权。一个节点是美丽节点的充要条件为以这个节点做根所有节点的点权不小于其父亲节点的一半。有多少个美丽节点？ 题解：先以任意结点做根，构成一棵树。对于相连的结点如 u 和 v，以 u 和 v 为根时，只有 u-v 这条边的方向发生变化。因此给 \\(ans_u\\) 减去 \\(v→u\\) 的贡献，加上 \\(u→v\\) 的贡献，就得到了 \\(ans_v\\)。采用换根 DP。 void dfs1(int u,int fa){ int sum=0; for(int i=0;i&lt;vt[u].size();i++){ int v=vt[u][i]; if(v==fa) continue; dfs1(v,u); sum+=cnt[v]+(a[v]*2&lt;a[u]); } cnt[u]=sum; } void dfs2(int u,int fa){ for(int i=0;i&lt;vt[u].size();i++){ int v=vt[u][i]; if(v==fa) continue; ans[v]=ans[u]-(a[v]*2&lt;a[u])+(a[u]*2&lt;a[v]); dfs2(v,u); } } L. Toxel 与 PCPC II 题意：有 n 行代码和 m 行出现 bug，可以选择一个 i，从第一行执行到 i 行，需要 i 秒，并且修复这 i 行内的所有 bug，需要额外时间即 bug 数量的 4 次方。问最少时间修复所有 bug。 题解：简单 DP。状态：\\(dp[i]\\) 表示修复前 i 个 bug 所需的最少时间。转移方程：\\(dp[i]=min_{1≤j≤i}(dp[j]+a_i+(i-j)^4)\\)。 时间复杂度为 \\(O(m^2)\\)，会 TLE。优化：如果我们多运行一次代码，最大花费为 2e5，但是 \\(38^4-37^4&gt;2e5\\)，这意味着选了 38 个 bug 不如先选一个 bug 再选 37 个 bug。所以只需向下枚举四五十行即可，时间复杂度 \\(O(40m)\\)。"
      },{
        "title": "优先队列重载",
        "url": "/posts/%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97%E9%87%8D%E8%BD%BD/",
        "date": "2025-05-31",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "优先队列重载 STL 中对优先队列进行封装，我们可以直接定义使用。插入与取出的时间复杂度为 \\(O(log_2n)\\)。 普通定义： priority_queue&lt;int&gt; pq; 调用系统排序定义： priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt; pq; priority_queue&lt;int,vector&lt;int&gt;,less&lt;int&gt; &gt; pq; 自定义结构体定义： struct nod{ int num; friend bool operator &lt; ...",
        "content": "优先队列重载 STL 中对优先队列进行封装，我们可以直接定义使用。插入与取出的时间复杂度为 \\(O(log_2n)\\)。 普通定义： priority_queue&lt;int&gt; pq; 调用系统排序定义： priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt; pq; priority_queue&lt;int,vector&lt;int&gt;,less&lt;int&gt; &gt; pq; 自定义结构体定义： struct nod{ int num; friend bool operator &lt; (nod a,nod b){ return a.num&gt;b.num; } }; priority_queue&lt;nod&gt; pq;"
      },{
        "title": "2024年ICPC贵州省赛题解",
        "url": "/posts/24%E8%B4%B5%E5%B7%9E%E7%9C%81%E8%B5%9B%E9%A2%98%E8%A7%A3/",
        "date": "2025-05-30",
        "categories": ["algorithms"],
        "tags": ["algorithms","ACM-ICPC"],
        "excerpt": "2024贵州省赛题解 A. 破解住宿信息 简单判断。输入字符串含空格，整行输入。 string s; getline(cin,s); int sum=0,x; x=s.find(\"GZU\"); while(x!=-1){ sum++; x=s.find(\"GZU\",x+1); } if(sum==0) cout&lt;&lt;\"yezhulin\"; else if(sum%2) cout&lt;&lt;\"heshangpo\"; else cout&lt;&lt;\"qingrenpo\"; B. 小帅的车费 分层图最短路模板题。直接建立 k+1 层图，层与层间依次用打折后的边权相连。跑一遍 ...",
        "content": "2024贵州省赛题解 A. 破解住宿信息 简单判断。输入字符串含空格，整行输入。 string s; getline(cin,s); int sum=0,x; x=s.find(\"GZU\"); while(x!=-1){ sum++; x=s.find(\"GZU\",x+1); } if(sum==0) cout&lt;&lt;\"yezhulin\"; else if(sum%2) cout&lt;&lt;\"heshangpo\"; else cout&lt;&lt;\"qingrenpo\"; B. 小帅的车费 分层图最短路模板题。直接建立 k+1 层图，层与层间依次用打折后的边权相连。跑一遍 Dijkstra 即可。 C. 细胞的合并 数据量为 \\(2000^2=4e6\\)，暴力枚举细胞是否相连，相连就并查集加入。 D. 还在排队的人 双端队列的模拟，使用 deque 直接秒。 E. 打怪兽 二分 + 尺取法。二分 damage，在 check 函数中计算所需最少次数。维护一段数组存放造成伤害的下标，如果某造成伤害下标对当前第 i 处造成不了伤害，左指针前移。 F. 关灯 暴力枚举最大长度 len。每次操作使 \\([i,i+k-1]\\) 内的数都减一，利用差分数组实现。需要考虑负数取模的影响。 G. 小帅的骰子 模拟两次投出来的结果，然后判断满足条件的可能结果有多少种，求最大公因数约分即可。 H. 粉刷匠小帅 线段树，待学习。 I. 寻找宝藏数 数位 DP。先利用质数筛预处理出所有 4 位合数。设 \\(dp[N][i][j][k]\\) 表示最高位为 i、次高位为 j、第三位为 k 的 N 位宝藏数的个数。时间复杂度 \\(O(n*10^4)\\)。 J. 数字游戏 设删掉一个数字及其生成的所有数字所需要的次数的奇偶性为 f[x]。通过打表观察到只有 f[1]=1，其余为 0。所以只需要统计数字 1 的个数的奇偶性即可。 K. 最好的好朋友活动 若 a[i] 是负数，则在 b 数组中找一个最小的负数，负负得正则乘积最大；反之正数找最大正数。时间复杂度 \\(O(max(n,m))\\)。 L. GZU的建筑 字典树 + 树上启发式合并（dsu on tree），待学习。 M. 递增的鸭鸭 离散化 + DP + 组合计数。DP 状态：\\(dp[j]\\) = 前 j 只鸭子的合法方案数。遍历所有离散段，在每个段上使用隔板法（C(n+r-l, n)）更新状态。 N. 乐乐爱购物 莫比乌斯反演，待学习。"
      },{
        "title": "近期DP题目",
        "url": "/posts/%E8%BF%91%E6%9C%9FDP%E9%A2%98%E7%9B%AE/",
        "date": "2025-05-26",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "几道DP题目 牛客练习赛 139C，25 武汉邀请赛 FG 等 C-大卫的密码（牛客练习赛139） 题意：给定一个 \\(n\\times m\\) 的网格图，从 (s,1) 出发，每次可以向右或者向下移动，当光标移动到最后一行的某个格子时，继续向下移动则会到达 (1,i) 格子。需要移动光标到达 (t,m)，求最大价值和。 题解：二维 DP+限制。定义状态 \\(dp[i][j]\\) 表示在 (i,j) 位置时的最大价值和。因为纵向可以走到底然后从上面走下来，从左往右一列一列转移。 设 \\(s_n=\\sum_{i=1}^n a[i][j]\\)，则转移方程为： \\(dp_{i,j} \\lefta...",
        "content": "几道DP题目 牛客练习赛 139C，25 武汉邀请赛 FG 等 C-大卫的密码（牛客练习赛139） 题意：给定一个 \\(n\\times m\\) 的网格图，从 (s,1) 出发，每次可以向右或者向下移动，当光标移动到最后一行的某个格子时，继续向下移动则会到达 (1,i) 格子。需要移动光标到达 (t,m)，求最大价值和。 题解：二维 DP+限制。定义状态 \\(dp[i][j]\\) 表示在 (i,j) 位置时的最大价值和。因为纵向可以走到底然后从上面走下来，从左往右一列一列转移。 设 \\(s_n=\\sum_{i=1}^n a[i][j]\\)，则转移方程为： \\(dp_{i,j} \\leftarrow \\max_{k} \\left( dp_{k,j-1} + \\begin{cases} s_i - s_{k-1} &amp; \\text{if } ~k &lt; i \\\\ s_n - (s_{k-1} - s_i) &amp; \\text{if } ~k &gt; i \\end{cases} \\right)\\) DP 数组可以滚动优化。 P12593 沉石鱼惊旋 题意：有一张 n 个点 m 条边的简单无向带权连通图。进行 n 次操作，每次选择一个仍未被删除的点 u，删除点 u 和当前与 u 相连的所有边。总代价是这 n 次操作的代价和，求最小总代价。 题解：状压 DP。定义状态 \\(f[S]\\) 为已经删过点的集合为 S 时所能取得的最小代价。时间复杂度 \\(O(2^n n^2)\\)，可通过 n≤16 的范围。 P12597 穿睡衣军训 题意：给定两个字符串 s,t，求出一个字符串 x 满足：x 是 s 的子串、x 是 t 的子序列、长度最长、字典序最小。 题解：\\(O(n^2)\\) 枚举子串，判断子序列可以继承上一段的结果，优化到 \\(O(Tn^2 \\log m)\\)。 2025武汉邀请赛-F 背包 题意：有 n 组物品，第 i 组有 \\(a_i\\) 个，每个重量为 \\(2^{b_i}\\)。m 个背包，每个承重为 k。求最小的 k 使所有物品都能放入。 2025武汉邀请赛-G 路径求和问题 题意：有一个 n×m 的网格，从 (1,1) 走到 (n,m)，只能往下或往右。一条路径的价值定义为路径上不同整数的数量。对于所有可能路径，求价值之和。 题解：使用组合计数 + 容斥。对于出现次数较少的数使用 func1（暴力 DP），出现次数较多的数使用 func2（整体容斥），块大小阈值取 \\(\\sqrt{nm}\\)。"
      },{
        "title": "算法竞赛DP ——《算法竞赛》第5章 动态规划",
        "url": "/posts/%E7%AE%97%E6%B3%95%E7%AB%9E%E8%B5%9BDP/",
        "date": "2025-05-22",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "《算法竞赛》第 5 章 动态规划 1. DP概念和编程方法 1.1 DP的概念 DP是求解多阶段决策问题最优化的一种算法思想。 解决的问题具有两个特征。 重叠子问题：子问题会重叠，即多个不同问题会用到相同子问题 最优子结构：大问题的最优解由小问题最优解得来，但小问题最优解求解过程与大问题无关。 1.2 DP的两种编程方法 自顶向下（先大问题，再小问题），即递归记忆化搜索。 自底向上（先小问题，再大问题），即递推。 自底向上的优点是编码更直接。 1.3 DP的设计和实现 刷题。 1.4 滚动数组 滚动数组可以减少空间复杂度，但也会损失DP数组存储的信息。 如 01 背包使用滚动数组优化后，...",
        "content": "《算法竞赛》第 5 章 动态规划 1. DP概念和编程方法 1.1 DP的概念 DP是求解多阶段决策问题最优化的一种算法思想。 解决的问题具有两个特征。 重叠子问题：子问题会重叠，即多个不同问题会用到相同子问题 最优子结构：大问题的最优解由小问题最优解得来，但小问题最优解求解过程与大问题无关。 1.2 DP的两种编程方法 自顶向下（先大问题，再小问题），即递归记忆化搜索。 自底向上（先小问题，再大问题），即递推。 自底向上的优点是编码更直接。 1.3 DP的设计和实现 刷题。 1.4 滚动数组 滚动数组可以减少空间复杂度，但也会损失DP数组存储的信息。 如 01 背包使用滚动数组优化后，无法输出具体方案。 有的DP状态已经是最小空间复杂度，无法再使用滚动数组优化。 两种实现滚动数组的方式。 交替滚动：用 \\(dp[0][]\\) 和 \\(dp[1][]\\) 交替滚动 例如01背包 int now=0,old=1; for(int i=1;i&lt;=n;i++){ swap(now,old);//交替滚动 for(int j=0;j&lt;=c;j++){ if(v[i]&gt;j) dp[now][j]=dp[old][j]; else dp[now][j]=max(dp[old][j],dp[old][j-v[i]]+w[i]); } } 自我滚动：自我覆盖 例如01背包 for(int i=1;i&lt;=n;i++){ for(int j=c;j&gt;=v[i];j--){ dp[j]=max(dp[j],dp[j-v[i]]+w[i]); } } 2. 线性DP 一些经典线性DP问题。 1. 分组背包 有一些物品，分为 n 组，第 i 组第 k 个物品体积为 \\(c[i][k]\\)，价值为 \\(w[i][k]\\)。每组最多选一个，给定容量为 C 的背包，如何选使总价值最大。 P1757 通天之分组背包 - 洛谷 状态：\\(dp[i][j]\\)，前 i 组物品装容量 j 的背包获得最大价值。 状态转移方程：\\(dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i][k]]+w[i][k])\\) 对于 \\(dp[i][j]\\) 只使用到 \\(dp[i-1][]\\)，所以可使用滚动数组优化。 即状态转移方程：\\(dp[j]=max(dp[j],dp[j-c[i][k]]+w[i][k])\\) for(int i=1;i&lt;=zu;i++)//组数 for(int j=m;j&gt;=0;j--)//体积 for(int k=1;k&lt;=a[i];k++)//第i组物品数 if(j&gt;=v[i][k]) dp[j]=max(dp[j],dp[j-v[i][k]]+w[i][k]); 2. 多重背包 给定 n 种物品和一个背包，第 i 种物品的体积为 \\(c_i\\)，价值为 \\(w_i\\)，并且有 \\(m_i\\) 个，背包总容量为 C。使背包总价值最大。 P1776 宝物筛选 - 洛谷 4 种解法。 第一种，转换为01背包，把每种的背包都看作单独物品。 时间复杂度为\\(O(C\\sum _{i=1}^n m_i)\\)。 cin&gt;&gt;n&gt;&gt;C; for(int i=1;i&lt;=n;i++){ int a,b,c;cin&gt;&gt;a&gt;&gt;b&gt;&gt;c; while(c--) w.push_back(a),v.push_back(b); } for(int i=0;i&lt;w.size();i++){ for(int j=C;j&gt;=v[i];j--){ dp[j]=max(dp[j],dp[j-v[i]]+w[i]); } } cout&lt;&lt;dp[C]&lt;&lt;\"\\n\"; 第二种，转换为分组背包，时间复杂度也为\\(O(C\\sum _{i=1}^n m_i)\\)。 cin&gt;&gt;n&gt;&gt;C; for(int i=1;i&lt;=n;i++) cin&gt;&gt;w[i]&gt;&gt;c[i]&gt;&gt;m[i]; for(int i=1;i&lt;=n;i++){ for(int j=C;j&gt;=0;j--){ for(int k=1;k&lt;=m[i];k++){ if(k*c[i]&gt;j) break; dp[j]=max(dp[j],dp[j-k*c[i]]+k*w[i]); } } } cout&lt;&lt;dp[C]; 第三种，二进制拆分优化 若第 i 种物品有 m 个，放进背包的方案有 m+1 种，组合出这 m+1 种并不需要m个物品。根据二进制的原理，任何一个十进制数 X ..."
      },{
        "title": "12届集美大学校赛题解",
        "url": "/posts/%E9%9B%86%E7%BE%8E%E5%A4%A7%E5%AD%A6%E6%A0%A1%E8%B5%9B%E8%A1%A5%E9%A2%98/",
        "date": "2025-05-10",
        "categories": ["ACM-ICPC"],
        "tags": ["ACM-ICPC","algorithms"],
        "excerpt": "12届集美大学校赛题解 官方难度排序参考： Easy：GBJHD Medium：CAEL Hard：KIF A. 地砖 题意：n×m 的矩形，向每个格子中填充字母，使得所有同字母联通块必须为正方形。最小化从上到下、从左到右的字典序。 题解：最小化字典序是经典的贪心问题。按照从上到下、从左到右的顺序枚举每一个未填充格子的颜色，判断是否可行。 B. 逃离蜂巢 题意：有 n 个陷阱，每拆除一个陷阱，生命值先加 a 再减去 b。任意时刻生命值必须为正数，求最优顺序下拆除最多陷阱。 题解：按 a-b 从大到小排序，按顺序拿取即可。 C. 加密通讯 题意：给出一个 01 字符串若干子串 1 的个数的...",
        "content": "12届集美大学校赛题解 官方难度排序参考： Easy：GBJHD Medium：CAEL Hard：KIF A. 地砖 题意：n×m 的矩形，向每个格子中填充字母，使得所有同字母联通块必须为正方形。最小化从上到下、从左到右的字典序。 题解：最小化字典序是经典的贪心问题。按照从上到下、从左到右的顺序枚举每一个未填充格子的颜色，判断是否可行。 B. 逃离蜂巢 题意：有 n 个陷阱，每拆除一个陷阱，生命值先加 a 再减去 b。任意时刻生命值必须为正数，求最优顺序下拆除最多陷阱。 题解：按 a-b 从大到小排序，按顺序拿取即可。 C. 加密通讯 题意：给出一个 01 字符串若干子串 1 的个数的奇偶性，构造最小字典序的解。 题解：考虑该串的前缀异或和 \\(s[i]\\)，则 \\(parity[l,r]=s[r] \\wedge s[l-1]\\)。经典的 2-SAT 问题。从 0 开始计算，如果遇到没算过的位置 i，让位置 i 的前缀和与位置 i-1 的前缀和值相等。 D. 简易量筒 题意：有一条河以及 n 个杯子，每个杯子有一个容量。使用这些杯子，能否量出对应体积的水？ 题解：能够量出的体积为 \\(\\sum_{i=1}^nA_ix_i\\)（\\(x_i\\) 是整数），按照扩展欧几里得定理，一定为 \\(gcd(A_1,A_2,...,A_n)\\) 的倍数。 E. 复杂量筒 题意：有 n 个量筒，第 i 个量筒为 \\(i!\\)。求量出 \\(l \\sim r\\) 中所有整数体积各一次每个量筒需要用几次。 题解：最优方案贪心，优先选取 n 号量筒。对于 \\(l\\sim r\\) 中的每个数，写成 \\(k*n!+b(b&lt;n!)\\) 的形式，k 的部分是等差数列求和，b 的部分预处理前缀和快速得出。 G. 电话 题意：给出一个电话键盘和一个号码，求手指移动的总长。 题解：打表预处理按键的位置，直接计算，时间复杂度 \\(O(n)\\)。 H. 花坛 题意：求有多少种合法的方案在 n×m 花坛中放满至多 4 种花，满足不存在同行同种花距离 ≤3，不存在同列同种花距离 ≤3。 题解：考虑任意同行或同列连续四格必定互异。确定左上 4×4 格后，其余格子全部固定。暴搜左上格子即可。 J. 分子测序 题意：求三维空间中任意三点不共线、任意四点不共面的 n 个顶点的凸多面体有多少个面。 题解：考虑新添加一个顶点，看作在其中一个面上向外扩展出一个四面体，新增加 4-2=2 个面，答案为 \\(2n-4\\)。 L. 董事会 题意：有 n 个石子组成一个环，每个石子有一个颜色。对于每个 0≤k≤n，判断是否能删除连续的 k 个石子，使得剩下的任意相邻两个石子不同色。"
      },{
        "title": "CF Round 1023 (Div. 2) 补题",
        "url": "/posts/CFdiv21023%E8%A1%A5%E9%A2%98/",
        "date": "2025-05-06",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "Codeforces Round 1023 (Div. 2) 补题 此次排名情况： 共 8k+，排名 1651，做出 ABC 三题。 Rating +81，当前为 1442。 比赛链接 A. LRC and VIP 题意：有一个长度为 n 的数组 a，你需要将数组分成 2 个序列，每个元素只能属于二者之一，每个序列至少包含一个元素，两个序列全部 GCD 不相等。 题解：当数组 a 中的元素全部相等时，不论序列如何分，两序列 gcd 相等，不可能划分。比较最大值和最小值，如果相等输出 NO。否则将最大值一个元素作为序列，其余的作为另一个序列即可。 void solve(){ int n;c...",
        "content": "Codeforces Round 1023 (Div. 2) 补题 此次排名情况： 共 8k+，排名 1651，做出 ABC 三题。 Rating +81，当前为 1442。 比赛链接 A. LRC and VIP 题意：有一个长度为 n 的数组 a，你需要将数组分成 2 个序列，每个元素只能属于二者之一，每个序列至少包含一个元素，两个序列全部 GCD 不相等。 题解：当数组 a 中的元素全部相等时，不论序列如何分，两序列 gcd 相等，不可能划分。比较最大值和最小值，如果相等输出 NO。否则将最大值一个元素作为序列，其余的作为另一个序列即可。 void solve(){ int n;cin&gt;&gt;n; vector&lt;int&gt; a(n); for(int i=0;i&lt;n;i++) cin&gt;&gt;a[i]; int mn=*min_element(a.begin(),a.end()); int mx=*max_element(a.begin(),a.end()); if(mn==mx){cout&lt;&lt;\"No\\n\";return;} cout&lt;&lt;\"Yes\\n\"; for(int i=0;i&lt;n;i++) cout&lt;&lt;(1+(a[i]==mx))&lt;&lt;\"\\n\"; } B. Apples in Boxes 题意：有一个长度为 n 的数组 a，两个人轮流操作。选择一个大于 0 的元素减 1。如果操作后 max(a)-min(a) &gt; k，当前人输。 题解：假设 max-min ≤ k 成立且至少有一个 \\(a_i≥1\\)。从最大元素中减去不会使条件变差。唯一输的方式是将所有 \\(a_i\\) 全部减到 0，执行 sum 次操作后全部输掉。 C. Maximum Subarray Sum 题意：给你一个长度为 n 的数组 a 和一个正整数 k，数组中有些元素可以任意更改，使最大子数组和正好是 k。 题解：将可替换元素全部改为 -INF，如果最大子数组和仍然大于 k，不可能。选某个可替换元素，计算前面和后面的最大子数组和，然后将这个元素更改为使总和为 k 的值。 D. Apple Tree Traversing 题意：有一棵 n 个节点的树，每个节点上有一个苹果。选择一条每个节点上都有苹果的路径 (u,v)，写下 (d,u,v) 后去掉路径上所有的苹果。使写下的序列最大。 题解：一棵树中的最长路径为树的直径。假设 \\(f_i,g_i\\) 是 i 的子树中从 i 出发的最长和第二长路径，则树的直径为 \\(max_{i=1}^n f_i+g_i\\)。使用 set 和 priority_queue 维护，复杂度 \\(O(n log n)\\)。"
      },{
        "title": "2025年5月4日 贵州省赛M题——递增的鸭鸭",
        "url": "/posts/%E8%B4%B5%E5%B7%9E%E7%9C%81%E8%B5%9BM%E9%A2%98/",
        "date": "2025-05-04",
        "categories": ["ACM-ICPC"],
        "tags": ["ACM-ICPC","algorithms"],
        "excerpt": "题目描述 GZU 的农学院在阅湖养了 n 只鸭子，每只鸭子的肉质都有其对应的鲜美度，第 i 只鸭子的鲜美度是在 \\([l_i,r_i]\\) 中的任意整数。求这 n 只鸭子的鲜美度单调不减的方案数，对 998244353 取模。 输入：第一行一个整数 n (1≤n≤500)；接下来 n 行每行两个整数 \\(l_i,r_i (1≤l_i,r_i≤10^9)\\) 输出：满足条件的方案数，对 998244353 取模 题解 解法：离散化 + DP + 组合计数 DP 状态：\\(dp[j]\\) = 前 j 只鸭子的合法方案数。 由于 l 和 r 的取值范围较大（1e9），使用离散化缩小到 1e3。...",
        "content": "题目描述 GZU 的农学院在阅湖养了 n 只鸭子，每只鸭子的肉质都有其对应的鲜美度，第 i 只鸭子的鲜美度是在 \\([l_i,r_i]\\) 中的任意整数。求这 n 只鸭子的鲜美度单调不减的方案数，对 998244353 取模。 输入：第一行一个整数 n (1≤n≤500)；接下来 n 行每行两个整数 \\(l_i,r_i (1≤l_i,r_i≤10^9)\\) 输出：满足条件的方案数，对 998244353 取模 题解 解法：离散化 + DP + 组合计数 DP 状态：\\(dp[j]\\) = 前 j 只鸭子的合法方案数。 由于 l 和 r 的取值范围较大（1e9），使用离散化缩小到 1e3。 核心思路：假设这 n 个数的范围相等，都是 [l,r]，那么方案数可以直接用隔板法求出，为 C(n+r-l, n)。 DP 状态转移：遍历所有离散段，在每个段上尝试集中放一段连续的鸭子，使用组合数更新状态。 完整代码： #include &lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; const ll MOD = 998244353; int main(){ int n;cin&gt;&gt;n; vector&lt;ll&gt; l(n+1),r(n+1),vt; for(int i=1;i&lt;=n;i++) cin&gt;&gt;l[i]&gt;&gt;r[i]; vt.reserve(2*n); for(int i=1;i&lt;=n;i++){ vt.push_back(l[i]); vt.push_back(r[i] + 1); } sort(vt.begin(), vt.end()); vt.erase(unique(vt.begin(), vt.end()), vt.end()); int m = vt.size() - 1; vector&lt;ll&gt; len(m); for(int j = 0; j &lt; m; j++) len[j] = vt[j+1] - vt[j]; vector&lt;int&gt; L(n+1),R(n+1); for(int i = 1; i &lt;= n; i++){ int Li = lower_bound(vt.begin(), vt.end(), l[i]) - vt.begin(); int Ri = lower_bound(vt.begin(), vt.end(), r[i] + 1) - vt.begin() - 1; L[i] = Li; R[i] = Ri; } vector&lt;ll&gt; inv(n+2); inv[1] = 1; for(int i = 2; i &lt;= n+1; i++) inv[i] = (MOD - (MOD/i) * inv[MOD % i] % MOD) % MOD; vector&lt;ll&gt; dp(n+1, 0), dpnext; dp[0] = 1; for(int s = 0; s &lt; m; s++){ vector&lt;ll&gt; f(n+1, 0); f[0] = 1; if(n &gt;= 1) f[1] = len[s] % MOD; for(int t = 2; t &lt;= n; t++){ ll mul = (len[s] + t - 1) % MOD; f[t] = f[t-1] * mul % MOD * inv[t] % MOD; } dpnext = dp; for(int j = 0; j &lt;= n; j++){ if(dp[j] == 0) continue; if(j == n) continue; if(!(L[j+1] &lt;= s &amp;&amp; s &lt;= R[j+1])) continue; for(int t = 1; j + t &lt;= n; t++){ int duckPos = j + t; if(!(L[duckPos] &lt;= s &amp;&amp; s &lt;= R[duckPos])) break; dpnext[j+t] = (dpnext[j+t] + dp[j] * f[t]) % MOD; } } dp.swap(dpnext); } cout &lt;&lt; dp[n] % MOD &lt;&lt; \"\\n\"; return 0; }"
      },{
        "title": "《算法竞赛入门到进阶》DP学习（1）",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-05-03",
        "categories": ["algorithms"],
        "tags": ["algorithms","ACM-ICPC"],
        "excerpt": "动态规划学习（1） 《算法竞赛入门到进阶》学习。 《算法竞赛入门到进阶》 1. 动态规划的概念和思想 DP（Dynamic Programming）是一种算法思想，不是一个特定的算法。 DP 与分治法的区别： 分治法是将问题分成独立的子问题，每个子问题能独立解决 DP 的子问题是相关的，前面子问题的解决结果被后面的子问题使用。 求解 DP 有 3 步：定义状态、状态转移、算法实现。 2. 基础DP 包括硬币问题、0/1 背包、完全背包、最长公共子序列（LCS）、最长递增子序列（LIS）等经典问题。",
        "content": "动态规划学习（1） 《算法竞赛入门到进阶》学习。 《算法竞赛入门到进阶》 1. 动态规划的概念和思想 DP（Dynamic Programming）是一种算法思想，不是一个特定的算法。 DP 与分治法的区别： 分治法是将问题分成独立的子问题，每个子问题能独立解决 DP 的子问题是相关的，前面子问题的解决结果被后面的子问题使用。 求解 DP 有 3 步：定义状态、状态转移、算法实现。 2. 基础DP 包括硬币问题、0/1 背包、完全背包、最长公共子序列（LCS）、最长递增子序列（LIS）等经典问题。"
      },{
        "title": "2025年5月2日CF补题（Round 1022 Div. 2）",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-05-02",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "Codeforces Round 1022 (Div. 2) 补题 此次排名情况： 共 8k+，排名 3037，做出 ABC 三题。 Rating +35，当前为 1361。 比赛链接 A. Permutation Warm-Up 题意：给定一个数字 n，求 \\(1\\sim n\\) 的所有排列与 \\(1 \\sim n\\) 差值的和的不同数量。 赛时通过部分样例总结规律，得出会 \\(1,1,2,2,3,3,...\\) 的差值往下增加。于是先预处理，然后输出。 vector&lt;int&gt; vt(510); void init(){ //预处理... }",
        "content": "Codeforces Round 1022 (Div. 2) 补题 此次排名情况： 共 8k+，排名 3037，做出 ABC 三题。 Rating +35，当前为 1361。 比赛链接 A. Permutation Warm-Up 题意：给定一个数字 n，求 \\(1\\sim n\\) 的所有排列与 \\(1 \\sim n\\) 差值的和的不同数量。 赛时通过部分样例总结规律，得出会 \\(1,1,2,2,3,3,...\\) 的差值往下增加。于是先预处理，然后输出。 vector&lt;int&gt; vt(510); void init(){ //预处理... }"
      },{
        "title": "2025年5月1日 VP天梯赛",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-05-01",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "VP天梯赛 比赛时间 3 小时。 L1 共 100 分，拿 95 分； L2 共 100 分，拿 82 分； L3 共 90 分，拿 38 分； 总共 290 分，拿 199 分。 因题目难度原因，部分题目不列举。 L1-6 这不是字符串题 大模拟，不知为啥一个测试点错误一个测试点段错误。我采用 vector 只能拿 10 分，知乎大佬采用 string 能拿满。",
        "content": "VP天梯赛 比赛时间 3 小时。 L1 共 100 分，拿 95 分； L2 共 100 分，拿 82 分； L3 共 90 分，拿 38 分； 总共 290 分，拿 199 分。 因题目难度原因，部分题目不列举。 L1-6 这不是字符串题 大模拟，不知为啥一个测试点错误一个测试点段错误。我采用 vector 只能拿 10 分，知乎大佬采用 string 能拿满。"
      },{
        "title": "DP入门学习",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-30",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "DP学习 DP入门学习 清华大学翁家翌将其分为 8 类，分别为序列 DP、区间 DP、坐标 DP、数轴 DP、树型 DP、数位 DP、状压 DP、记忆化搜索。 北京大学 yxc 将其分为 10 类，分别为背包问题、线性 DP、区间 DP、计数 DP、数位 DP、状压 DP、树形 DP、记忆化搜索、基环树 DP、插头 DP。 罗勇军老师的《算法竞赛》和洛谷进阶篇将其分为 4 类，分别为数位 DP、状压 DP、区间 DP、树形 DP。 除了上述状态类型外，还有优化方法：单调队列优化、斜率优化、四边形不等式优化。 D. Serval and Kaitenzushi Buffet 题目来源：Co...",
        "content": "DP学习 DP入门学习 清华大学翁家翌将其分为 8 类，分别为序列 DP、区间 DP、坐标 DP、数轴 DP、树型 DP、数位 DP、状压 DP、记忆化搜索。 北京大学 yxc 将其分为 10 类，分别为背包问题、线性 DP、区间 DP、计数 DP、数位 DP、状压 DP、树形 DP、记忆化搜索、基环树 DP、插头 DP。 罗勇军老师的《算法竞赛》和洛谷进阶篇将其分为 4 类，分别为数位 DP、状压 DP、区间 DP、树形 DP。 除了上述状态类型外，还有优化方法：单调队列优化、斜率优化、四边形不等式优化。 D. Serval and Kaitenzushi Buffet 题目来源：Codeforces 2085D"
      },{
        "title": "2025年4月28日CF补题（Educational Round 178）",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-29",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "Educational Codeforces Round 178 补题 此次排名情况： 共 1.2w+，排名 3905，做出 ABCD 四题。 Rating +20，当前为 1326。 比赛链接 A. Three Decks 签到题 int a,b,c; cin&gt;&gt;a&gt;&gt;b&gt;&gt;c; c-=abs(a-b); c-=max(a,b); if(c&lt;0) cout&lt;&lt;\"NO\\n\"; else if(c%3==0) cout&lt;&lt;\"YES\\n\";",
        "content": "Educational Codeforces Round 178 补题 此次排名情况： 共 1.2w+，排名 3905，做出 ABCD 四题。 Rating +20，当前为 1326。 比赛链接 A. Three Decks 签到题 int a,b,c; cin&gt;&gt;a&gt;&gt;b&gt;&gt;c; c-=abs(a-b); c-=max(a,b); if(c&lt;0) cout&lt;&lt;\"NO\\n\"; else if(c%3==0) cout&lt;&lt;\"YES\\n\";"
      },{
        "title": "bitset教程",
        "url": "/posts/bitset%E6%95%99%E7%A8%8B/",
        "date": "2025-04-28",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "Bitset 在 STL 中有一个好用的结构叫做 bitset，今天学习其相关运用。 bitset 是一个由位（bit）组成的数组，每个位可以是 0 或者 1。和数组一样从 0 开始，每个元素都能单独访问，下标编号为 [0,N)。bitset 的大小在编译时就需要确定，如果你想要不确定长度的，请使用 vector&lt;bool&gt;。 1. 定义 bitset&lt;N&gt; b; 初始化 bitset： b=bitset&lt;N&gt;(value); //value可以为string或者int 2. count() 函数：返回1的数量 int n=b.count(); 3. ...",
        "content": "Bitset 在 STL 中有一个好用的结构叫做 bitset，今天学习其相关运用。 bitset 是一个由位（bit）组成的数组，每个位可以是 0 或者 1。和数组一样从 0 开始，每个元素都能单独访问，下标编号为 [0,N)。bitset 的大小在编译时就需要确定，如果你想要不确定长度的，请使用 vector&lt;bool&gt;。 1. 定义 bitset&lt;N&gt; b; 初始化 bitset： b=bitset&lt;N&gt;(value); //value可以为string或者int 2. count() 函数：返回1的数量 int n=b.count(); 3. any() 函数：是否含有1 if(b.any()) cout&lt;&lt;\"含有1\"; else cout&lt;&lt;\"不含1\"; 4. none() 函数：是否不含1 if(b.none()) cout&lt;&lt;\"不含1\"; else cout&lt;&lt;\"含有1\"; 5. all() 函数：是否全为1 if(b.all()) cout&lt;&lt;\"全为1\"; else cout&lt;&lt;\"不全为1\"; 6. set() 函数：设置所有位为1 b.set(); 7. set(pos,val) 函数：设置指定位置为指定值 b.set(3,0); 8. reset() 函数：设置所有位为0 b.reset(); 9. flip() 函数：取反所有位 b.flip(); 10. flip(pos) 函数：取反指定位 b.flip(2); 11. test(pos) 函数：指定位是否为1 if(b.test(2)) cout&lt;&lt;\"第2位为1\"; 12. to_string() 函数：将bitset转换为字符串 string s=b.to_string(); bitset整体运算 bitset 的运算就像一个普通整数一样，可以进行位运算。 bitset&lt;4&gt; b1(\"1100\"); bitset&lt;4&gt; b2(\"1010\"); b1^=b2; b1|=b2; b1&amp;=b2; b1&gt;&gt;1; b1&lt;&lt;1; 进行单点修改时，直接访问位置赋值即可，时间复杂度 O(1)： s[pos]=x; 输入如果不足 N 个，会从第 0 位开始赋值；大于 N 个，会截断前 N 个。输出时 bitset 是反着输出的，会先输出第 N-1 个，接着依次。 cin&gt;&gt;b; cout&lt;&lt;b;"
      },{
        "title": "2025年4月27日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-27",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "牛客周赛 Round 91 背单词+牛客周赛 A-while #include&lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; int main(){ string s,str=\"while\"; int ans=0; cin&gt;&gt;s; for(int i=0;i&lt;5;i++){ if(s[i]!=str[i]) ans++; } cout&lt;&lt;ans; return 0; } B-token 前缀和。 #include&lt;bits/stdc++.h&gt; using names...",
        "content": "牛客周赛 Round 91 背单词+牛客周赛 A-while #include&lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; int main(){ string s,str=\"while\"; int ans=0; cin&gt;&gt;s; for(int i=0;i&lt;5;i++){ if(s[i]!=str[i]) ans++; } cout&lt;&lt;ans; return 0; } B-token 前缀和。 #include&lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; ll n,m,ans=-1,a[100010]; int main(){ cin&gt;&gt;n; for(int i=1;i&lt;=n;i++) cin&gt;&gt;a[i]; for(int i=1;i&lt;=n;i++){ m+=a[i]; if(i-10&gt;0) m-=a[i-10]; ans=max(ans,m); } cout&lt;&lt;ans; return 0; } C-小苯的逆序对和 思维题。 D-数组4.0 求联通分量个数。 E-小苯的矩阵反转 题意是仅选择两行或两列或一行一列。讨论四种情况最后形成的图案： 什么也不做: 个数为0的行数为n 选择两行: 个数为0的行数为n-2, 个数为m的行数为2 选择两列: 个数为0的列数为m-2, 个数为n的行数为2 选择一行一列: 个数为1的行数为n-1, 个数为m-1的行数为1 F-小苯的因子查询 假设一个数 num，有 odd 个奇质因数和 even 个偶质因数。想得到奇因数，不能选择 even。偶质因数只有 2，fac[i] 代表 i 的阶乘含有质因数 2 的数目，概率就是 1/(fac[n]+1)，结合费马小定理求逆元。"
      },{
        "title": "A*算法模板",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-21",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "A*算法 模板： #include&lt;bits/stdc++.h&gt; using namespace std; //变量 struct node{ int st;//状态 double f;//状态对应估价函数值 node(int s){//构造函数 //计算估值函数 } //重载运算符 friend bool operator &lt;(node y,node x){ return x.f&lt;y.f;//估值函数小的优先 } }; void Astar(){ priority_queue&lt;node&gt; q; //初始化及放入起点 while(!q.empty())...",
        "content": "A*算法 模板： #include&lt;bits/stdc++.h&gt; using namespace std; //变量 struct node{ int st;//状态 double f;//状态对应估价函数值 node(int s){//构造函数 //计算估值函数 } //重载运算符 friend bool operator &lt;(node y,node x){ return x.f&lt;y.f;//估值函数小的优先 } }; void Astar(){ priority_queue&lt;node&gt; q; //初始化及放入起点 while(!q.empty()){ //...BFS } } int main(){ //输入 Astar(); //输出 return 0; }"
      },{
        "title": "2025年4月11日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-11",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "蓝桥算法回顾 一些函数与算法 1. 字符串相关函数 截取字符串 str=s.substr(开始位置,截取长度)； 插入字符串 str=s.insert(开始位置,插入字符串)； 查找字符串 tmp=s.find(查找串,开始查找位置)； 删除字符串 s.erase(开始位置,删除长度)； 输入一行 getline(cin,字符串名)； 2. STL回顾 容器 vector 定义：vector&lt;int&gt; v(n,x)；长度为 n，初始化为 x。 迭代器定义：vector&lt;int&gt;::iterator it; 栈定义：stack&lt;int&gt; st; 队列定义...",
        "content": "蓝桥算法回顾 一些函数与算法 1. 字符串相关函数 截取字符串 str=s.substr(开始位置,截取长度)； 插入字符串 str=s.insert(开始位置,插入字符串)； 查找字符串 tmp=s.find(查找串,开始查找位置)； 删除字符串 s.erase(开始位置,删除长度)； 输入一行 getline(cin,字符串名)； 2. STL回顾 容器 vector 定义：vector&lt;int&gt; v(n,x)；长度为 n，初始化为 x。 迭代器定义：vector&lt;int&gt;::iterator it; 栈定义：stack&lt;int&gt; st; 队列定义：queue&lt;int&gt; q; 大根堆定义：priority_queue&lt;int&gt; q; 小根堆定义：priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt; q; map 定义：map&lt;int,int&gt; mp;，查找为 \\(O(log n)\\) 无序 map 定义：unordered_map&lt;int,int&gt; m;，查找为 \\(O(1)\\) pair 定义：pair&lt;int,int&gt; p;，赋值 x=make_pair(1,2) 或 x={1,2} 算法 翻转：reverse(a,a+5) 第 k 个有序：nth_element(a,a+k,a+5) 下一个排列：next_permutation(a,a+5) 上一个排列：prev_permutation(a,a+5) 3. 二分 bool check(int x){ //判断条件 } int er(int l,int r){ while(l&lt;r){ int mid=(l+r)&gt;&gt;1; if(check(mid)){ ans=mid,l=mid+1; }else r=mid; } return ans; } 4. 并查集 并查集数组需要初始化，fa[i]=i。 int find(int x){//查询是否是同一个集合 if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void join(int x1,int x2){ int f1=find(x1),f2=find(x2); if(fa[x1]!=fa[x2]) fa[x1]=x2; } 5. DFS void dfs(int k){//k代表递归层数，或者填第几个空 if(所有空已经填完){ 判断最优解/记录答案; return; } for(枚举这个空能填的选项){ if(这个选项合法){ 保存现场; dfs(k+1); 恢复现场; } } } 6. ST表 ST表（Sparse Table，稀疏表）是用于解决可重复性贡献问题（区间最值、区间 gcd 等）的数据结构，倍增+动态规划的思想。 状态：\\(F[i][j]\\) 代表以 i 为起点，长度为 \\(2^j\\) 的区间最大值。 转移方程：\\(F[i][j]=max(F[i][j-1],F[i+(1&lt;&lt;(j-1))][j-1])\\) 查询 \\([L,R]\\)：\\(len =R-L+1; logLen= \\lfloor log(len) \\rfloor\\)，\\(ans=max(F[L][logLen],F[R-(1&lt;&lt;logLen)+1][logLen])\\) 7. 倍增LCA 采用邻接表存储，DFS 确定深度和父节点，倍增初始化，然后二分查找 LCA。"
      },{
        "title": "2025年4月10日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-10",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "重大BUG+对拍模板+常数优化 某些单词 GitHub 会报错 + 图片博客网页加载不了。 代码为以下这部分，防止报错每个以 . 隔开。报错原因在于双重的 {}，通过这种方式设置二维数组也会报错。 \\.g.r.a.p.h.i.c.s.p.a.t.h.{.{.f.i.g./.}.}. \\.g.r.a.p.h.i.c.s.p.a.t.h.{.{.f.i.g.2./.}.}. 第二个 BUG 为图片在网站加载不了，在 GitHub 可以正常加载，如果必须看图片可以去 GitHub 仓库里看博客。 C++对拍模板 比赛时不知道自己的代码能否过全部的测试点，或者不清楚哪一种情况错误，不妨试试对拍。...",
        "content": "重大BUG+对拍模板+常数优化 某些单词 GitHub 会报错 + 图片博客网页加载不了。 代码为以下这部分，防止报错每个以 . 隔开。报错原因在于双重的 {}，通过这种方式设置二维数组也会报错。 \\.g.r.a.p.h.i.c.s.p.a.t.h.{.{.f.i.g./.}.}. \\.g.r.a.p.h.i.c.s.p.a.t.h.{.{.f.i.g.2./.}.}. 第二个 BUG 为图片在网站加载不了，在 GitHub 可以正常加载，如果必须看图片可以去 GitHub 仓库里看博客。 C++对拍模板 比赛时不知道自己的代码能否过全部的测试点，或者不清楚哪一种情况错误，不妨试试对拍。 对拍有两个重要的点：构造数据和两种代码对比。 构造数据：包括输入和输出数据。如果输入情况复杂，不能方便手工构造，而要编一个小程序随机生成。 两种代码：低效率代码（暴力法实现，用作基准）和高效率代码（正解），对比输出即可知道错误。 随机数基础 srand(x)：产生以 x 为种子的随机数列 time(0)：返回当前时间 rand()：返回 \\([0,RAND\\_MAX]\\) 内的一个随机正整数 生成 [a,b] 范围的随机数：x=rand()%(b-a+1)+a; 需要 \\([-n,n]\\) 内的随机数：int x=rand()%(2*n-1)-n; 示例代码 #include&lt;bits/stdc++.h&gt; using namespace std; int x; int bao(){/*暴力代码*/ return 0;} int solve(){/*你的无敌代码*/ return 1;} int main(){ srand(time(0)); while(1){ x=rand(); int ans1=bao(),ans2=solve(); if(ans1!=ans2){ printf(\"x=%d,ans1=%d,ans2=%d\\n\",x,ans1,ans2); return 0; } } return 0; } 常数优化 过早的优化是万恶之源 读写优化 换行不要使用 endl，使用 \\n 如果使用 cin/cout，可以关闭流同步：ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);，但不能再与 scanf/printf 混用 手写快读： int read(){ int s=0,m=0;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();} while( isdigit(ch))s=(s&lt;&lt;3)+(s&lt;&lt;1)+(ch^48),ch=getchar(); return m?-s:s; } 缓存优化 对于图的存储，使用结构体性能一般优于多个数组。 编译优化 不要使用 register 多使用局部变量 算法常数优化 对于整数而言，加减法、位运算最快，乘法次之，除法和取模最慢 如果对特定的数进行取模或乘除，可以加上 const 修饰符 考虑减少取模次数，或者用位运算替代取模"
      },{
        "title": "2025年4月9日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-09",
        "categories": ["Others"],
        "tags": ["Others"],
        "excerpt": "LaTeX基础学习 1. LaTeX的基本结构 1.1 基本结构 LaTeX 中主要分为导言区和正文区。 % 导言区 \\documentclass{article} \\usepackage{ctex} %正文区 \\begin{document} Hello \\end{document} 1.2 导言区 导言区通常用于定义文档的格式、语言等（全局设置）。 \\documentclass Class 简介 article 科技论文，报告，软件文档等 IEEEtran IEEE Transactions 格式 report 长篇报告，学位论文 book 书籍 beamer PPT Option ...",
        "content": "LaTeX基础学习 1. LaTeX的基本结构 1.1 基本结构 LaTeX 中主要分为导言区和正文区。 % 导言区 \\documentclass{article} \\usepackage{ctex} %正文区 \\begin{document} Hello \\end{document} 1.2 导言区 导言区通常用于定义文档的格式、语言等（全局设置）。 \\documentclass Class 简介 article 科技论文，报告，软件文档等 IEEEtran IEEE Transactions 格式 report 长篇报告，学位论文 book 书籍 beamer PPT Option 简介 12pt 文档正文字体大小（默认10pt） a4paper、letterpaper 页面规格 1.3 正文区 在正文区，我们可以用公式、用命令构成文本文档。一个 LaTeX 文件中只能有一个 document。 2. LaTeX的中文处理办法 如果是 XeLaTeX 或 LuaLaTeX，可以使用 xeCJK 宏包；如果是 pdfLaTeX，可以使用 CJKutf8 宏包。推荐使用 ctex 宏包，最方便。 3. LaTeX的篇章结构 使用 \\section、\\subsection、\\subsubsection 构建层级结构，使用 \\tableofcontents 生成目录。 4. LaTeX中的特殊字符 空白字符、控制符（\\# \\$ \\% \\{\\} \\~{} \\_{} \\^{} \\textbackslash \\&amp;）、排版符号、引号等。 5. LaTeX中的插图 引入 graphicx 宏包，使用 \\includegraphics[选项]{文件名} 语法。支持 EPS、PDF、PNG、JPEG、BMP 格式。 6. LaTeX中的表格 \\begin{tabular}{l|c|p{1.5cm}|c|r} \\hline 姓名 &amp; 语文 &amp; 数学 &amp; 外语 &amp; 备注 \\\\ \\hline 张三 &amp; 98 &amp; 96 &amp; 97 &amp; 优秀 \\\\ \\hline \\end{tabular} 7. LaTeX中的浮动体 使用 figure 和 table 环境，常用浮动格式 [htbp]。 8. LaTeX中的数学公式 包括行内公式（$...$）、行间公式（$$...$$ 或 \\[...\\]）、上下标、希腊字母、分式、矩阵、多行公式等。 9. 参考文献BibTex 创建 .bib 文件，使用 \\bibliographystyle{plain} 指定样式，\\bibliography{文件名} 生成参考文献。 参考博客：【论文写作】LaTeX学习笔记：一文入门LaTeX（超详细）"
      },{
        "title": "2025年4月7日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-07",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "英语+数位DP 记了 1 个 list 单词。 数位DP：基于数字的每一位进行状态转移和递推 数位DP（Digit DP），通过拆分一个数的每一位来进行状态转移，从而解决涉及数字限制（如范围内的数字，满足某些条件的数字等）的计数问题。 基本思路： 数字的拆解：通常将数字从高位到低位拆解成每一位，这样就可以对每一位进行状态转移，逐步构建答案。 状态定义：由当前处理到的位置、是否还受到限制以及其他需要记录的条件构成。 递推与记忆化：对于每一位数字，根据当前状态递推下一个状态。为了避免重复计算，通常使用记忆化搜索存储已经计算过的状态。 边界条件与初始化：递归的边界条件是处理完所有的数字位或者符...",
        "content": "英语+数位DP 记了 1 个 list 单词。 数位DP：基于数字的每一位进行状态转移和递推 数位DP（Digit DP），通过拆分一个数的每一位来进行状态转移，从而解决涉及数字限制（如范围内的数字，满足某些条件的数字等）的计数问题。 基本思路： 数字的拆解：通常将数字从高位到低位拆解成每一位，这样就可以对每一位进行状态转移，逐步构建答案。 状态定义：由当前处理到的位置、是否还受到限制以及其他需要记录的条件构成。 递推与记忆化：对于每一位数字，根据当前状态递推下一个状态。为了避免重复计算，通常使用记忆化搜索存储已经计算过的状态。 边界条件与初始化：递归的边界条件是处理完所有的数字位或者符合要求的数字已经被找到了。 一般求某些 \\([a,b]\\) 区间内的某些性质的数量，看是否满足区间减法。满足即可将求解 \\(f[a,b]\\) 转化为求解 \\(f[0,b]-f[0,a-1]\\)。 DP状态设计： 预处理 f 数组。 \\(f[i,st]\\) 代表位数为 i（可能允许前导0，如 0001），状态为 st 的方案数。 如 \\(i=4,f[i][st]\\) 也就是 0000~9999 的符合条件的数的个数。 决策第 i 位是多少：\\(f[i,st]=f[i,st]+f[i-1,st']\\) HDU2089 不要62 题意：给定区间 \\([n,m]\\)，求在 n 到 m 中没有 “62” 或 “4” 的数的个数。 题解：\\(f[i,j]\\) 代表开头是 j 的 i 位数中不含 “62” 或 “4” 的数有几个。"
      },{
        "title": "2025年4月6日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-06",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "启发式搜索 A*算法：优先走估值函数的分支 估值函数可以为： \\[f^*(x)=g(x)+h^*(x)\\] \\(g(x)\\) 表示从起点到 x 的代价，\\(h(x)\\) 表示 x 到终点的代价的估计值。 当 \\(h(x)=0\\) 时，A* 算法就退化成了普通的 BFS。当 \\(h^*(x)\\) 越大，算法效率越高。 注意：但 \\(h^*(x)\\) 的值超过了实际到达终点的代价 \\(h(x)\\)，就可能得到错误的答案。 P5507 机关 题意：一个机关，上面一共有 12 个旋钮，每个旋钮有 4 个状态（1→2→3→4→1），在旋转时会引起另一个旋钮也旋转一次。当所有旋钮都旋转到状态 1 时...",
        "content": "启发式搜索 A*算法：优先走估值函数的分支 估值函数可以为： \\[f^*(x)=g(x)+h^*(x)\\] \\(g(x)\\) 表示从起点到 x 的代价，\\(h(x)\\) 表示 x 到终点的代价的估计值。 当 \\(h(x)=0\\) 时，A* 算法就退化成了普通的 BFS。当 \\(h^*(x)\\) 越大，算法效率越高。 注意：但 \\(h^*(x)\\) 的值超过了实际到达终点的代价 \\(h(x)\\)，就可能得到错误的答案。 P5507 机关 题意：一个机关，上面一共有 12 个旋钮，每个旋钮有 4 个状态（1→2→3→4→1），在旋转时会引起另一个旋钮也旋转一次。当所有旋钮都旋转到状态 1 时，机关就打开了。 题解：12 个数，每个数有 4 个状态用 2 位二进制存储，12 个数就是 24 位二进制即 \\(2^{24}\\)，用 int 类型存储没问题。 运用结构体的构造函数直接求出 \\(h(x)\\) 函数，至于 \\(g(x)\\) 每次更新即可。输出操作步骤，采用链式前向星的思想存储上一步，然后递归输出。 关键的还有 \\(h(x)\\) 求解时，(4-((s&gt;&gt;(i*2))&amp;3))&amp;3，去掉后面 &amp;3 会超时，因为估值函数不会正确的求解。 IDA*算法 IDA* = A* 思想 + 迭代加深搜索 IDDFS 使用迭代加深搜索所枚举的搜索上界 dep 即为总的代价 \\(f(x)\\) 的最大值；而从起点到状态 x 的代价 \\(g(x)\\) 即走的步数恰好对应着搜索层数。只有 \\(f^*(x)=g(x)+h^*(x) \\leq dep\\) 时，该状态才会被本轮搜索拓展。 P2324 骑士精神 题意：5×5 的棋盘，给定初始状态和目标状态，只能按规则移动，最少几步？15 步内不行输出 -1。 题解：从本状态到终点代价的估计值 \\(h^*(x)\\) 可以设计为尚未归位的棋子数量，因为每个尚未归位的棋子一定得让开，走至少一步。 总结   A*算法 IDA*算法 概括 在 BFS 的基础加上估价函数 在 IDDFS 基础加上估价函数 应用 适用于总体 BFS 的题目 适用于需要迭代加深类的题目"
      },{
        "title": "2025年4月5日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-05",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "算法+牙痛 下午看了看中科大的校赛，只做得出一题。 P12035 Hackergame 题意：在一个字符串中找到合法字符串并输出。 题解：用数组存储下左括号和右括号的位置，便于等会二分迅速找到最近的右括号和左括号。然后使用 find() 函数一直查找就行。 P12037 数学分析 这第四题就是算一个积分，但我数学没学好……题解说是个大学生都能做出来。 P12036 摩拉 这第三题就是一个斐波那契数列变种。 晚上水了水蓝桥杯的第 28 场蓝桥入门赛。 第三题 蓝桥速算 题意：给定一个长度为 N 的数组 A，然后进行 Q 次操作，每次操作给两个数字 L,R，表示对 \\(A_i(L \\leq ...",
        "content": "算法+牙痛 下午看了看中科大的校赛，只做得出一题。 P12035 Hackergame 题意：在一个字符串中找到合法字符串并输出。 题解：用数组存储下左括号和右括号的位置，便于等会二分迅速找到最近的右括号和左括号。然后使用 find() 函数一直查找就行。 P12037 数学分析 这第四题就是算一个积分，但我数学没学好……题解说是个大学生都能做出来。 P12036 摩拉 这第三题就是一个斐波那契数列变种。 晚上水了水蓝桥杯的第 28 场蓝桥入门赛。 第三题 蓝桥速算 题意：给定一个长度为 N 的数组 A，然后进行 Q 次操作，每次操作给两个数字 L,R，表示对 \\(A_i(L \\leq i \\leq R)\\) 中的数字进行操作。 题解：只需要看 L 和 R 的值就行，然后可以发现是个数学加减法。 #include&lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; int n,q; ll sum,x; int main(){ cin&gt;&gt;n&gt;&gt;q; while(n--){x=read();sum+=x;} while(q--){ ll l,r,x; l=read(),r=read(); x=r-l; if(x%2==0){sum+=l;if(x) sum+=x/2;} else sum-=(x+1)/2; } cout&lt;&lt;sum; return 0; } 第四题 浓缩咖啡液 题意：有 N 种饮料，有各自的浓度，每种饮料无限，能否混合出浓度为 \\(M\\%\\) 的饮料。 题解：所有饮料不论怎么混合，混合后浓度都会大于等于最小浓度，且小于等于最大值，因为饮料无限，中间任何浓度都可以到达。 第五题 破译密码 题意：N 个任务，每个任务都有完成时间和发送时间，两人一人负责完成一人负责发送，互不影响，但同一任务必须完成后才能发送。 题解：贪心，按照 min(a1.完成, a2.发送) &lt; min(a2.完成, a1.发送) 排序即可。 第六题 插入数字 题意：给定一个正整数 N，如果在 N 的开头、结尾，或者任意两个相邻数字之间插入一个数字（0∼9），可以得到多少种不同的新数字？ 题解：直接循环插入，然后放入 map。"
      },{
        "title": "2025年4月4日学习记录",
        "url": "/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/",
        "date": "2025-04-04",
        "categories": ["algorithms"],
        "tags": ["algorithms"],
        "excerpt": "单词+算法 单词+算法 考研 背诵了 List6 这一部分单词。 P1120 小木棍（剪枝） 题意：有一些同样长的小木棍，然后随意砍成几段，直到每段的长都不超过 50。现在想把小木棍拼接成原来的样子，但是不知道开始时有多少根木棍和它们的长度。给出每段小木棍的长度，编程帮他找出原始木棍的最小可能长度。 剪枝：设原始木棍长度为 m： 原始木棍长度 m 一定是所有长度和的因数 m 最小也是现在所有木棍中最长的长度，因此可以从 \\(a_i\\) 的最大值开始枚举 对于一个被枚举的 \\(a_i\\)，若 \\(a_i\\) 不满足要求，则同长度的其他木棍也不满足 枚举新木棍时，优先考虑较长的木棍 若当前原...",
        "content": "单词+算法 单词+算法 考研 背诵了 List6 这一部分单词。 P1120 小木棍（剪枝） 题意：有一些同样长的小木棍，然后随意砍成几段，直到每段的长都不超过 50。现在想把小木棍拼接成原来的样子，但是不知道开始时有多少根木棍和它们的长度。给出每段小木棍的长度，编程帮他找出原始木棍的最小可能长度。 剪枝：设原始木棍长度为 m： 原始木棍长度 m 一定是所有长度和的因数 m 最小也是现在所有木棍中最长的长度，因此可以从 \\(a_i\\) 的最大值开始枚举 对于一个被枚举的 \\(a_i\\)，若 \\(a_i\\) 不满足要求，则同长度的其他木棍也不满足 枚举新木棍时，优先考虑较长的木棍 若当前原始木棍的剩余长度等于当前考虑木棍长度，但搜索后不满足要求，则无需考虑更短木棍，直接回溯 若当前木棍长度就是设定原始木棍长度，搜索后不满足也直接回溯 #include&lt;bits/stdc++.h&gt; using namespace std; typedef long long ll; const int N=1e2; int n,a[N],len[N],sum,pre[N],d; void dfs(int u,int k,int p){ if(u==0){dfs(d,k-1,a[n]);return ;} if(k==0){cout&lt;&lt;d;exit(0);} p=min(p,u); while(p&amp;&amp;len[p]==0) --p; while(p){ if(len[p]){ --len[p]; dfs(u-p,k,p); ++len[p]; if((u==p)||(u==d)) return; p=pre[p]; } else p=pre[p]; } } int main(){ cin&gt;&gt;n; for(int i=1;i&lt;=n;i++){ cin&gt;&gt;a[i]; sum+=a[i]; ++len[a[i]]; } sort(a+1,a+n+1); for(int i=1;i&lt;=n;i++) if(a[i]!=a[i-1]) pre[a[i]]=a[i-1]; for(d=a[n];d*2&lt;=sum;++d) if((sum%d)==0) dfs(d,sum/d,a[n]); cout&lt;&lt;sum; return 0; } 迭代加深搜索IDDFS P1763 埃及分数（IDDFS） 题意：给出一个分子 a 和分母 b，分解成一堆互不相同的单位分数（分子为1）。单位分数的数量越少越好，如果数量一样，最小的那个单位分数越大越好（即分母越大越好）。 剪枝参见 P1763 题解。 双向深度优先搜索 CF525E Anya and Cubes（双向DFS） 题意：给出一个长度为 n 的数组 a，可以选任意个数组成数组 b，并在 b 中选出不超过 k 个数变成自己的阶乘。最后求数组 b 的各个元素之和为 S 的方案数。 整体 DFS \\(O(3^n)\\)，双向 DFS \\(O(k \\cdot 3^{n/2})\\)。 双向广搜 P1379 八数码难题 题意：在 3×3 的棋盘上，有 8 枚编号棋子，中间为 0 号空格，棋子可移动到空格中，给出初始布局和目标布局，找到最少步骤移动次数。 每个状态可以映射为一个九位数，双向 BFS。还可用 A* 或 IDA*。"
      },{
        "title": "lower_bound和upper_bound多功能自定义",
        "url": "/posts/%E4%BA%8C%E5%88%86%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3/",
        "date": "2025-02-15",
        "categories": ["algorithms"],
        "tags": ["algorithms","ACM-ICPC"],
        "excerpt": "两个二分函数自定义对于结构体的二分查找，还有官方的自定义比较函数。 lower_bound() 有两种形式： lower_bound (first, last, val);（无自定义比较） lower_bound (first, last, val, Compare comp);（自定义比较） 在有序的前提下，lower_bound 返回指向第一个值不小于 val 的位置，也就是返回第一个大于等于 val 的值的位置。（通过二分查找，\\(O(log_2n)\\) 的复杂度）。 注意：如果没有大于等于 val 的元素，会指向末尾元素的下一个。 无自定义比较使用 STL的使用方式 vector...",
        "content": "两个二分函数自定义对于结构体的二分查找，还有官方的自定义比较函数。 lower_bound() 有两种形式： lower_bound (first, last, val);（无自定义比较） lower_bound (first, last, val, Compare comp);（自定义比较） 在有序的前提下，lower_bound 返回指向第一个值不小于 val 的位置，也就是返回第一个大于等于 val 的值的位置。（通过二分查找，\\(O(log_2n)\\) 的复杂度）。 注意：如果没有大于等于 val 的元素，会指向末尾元素的下一个。 无自定义比较使用 STL的使用方式 vector&lt;int&gt; v={2,3,4,5,6}; vector&lt;int&gt;::iterator it; it=lower_bound(v.begin(),v.end(),3); cout&lt;&lt;(*it)&lt;&lt;endl;//(*it)为对应的值 cout&lt;&lt;v[it-v.begin()];//it-v.begin()为第几个元素（从0开始） //如果元素全部小于 val ,则 it=v.end() 数组的使用方式 int a[100],n; cin&gt;&gt;n; for(int i=1;i&lt;=n;i++) cin&gt;&gt;a[i]; sort(a+1,a+n+1); int x=lower_bound(a+1,a+n+1,3)-a;//不论从0开始，还是从1开始，都只-数组名 cout&lt;&lt;a[x]&lt;&lt;endl;//x为对应下标 //如果元素全部小于 val ,则 x=n+1 自定义查找使用 返回第一个 false 的元素，val 是自定义函数的第二个参数 前提是有序（从左往右=从满足 cmp 到不满足 cmp 的单调性），不然会按照折半来查找，可能得到的不是第一个满足条件的 bool cmp(int e,int val){ return e&gt;=val; } int main(){ int a[100],n; cin&gt;&gt;n; for(int i=1;i&lt;=n;i++) cin&gt;&gt;a[i]; int x=lower_bound(a+1,a+n+1,3,cmp)-a; //找到的是第一个小于3的元素 cout&lt;&lt;x&lt;&lt;endl; return 0; } 官方的比较函数 lower_bound( begin , end , val , less&lt;type&gt;() ) //加入了less&lt;type&gt;()比较函数：适用于从小到大排序的有序序列， //查找第一个大于等于 val 的数字 lower_bound( begin , end , val , greater&lt;type&gt;() ) //加入了greater&lt;type&gt;()比较函数：适用于从小到大排序的有序序列， //查找第一个小于等于 val 的数字 结构体二分查找 struct Student{ int _id; //学号 int _num; //排名 Student(int id, int num) :_id(id), _num(num) {} }Stu; struct CompareV { bool operator() (const Stu&amp; s1, const Stu&amp; s2)// 排名升序 { return s1._num &lt; s2._num; } }; int main() { vector&lt;Stu&gt; vS = { { 101, 34 }, { 103, 39 }, { 102, 35 } }; //CompareV()排完序后是这个样子 //101 34 //102 35 //103 39 auto iter = lower_bound(vS.begin(), vS.end(), Stu(200,33), CompareV()); cout &lt;&lt; iter - vS.begin() &lt;&lt; endl; //我们就找到了按仿函数排序(找排名比33大的位置 就是0） }   lower_bound upper_bound 无比较函数 返回第一个 &gt;=x 的元素 返回第一个 &gt;x 的元素 有比较函数 返回第一个 false 的元素 返回第一个 true 的元素"
      },{
        "title": "第一章 常见优化技巧",
        "url": "/posts/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%B8%B8%E8%A7%81%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7/",
        "date": "2025-02-09",
        "categories": ["algorithms"],
        "tags": ["ACM-ICPC","algorithms"],
        "excerpt": "常见优化技巧包含 4 个部分：双指针法，空间换时间，单调栈，单调队列。 双指针法 双指针又叫尺取法或者 two-pointers，用两个指针维护一段序列区间的方法，一般 \\(O(n)\\) 即可解决。 双指针法本质上是使用队列维护一个符合条件的区间。右指针增加相当于入队，左指针增加相当于出队。 一般双指针题目也就是两个指针遍历一遍，时间复杂度一般为 \\(O(n)\\)。 习题1：P1102 A-B 数对 习题2：P1638 逛画展 习题3：P1115 最大子段和 空间换时间 用空间换取时间，可以使用一些技巧提升处理数据的效率。如利用数组下标实现 \\(O(1)\\) 的速度获取数据，利用 map...",
        "content": "常见优化技巧包含 4 个部分：双指针法，空间换时间，单调栈，单调队列。 双指针法 双指针又叫尺取法或者 two-pointers，用两个指针维护一段序列区间的方法，一般 \\(O(n)\\) 即可解决。 双指针法本质上是使用队列维护一个符合条件的区间。右指针增加相当于入队，左指针增加相当于出队。 一般双指针题目也就是两个指针遍历一遍，时间复杂度一般为 \\(O(n)\\)。 习题1：P1102 A-B 数对 习题2：P1638 逛画展 习题3：P1115 最大子段和 空间换时间 用空间换取时间，可以使用一些技巧提升处理数据的效率。如利用数组下标实现 \\(O(1)\\) 的速度获取数据，利用 map[x] 查询的时间复杂度是 \\(O(log_2n)\\)（n 是 map 中元素个数）。 运用桶排序的思想，是最常用的空间换取时间。 对于一个直接难以处理的式子，我们可以将式子拆开进行处理，再将一些部分进行合并计算就可以获得更低复杂度的算法。 习题1：P7072 直播获奖 习题2：P2671 求和 习题3：P4147 玉蟾宫 悬线法（最大子矩阵问题） 题意：有一个矩阵，找到其中不包含障碍的最大子矩阵面积。 对于每一个非障碍格，可以延伸出一条一直往上延伸的、碰到障碍格或上边界则停止的线，这条线被称为「悬线」，最大面积的矩阵的高一定是一条悬线，否则这个矩阵还可以更高。 处理每一个非障碍格，找到它的悬线长度，并且计算这条悬线往左和往右分别最远可以到达的位置，计算面积并比较最大值。 预处理每个非障碍格的悬线，往左最远非障碍格，往右最远非障碍格。 #include&lt;bits/stdc++.h&gt; using namespace std; const int N=1e3+10; int n,m,ans; char a[N][N]; int h[N][N],l[N][N],r[N][N]; int main(){ cin&gt;&gt;n&gt;&gt;m; for(int i=1;i&lt;=n;i++){ for(int j=1;j&lt;=m;j++){ cin&gt;&gt;a[i][j]; h[i][j]=1,r[i][j]=l[i][j]=j; } for(int j=2;j&lt;=m;j++)//从左往右更新最左边格子 if(a[i][j]=='F'&amp;&amp;a[i][j-1]=='F') l[i][j]=l[i][j-1]; for(int j=m-1;j&gt;0;j--)//从右往左更新最右边格子 if(a[i][j]=='F'&amp;&amp;a[i][j+1]=='F') r[i][j]=r[i][j+1]; } for(int i=1;i&lt;=m;i++) a[0][i]='R'; for(int i=1;i&lt;=n;i++) for(int j=1;j&lt;=m;j++){ if(a[i][j]=='F'){ if(a[i-1][j]=='F'){//如果上一行无障碍 h[i][j]=h[i-1][j]+1;//悬线长度+1 if(l[i-1][j]&gt;l[i][j]) l[i][j]=l[i-1][j]; if(r[i-1][j]&lt;r[i][j]) r[i][j]=r[i-1][j]; } if((r[i][j]-l[i][j]+1)*h[i][j]&gt;ans)//更新最大面积 ans=(r[i][j]-l[i][j]+1)*h[i][j]; } } cout&lt;&lt;3*ans; return 0; } 单调栈 习题1：P2866 Bad Hair Day S 转换思维，与其求一头牛能看见几头牛，不如反过来计算一头牛能被几头牛看见，因为他们总和相等。 一只牛能被左边比它高的牛看见，然后再左边更高的牛，只需要满足这个数组里面存的都是对于第 i 头牛来说，身高依次递增的牛的身高，可以使用栈、队列等进行维护。 #include&lt;bits/stdc++.h&gt; using namespace std; long long n,x,ans; deque&lt;int&gt; dq; int main(){ cin&gt;&gt;n; while(n--){ cin&gt;&gt;x; while(!dq.empty()&amp;&amp;dq.back()&lt;=x) dq.pop_back(); dq.push_back(x); ans+=dq.size()-1; } cout&lt;&lt;ans; return 0; } 习题2：P1950 长方形 单调队列 课后习题"
      },{
        "title": "oj_helper —— 刷题数据统计工具",
        "url": "/posts/oj_helper/",
        "date": "2025-02-08",
        "categories": ["Others"],
        "tags": ["Others"],
        "excerpt": "一个各种刷题网站统计比赛和刷题数据的项目，可以通过这个查询自己各网站刷题数占比，各网站比赛时间和当前分数最高分数，有 Windows 和 Android 版本。 GitHub 项目地址：2754LM/oj_helper 点击 Release 下载对应版本即可。 oj_helper 2.5.0 版本有如下功能： 查询主流刷题网站比赛时间 查询各网站解题数量 查询各网站排位分 包含 ccpcfinder，查询参加 xcpc 区域赛选手学校情况 包含 oierdb，查询 oier cf 分析（暂不可用）",
        "content": "一个各种刷题网站统计比赛和刷题数据的项目，可以通过这个查询自己各网站刷题数占比，各网站比赛时间和当前分数最高分数，有 Windows 和 Android 版本。 GitHub 项目地址：2754LM/oj_helper 点击 Release 下载对应版本即可。 oj_helper 2.5.0 版本有如下功能： 查询主流刷题网站比赛时间 查询各网站解题数量 查询各网站排位分 包含 ccpcfinder，查询参加 xcpc 区域赛选手学校情况 包含 oierdb，查询 oier cf 分析（暂不可用）"
      },{
        "title": "Typora插件配置及右键新建md设置",
        "url": "/posts/Typora%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE%E5%8F%8A%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8F%B3%E9%94%AE%E6%96%B0%E5%BB%BAmd/",
        "date": "2025-02-06",
        "categories": ["Others"],
        "tags": ["Others"],
        "excerpt": "Typora插件配置 将 Typora 0.9.93 更新至 0.9.98，并且更改注册表使得右键可以新建 md 文档，并且安装 Typora 的相关插件，实现模板写入及更多便利功能。 Typora 0.9.98版本下载 在网上找到的资源，0.9.98 是最后一个免费版本。我原本使用的是 0.9.93，但是安装插件后出现插件警告提示版本过低（后来发现插件配置可以关掉这个提示），后更新至 0.9.98。 注：百度网盘链接可能已失效。链接: https://pan.baidu.com/s/1QTEmafCTxVVS06uQALFkZg?pwd=tb2v 提取码: tb2v Typora插件 ...",
        "content": "Typora插件配置 将 Typora 0.9.93 更新至 0.9.98，并且更改注册表使得右键可以新建 md 文档，并且安装 Typora 的相关插件，实现模板写入及更多便利功能。 Typora 0.9.98版本下载 在网上找到的资源，0.9.98 是最后一个免费版本。我原本使用的是 0.9.93，但是安装插件后出现插件警告提示版本过低（后来发现插件配置可以关掉这个提示），后更新至 0.9.98。 注：百度网盘链接可能已失效。链接: https://pan.baidu.com/s/1QTEmafCTxVVS06uQALFkZg?pwd=tb2v 提取码: tb2v Typora插件 使用这位大佬的插件：[Typora 必备插件！ 从 01 开始](https://www.peterjxl.com/Markdown/typora_plugin/) 如果遇到写入文件失败的问题，解决方案是： 右键 custom_plugin.user.toml，选择”属性” 切换到”安全”选项卡，点击”编辑” 选择你的用户，勾选”写入” 点击”应用 → 确定”，然后重试插件安装 这个插件功能非常完善，实现了很多功能，最重要的是文件模板功能。 右键新建md文件 参考了这篇博客：Windows右键新建文件类型配置及其模板设置。 Windows 右键新建文件类型配置是成功的，修改一下注册表就行。但是模板设置不行，网上找尽方法只能用这种插件。 改进 可以通过 Python 写一个脚本，实现日常的博客自动添加头尾和统一格式，还有自动上传发布到 GitHub、CSDN、博客园等功能。"
      },{
        "title": "JAVA基础语法学习1",
        "url": "/posts/JAVA%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%E5%AD%A6%E4%B9%A01/",
        "date": "2024-05-09",
        "categories": ["JAVA"],
        "tags": ["java"],
        "excerpt": "JAVA基础语法学习1 学习了JAVA包和类，获取时间，生成随机数，类和方法，方法重载和this关键字。 1. 创建项目和类 创建项目名称后，右击项目的 src 目录，在弹出菜单中选择 New→Package，然后输入包名，右击包名选择 New→Java Class。 2. IDEA代码格式化快捷键 Alt+Ctrl+L 3. 获取当前时间 这是标准时间，当地时间需要+时区。 long t = System.currentTimeMillis(); long s=(t/1000)%60;//秒 long m=(t/1000/60)%60;//分钟 long h=(t/1000/60/60...",
        "content": "JAVA基础语法学习1 学习了JAVA包和类，获取时间，生成随机数，类和方法，方法重载和this关键字。 1. 创建项目和类 创建项目名称后，右击项目的 src 目录，在弹出菜单中选择 New→Package，然后输入包名，右击包名选择 New→Java Class。 2. IDEA代码格式化快捷键 Alt+Ctrl+L 3. 获取当前时间 这是标准时间，当地时间需要+时区。 long t = System.currentTimeMillis(); long s=(t/1000)%60;//秒 long m=(t/1000/60)%60;//分钟 long h=(t/1000/60/60)%24;//小时 System.out.println(h+\" \"+m+\" \"+s); 4. 生成随机数 double a = Math.random();//随机产生一个 [0.0,1.0) 的浮点数 Random rand=new Random(); int num=rand.nextInt(10);//随机生成一个 [0,10) 的整数 //还有nextBoolean(),nextDouble(),nextLong()等方法 5. break 和 continue 跳出标签名 start: for(int i=0;i&lt;3;i++){ for(int j=0;j&lt;3;j++){ if(i==1) break start; if(j==1) continue start; } } //start 只是标记外层循环，因此会跳转到这一层循环 6. 类和方法 修饰符 class 类名 extends 父类名 implements 接口名{ int age;//成员变量定义 public 类名(){}//无参数构造方法 //构造方法作用:创建对象并初始化对象状态 public void 方法名(){内容}//成员方法 } 7. 方法重载 一个类中可以定义名称相同、参数不同的方法。构造方法和普通方法都能重载。 class HaHa{ public void shu(){ System.out.println(\"haha\"); } public int shu(int a){//返回值类型也能改 System.out.println(a); return 2*a; } public void shu(int a,int b){ System.out.println(a+b); } } 8. this 关键字 用 this 的是类里面的成员变量，不用的是方法参数。 class HaHa { int a = 2; public void shu(int a) { System.out.println(this.a); } } // HaHa.shu(1); 输出为2"
      },{
        "title": "C++的pb_ds库",
        "url": "/posts/STL%E4%B8%AD%E7%9A%84pbds%E5%BA%93/",
        "date": "2024-04-03",
        "categories": ["algorithms"],
        "tags": ["algorithms","ACM-ICPC"],
        "excerpt": "C++的pb_ds库 pb_ds 库是 GNU C++ STL 的一部分，它提供了一系列灵活、高效的数据结构，允许开发者根据具体需求定制数据结构的行为。在本篇博客中，我们将深入了解 pb_ds 库中提供的主要功能和数据结构。 1. Ordered Set 和 Ordered Map 这两个数据结构允许自定义排序规则，提供了有序集合和有序映射的功能。 Ordered Set 主要操作： insert(key)：向有序集合中插入元素 key erase(key)：从有序集合中删除元素 key find(key)：查找元素 key 在有序集合中的迭代器 lower_bound(key)：返回第...",
        "content": "C++的pb_ds库 pb_ds 库是 GNU C++ STL 的一部分，它提供了一系列灵活、高效的数据结构，允许开发者根据具体需求定制数据结构的行为。在本篇博客中，我们将深入了解 pb_ds 库中提供的主要功能和数据结构。 1. Ordered Set 和 Ordered Map 这两个数据结构允许自定义排序规则，提供了有序集合和有序映射的功能。 Ordered Set 主要操作： insert(key)：向有序集合中插入元素 key erase(key)：从有序集合中删除元素 key find(key)：查找元素 key 在有序集合中的迭代器 lower_bound(key)：返回第一个不小于 key 的元素的迭代器 upper_bound(key)：返回第一个大于 key 的元素的迭代器 size()：返回有序集合中的元素个数 clear()：清空有序集合中的所有元素 Ordered Map 主要操作： insert(make_pair(key, value))：向有序映射中插入键值对 erase(key)：从有序映射中删除键为 key 的键值对 find(key)：查找键为 key 的键值对 size()：返回有序映射中的键值对个数 2. Indexed Set 和 Indexed Map 支持快速查询元素位置的有序集合和有序映射。 find_by_order(order)：返回第 order 小的元素的迭代器 order_of_key(key)：返回比 key 小的元素的个数 3. Hashed Set 和 Hashed Map 支持自定义哈希函数的哈希集合和哈希映射。 4. Trie（字典树） 用于高效存储和检索字符串集合的数据结构。 insert(str)：向字典树中插入字符串 erase(str)：从字典树中删除字符串 find(str)：查找字符串是否存在于字典树中 prefix(str)：查找所有以 str 为前缀的字符串 5. Priority Queue（优先队列） 支持自定义优先级规则的优先队列。 6. Fenwick Tree（树状数组） 用于高效处理动态前缀和的数据结构。 7. 其他数据结构 pb_ds 还提供了 AVL Tree、Leftist Tree、Splay Tree、Treap、Monotonic Queue 等多种高级数据结构的实现，可根据具体需求选用。"
      },{
        "title": "set、排序、排列、二进制",
        "url": "/posts/%E6%98%93%E9%81%97%E5%BF%98%E7%AE%97%E6%B3%95%E5%9B%9E%E9%A1%BE/",
        "date": "2024-03-27",
        "categories": ["algorithms"],
        "tags": ["algorithms","ACM-ICPC"],
        "excerpt": "部分记忆不深算法 set、排序、排列、二进制。 set 的几个函数 set&lt;int&gt; st; st.find(k); //返回一个迭代器，指向键值k st.lower_bound(k);//返回一个迭代器，指向键值大于等于k的第一个元素 st.upper_bound(k);//返回一个迭代器，指向键值大于k的第一个元素 sort 的相关函数 stable_sort();//如果排序元素相等，保留原来的相对位置 partial_sort();//局部排序，可以不用排序所有元素，只排序局部 partial_sort(a.begin(),a.begin()+k,a.end());/...",
        "content": "部分记忆不深算法 set、排序、排列、二进制。 set 的几个函数 set&lt;int&gt; st; st.find(k); //返回一个迭代器，指向键值k st.lower_bound(k);//返回一个迭代器，指向键值大于等于k的第一个元素 st.upper_bound(k);//返回一个迭代器，指向键值大于k的第一个元素 sort 的相关函数 stable_sort();//如果排序元素相等，保留原来的相对位置 partial_sort();//局部排序，可以不用排序所有元素，只排序局部 partial_sort(a.begin(),a.begin()+k,a.end());//在begin到end范围内实现前k个有序 //注意，只是前k个有顺序，不代表是全部排序后的前k个元素 //如4 3 2 1 5 当k等于2时 为1 4而不是1 2 next_permutation 的相关函数 next_permutation(a,b); // 范围为[a,b) ，不包括b prev_permutation(a,b);//求前一个排列组合 lexicographical_compare();//字典比较 小技巧 可以检测程序运行时间。 clock_t a,b;//a和b分别为时间变量 a=clock();//a获取当前时间 solve();//运行的代码块 b=clock();//b为当前时间 cout&lt;&lt;b-a&lt;&lt;endl;//b-a即为代码块运行的时间 二进制 二进制基础操作 //消除二进制数中的最后的那个1 kk = kk &amp; (kk - 1); //一个数对2的整数次幂取模 int modPT(int x,int mod) { return x &amp; (mod - 1); }//x为2的整数次幂，mod为取模数 //判断一个数是否是2的幂 bool ifPT(int n) { return n &gt; 0 &amp;&amp; (n &amp; (n - 1)) == 0; } //获取一个数二进制的某一位 int getBit(int a,int b) {return (a &gt;&gt; b) &amp; 1; }//获取a的第b位，最低位编号为0 //将一个数二进制的某一位设置为0 int unsetBit(int a, int b) { return a &amp; ~(1 &lt;&lt; b); }//将a的第b位设置为0,最低位编号为0 //将一个数二进制的某一位设置为1 int setBit(int a, int b) { return a | (1 &lt;&lt; b); }//将a的第b位设置为1，最低位编号为0 //将一个数的二进制的某一位取反 int flapBit(int a,int b) { return a ^ (1 &lt;&lt; b); }//将a的第b位取反，最低位编号为0 二进制函数 —— 这些函数为内置函数，运行速度极快 //返回x的二进制末尾最后一个1的位置，最低位编号为1，当x为0时返回0 int __builtin_ffs(int x) //返回x的二进制的前导0个数，x需不为0 int __bultin_clz(int x) //返回 x 的二进制末尾连续 0 的个数,x需不为0 int __builtin_ctz(unsigned int x) //返回 x 的二进制中 1 的个数 int __builtin_popcount(unsigned int x)"
      },{
        "title": "HTML学习笔记2",
        "url": "/posts/HTML%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B02/",
        "date": "2024-01-03",
        "categories": ["Others"],
        "tags": ["Others"],
        "excerpt": "前端学习 列表，表格，表单，语义化，字符实体。 列表 列表分类：无序列表、有序列表、定义列表。 无序列表 标签：ul 嵌套 li，ul 是无序列表，li 是列表条目。 &lt;ul&gt; &lt;li&gt;第一项&lt;/li&gt; &lt;li&gt;第二项&lt;/li&gt; &lt;li&gt;第三项&lt;/li&gt; ...... &lt;/ul&gt; 注意事项： ul 标签里只能包裹 li 标签 li 标签里面可以包裹任何内容 有序列表 标签：ol 嵌套 li，ol 是有序列表，li 是列表条目。 &lt;ol&gt; &lt;li&gt;第一项&lt;/li&g...",
        "content": "前端学习 列表，表格，表单，语义化，字符实体。 列表 列表分类：无序列表、有序列表、定义列表。 无序列表 标签：ul 嵌套 li，ul 是无序列表，li 是列表条目。 &lt;ul&gt; &lt;li&gt;第一项&lt;/li&gt; &lt;li&gt;第二项&lt;/li&gt; &lt;li&gt;第三项&lt;/li&gt; ...... &lt;/ul&gt; 注意事项： ul 标签里只能包裹 li 标签 li 标签里面可以包裹任何内容 有序列表 标签：ol 嵌套 li，ol 是有序列表，li 是列表条目。 &lt;ol&gt; &lt;li&gt;第一项&lt;/li&gt; &lt;li&gt;第二项&lt;/li&gt; &lt;li&gt;第三项&lt;/li&gt; ...... &lt;/ol&gt; 注意事项： ol 标签里只能包裹 li 标签 li 标签里面可以包裹任何内容 定义列表 标签：dl 嵌套 dt 和 dd，dl 是定义列表，dt 是定义列表的标题，dd 是定义列表的详情。 &lt;dl&gt; &lt;dt&gt;列表标题&lt;/dt&gt; &lt;dd&gt;列表详情&lt;/dd&gt; &lt;dd&gt;列表详情&lt;/dd&gt; ...... &lt;/dl&gt; 注意事项： dl 里面只能包含 dt 和 dd dt 和 dd 里面可以包含任何内容 表格 标签：table 嵌套 tr，tr 嵌套 td/th。 table：表格 tr：行 th：表头单元格 td：内容单元格 border 属性可以为表格添加边框线。 &lt;table border=\"1\"&gt; &lt;tr&gt; &lt;th&gt;姓名&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;张三&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;李四&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; 合并单元格 会保留最上最左的单元格，添加属性（取值是数字，表示需要合并的单元格数量）： 跨行合并，保留最上单元格，添加属性 rowspan 跨列合并，保留最左单元格，添加属性 colspan 不能跨表格结构标签合并单元格 表单 input标签基本使用 &lt;input type=\"...\"&gt; type属性值 说明 text 文本框 password 密码框 radio 单选框 checkbox 多选框 file 上传文件 占位文本：&lt;input type=\"...\" placeholder=\"提示信息\"&gt; 单选框常用属性： 属性名 作用 特殊说明 name 控件名称 控件分组，同组只能选一个 checked 默认选中 简写为一个单词 上传文件常用属性：默认情况只能上传一个文件，添加 multiple 属性可以实现文件多选功能。 下拉菜单 标签：select 嵌套 option，select 是下拉菜单整体，option 是下拉菜单的每一项。selected 属性实现默认选中功能。 文本域 标签：textarea，双标签，多行输入文本。 label标签 增大表单控件的点击范围。 按钮 标签：button，双标签。 type属性值 说明 submit 提交按钮，点击提交数据到后台 reset 重置按钮，将表单恢复默认值 button 普通按钮，配合JavaScript使用 语义化 标签名 语义 div 独占一行 span 不换行 header 网页头部 nav 网页导航 footer 网页底部 aside 网页侧边栏 section 网页区块 article 网页文章 字符实体 显示结果 描述 实体名称   空格 &amp;nbsp; &lt; 小于号 &amp;lt; &gt; 大于号 &amp;gt;"
      },{
        "title": "HTML学习笔记1",
        "url": "/posts/HTML%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B01/",
        "date": "2024-01-02",
        "categories": ["Others"],
        "tags": ["Others"],
        "excerpt": "前端学习 标签语法，基本骨架，注释，标题，文本，图像，路径，超链接，音视频。 1. 标签语法 HTML 超文本标记语言——HyperText Markup Language 超文本是什么？链接 标记是什么？标记也叫标签，带尖括号的文本 双标签基本格式：&lt;开始标签&gt;内容&lt;结束标签&gt; 基本语法： 标签成对出现，中间包裹内容 &lt; &gt; 里面放英文字母（标签名） 结束标签比开始标签多 / 分为双标签和单标签 2. HTML基本骨架 html：整个网页 head：网页头部 title：网页标题 body：网页主体 VS Code 快速生成骨架：在 HTML 文件(...",
        "content": "前端学习 标签语法，基本骨架，注释，标题，文本，图像，路径，超链接，音视频。 1. 标签语法 HTML 超文本标记语言——HyperText Markup Language 超文本是什么？链接 标记是什么？标记也叫标签，带尖括号的文本 双标签基本格式：&lt;开始标签&gt;内容&lt;结束标签&gt; 基本语法： 标签成对出现，中间包裹内容 &lt; &gt; 里面放英文字母（标签名） 结束标签比开始标签多 / 分为双标签和单标签 2. HTML基本骨架 html：整个网页 head：网页头部 title：网页标题 body：网页主体 VS Code 快速生成骨架：在 HTML 文件(.html)中，!（英文） 配合 Enter/Tab 键即可自动生成。 3. 标签的关系 父子关系（嵌套关系） 兄弟关系（并列关系） 父子关系子级标签换行且缩进 4. 注释 HTML注释：&lt;!--注释内容--&gt; 在 VS Code 中，添加和删除注释的快捷键：Ctrl + / 5. 标题和段落 标题：h1~h6（双标签），h1 最大，h6 最小，且标签会独占一行。h1 标签在一个网页中建议只使用一次。 段落标签：p（双标签），独占一行，段落之间存在间隙。 6. 换行和水平线标签 换行：&lt;br&gt;（单标签） 水平线：&lt;hr&gt;（单标签） 7. 文本格式化标签 加粗：strong（双标签） 倾斜：em（双标签） 下划线：ins（双标签） 删除线：del（双标签） 8. 图像标签 &lt;img src=\"图片的URL\" alt=\"替换文本\" title=\"提示文本\" width=\"宽度\" height=\"高度\"&gt; src 是 &lt;img&gt; 必须属性，其余可写可不写。 alt 是图片无法显示的时候显示的文字 title 是鼠标悬停在图片上面的时候显示的文字 9. 路径 路径分类： 相对路径：从当前文件位置出发查找目标文件 绝对路径：从盘符出发查找目标文件 一般常用相对路径： / 表示进入某个文件夹里面 . 表示当前文件所在文件夹 .. 表示当前文件的上一级文件夹 10. 超链接标签 &lt;a href=\"链接\"&gt;文本&lt;/a&gt; href 属性值是跳转地址，是超链接的必须属性。 超链接默认是在当前窗口跳转页面，添加 target=\"_blank\" 实现新窗口打开页面。 href 属性值写为 #，表示空链接，页面不会跳转，在当前页面刷新一次。 11. 音频标签 &lt;audio src=\"音频的URL\"&gt;&lt;/audio&gt; 书写 HTML5 属性时，如果属性名和属性值相同，可以简写为一个单词。 12. 视频标签 &lt;video src=\"视频的URL\"&gt;&lt;/video&gt;"
      },{
        "title": "2012-05-08-背包九讲",
        "url": "/posts/%E8%83%8C%E5%8C%85%E4%B9%9D%E8%AE%B2/",
        "date": "2012-05-08",
        "categories": ["algorithms"],
        "tags": ["pdf","algorithms"],
        "excerpt": "崔添翼的背包九讲",
        "content": "崔添翼的背包九讲"
      },{
          "title": "Hi, I'm Zifan Tang 👋",
          "url": "/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "Welcome to my personal blog! Here I share my thoughts on technology, research, and life. About Me I’m passionate about computer science, data science, and software development. This blog is where I document my learning journey, share technical insights, and showcase my projects and achievements. What You’ll Find Here Blogs Posts — Technical articles, tutorials, and personal reflections Publications — Academic papers and research work Competition — Competition experiences and awards CV — My resume and qualifications Feel free to explore and reach out if you’d like to connect!"
        },{
          "title": "Blogs Posts",
          "url": "/blogs/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "All ACM-ICPC Others algorithms java pdf 算法竞赛（高级数据结构）——《算法竞赛》第4章 3 分钟阅读时长 发布时间： June 04, 2025 《算法竞赛》第 4 章 高级数据结构 1. 并查集 并查集的基本操作 DSU用于处理一些不相交结合的合并问题。 初始化：表示 s[i] 是元素 i 所属的并查集。 s[i]=i; 查询：查找元素属于哪个并查集。（路径压缩） int find_set(int x){ if(x!=s[x]) s[x]=find_set(s[x]); return s[x]; } 合并：将两个元素并查集合并一起。... Read more 24年CCPC郑州邀请赛VP 少于 1 分钟阅读时长 发布时间： June 01, 2025 24年CCPC郑州邀请赛暨第六届CCPC河南省赛 A. Once In My Life 题意：一个数的数位包含 1~9 并且至少两个数位是 d 的十进制正整数都是幸运数。给出 d 和一个正整数 n，输出一个 k 使得 n*k 是幸运数。 题解：我们需要先构造出乘积。1234567890 满足包含 1~9 的条件，再加上 d 满足幸运数。为了不影响这个数幸运数的性质，我们可以在这个数后面添加几... Read more 优先队列重载 少于 1 分钟阅读时长 发布时间： May 31, 2025 优先队列重载 STL 中对优先队列进行封装，我们可以直接定义使用。插入与取出的时间复杂度为 \\(O(log_2n)\\)。 普通定义： priority_queue&lt;int&gt; pq; 调用系统排序定义： priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt; pq; priority_queue&lt;int,... Read more 2024年ICPC贵州省赛题解 少于 1 分钟阅读时长 发布时间： May 30, 2025 2024贵州省赛题解 A. 破解住宿信息 简单判断。输入字符串含空格，整行输入。 string s; getline(cin,s); int sum=0,x; x=s.find(\"GZU\"); while(x!=-1){ sum++; x=s.find(\"GZU\",x+1); } if(sum==0) cout&lt;&lt;\"yezhulin\"; else if(sum%2) cout&l... Read more 近期DP题目 少于 1 分钟阅读时长 发布时间： May 26, 2025 几道DP题目 牛客练习赛 139C，25 武汉邀请赛 FG 等 C-大卫的密码（牛客练习赛139） 题意：给定一个 \\(n\\times m\\) 的网格图，从 (s,1) 出发，每次可以向右或者向下移动，当光标移动到最后一行的某个格子时，继续向下移动则会到达 (1,i) 格子。需要移动光标到达 (t,m)，求最大价值和。 题解：二维 DP+限制。定义状态 \\(dp[i][j]\\) 表示在 (i... Read more 算法竞赛DP ——《算法竞赛》第5章 动态规划 5 分钟阅读时长 发布时间： May 22, 2025 《算法竞赛》第 5 章 动态规划 1. DP概念和编程方法 1.1 DP的概念 DP是求解多阶段决策问题最优化的一种算法思想。 解决的问题具有两个特征。 重叠子问题：子问题会重叠，即多个不同问题会用到相同子问题 最优子结构：大问题的最优解由小问题最优解得来，但小问题最优解求解过程与大问题无关。 1.2 DP的两种编程方法 自顶向下（先大问题，再小问题），即递归记忆化搜索。 自底向上（先小问题... Read more 12届集美大学校赛题解 少于 1 分钟阅读时长 发布时间： May 10, 2025 12届集美大学校赛题解 官方难度排序参考： Easy：GBJHD Medium：CAEL Hard：KIF A. 地砖 题意：n×m 的矩形，向每个格子中填充字母，使得所有同字母联通块必须为正方形。最小化从上到下、从左到右的字典序。 题解：最小化字典序是经典的贪心问题。按照从上到下、从左到右的顺序枚举每一个未填充格子的颜色，判断是否可行。 B. 逃离蜂巢 题意：有 n 个陷阱，每拆除一个陷阱... Read more CF Round 1023 (Div. 2) 补题 少于 1 分钟阅读时长 发布时间： May 06, 2025 Codeforces Round 1023 (Div. 2) 补题 此次排名情况： 共 8k+，排名 1651，做出 ABC 三题。 Rating +81，当前为 1442。 比赛链接 A. LRC and V..."
        },{
          "title": "Posts by Category",
          "url": "/categories/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "ACM-ICPC 12届集美大学校赛题解 少于 1 分钟阅读时长 发布时间： May 10, 2025 12届集美大学校赛题解 官方难度排序参考： Easy：GBJHD Medium：CAEL Hard：KIF A. 地砖 题意：n×m 的矩形，向每个格子中填充字母，使得所有同字母联通块必须为正方形。最小化从上到下、从左到右的字典序。 题解：最小化字典序是经典的贪心问题。按照从上到下、从左到右的顺序枚举每一个未填充格子的颜色，判断是否可行。 B. 逃离蜂巢 题意：有 n 个陷阱，每拆除一个陷阱... Read more 2025年5月4日 贵州省赛M题——递增的鸭鸭 1 分钟阅读时长 发布时间： May 04, 2025 题目描述 GZU 的农学院在阅湖养了 n 只鸭子，每只鸭子的肉质都有其对应的鲜美度，第 i 只鸭子的鲜美度是在 \\([l_i,r_i]\\) 中的任意整数。求这 n 只鸭子的鲜美度单调不减的方案数，对 998244353 取模。 输入：第一行一个整数 n (1≤n≤500)；接下来 n 行每行两个整数 \\(l_i,r_i (1≤l_i,r_i≤10^9)\\) 输出：满足条件的方案数，对 998... Read more JAVA JAVA基础语法学习1 少于 1 分钟阅读时长 发布时间： May 09, 2024 JAVA基础语法学习1 学习了JAVA包和类，获取时间，生成随机数，类和方法，方法重载和this关键字。 1. 创建项目和类 创建项目名称后，右击项目的 src 目录，在弹出菜单中选择 New→Package，然后输入包名，右击包名选择 New→Java Class。 2. IDEA代码格式化快捷键 Alt+Ctrl+L 3. 获取当前时间 这是标准时间，当地时间需要+时区。 long t ... Read more Others 2025年4月9日学习记录 少于 1 分钟阅读时长 发布时间： April 09, 2025 LaTeX基础学习 1. LaTeX的基本结构 1.1 基本结构 LaTeX 中主要分为导言区和正文区。 % 导言区 \\documentclass{article} \\usepackage{ctex} %正文区 \\begin{document} Hello \\end{document} 1.2 导言区 导言区通常用于定义文档的格式、语言等（全局设置）。 \\documentclass Clas... Read more oj_helper —— 刷题数据统计工具 少于 1 分钟阅读时长 发布时间： February 08, 2025 一个各种刷题网站统计比赛和刷题数据的项目，可以通过这个查询自己各网站刷题数占比，各网站比赛时间和当前分数最高分数，有 Windows 和 Android 版本。 GitHub 项目地址：2754LM/oj_helper 点击 Release 下载对应版本即可。 oj_helper 2.5.0 版本有如下功能： 查询主流刷题网站比赛时间 查询各网站解题数量 查询各网站排位分 包含 ccpcfi... Read more Typora插件配置及右键新建md设置 少于 1 分钟阅读时长 发布时间： February 06, 2025 Typora插件配置 将 Typora 0.9.93 更新至 0.9.98，并且更改注册表使得右键可以新建 md 文档，并且安装 Typora 的相关插件，实现模板写入及更多便利功能。 Typora 0.9.98版本下载 在网上找到的资源，0.9.98 是最后一个免费版本。我原本使用的是 0.9.93，但是安装插件后出现插件警告提示版本过低（后来发现插件配置可以关掉这个提示），后更新至 0.... Read more HTML学习笔记2 1 分钟阅读时长 发布时间： January 03, 2024 前端学习 列表，表格，表单，语义化，字符实体。 列表 列表分类：无序列表、有序列表、定义列表。 无序列表 标签：ul 嵌套 li，ul 是无序列表，li 是列表条目。 &lt;ul&gt; &lt;li&gt;第一项&lt;/li&gt; &lt;li&gt;第二项&lt;/li&gt; &lt;li&gt;第三项&lt;/li&gt; ...... &lt;/ul&gt; 注意事项： ul... Read more HTML学习笔记1 少于 1 分钟阅读时长 发布时间： January 02, 2024 前端学习 标签语法，基本骨架，注释，标题，文本，图像，路径，超链接，音视频。 1. 标签语法 HTML 超文本标记语言——HyperText Markup Language 超文本是什么？链接 标记是什么？标记也叫标签，带尖括..."
        },{
          "title": "Competition",
          "url": "/competitions/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "My competition experiences and awards. 蓝桥杯大赛（国家级二等奖） 🏆 国家级二等奖 2026-06-15 第17届蓝桥杯全国软件和信息技术专业人才大赛国家级二等奖。 View Certificate 蓝桥杯大赛（省赛一等奖） 🏆 省赛一等奖 2026-05-15 第17届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。 View Certificate 睿抗机器人开发者大赛（国家级一等奖） 🏆 国家级一等奖 2025-08-15 2025年睿抗机器人开发者大赛（RAICOM）国家级一等奖。 View Certificate 睿抗机器人开发者大赛（省赛一等奖） 🏆 省赛一等奖 2025-07-15 2025年睿抗机器人开发者大赛（RAICOM）省赛一等奖。 View Certificate 蓝桥杯大赛（国家级三等奖） 🏆 国家级三等奖 2025-06-15 第16届蓝桥杯全国软件和信息技术专业人才大赛国家级三等奖。 View Certificate ICPC贵州省赛（金奖） 🏆 金奖 2025-06-15 2025年ICPC国际大学生程序设计竞赛贵州省赛金奖。 View Certificate 蓝桥杯大赛（省赛一等奖） 🏆 省赛一等奖 2025-05-15 第16届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。 View Certificate 睿抗机器人开发者大赛（国家级一等奖） 🏆 国家级一等奖 2024-08-15 2024年睿抗机器人开发者大赛（RAICOM）国家级一等奖。 View Certificate 百度之星程序设计大赛（省赛铜奖） 🏆 省赛铜奖 2024-08-15 2024年百度之星程序设计大赛省赛铜奖。 View Certificate 睿抗机器人开发者大赛（省级一等奖） 🏆 省级一等奖 2024-07-15 2024年睿抗机器人开发者大赛（RAICOM）省级一等奖。 View Certificate ICPC贵州省赛（银奖） 🏆 银奖 2024-07-15 2024年ICPC国际大学生程序设计竞赛贵州省赛银奖。 View Certificate 蓝桥杯大赛（国家级二等奖） 🏆 国家级二等奖 2024-06-15 第15届蓝桥杯全国软件和信息技术专业人才大赛国家级二等奖。 View Certificate Kaggle Data Science Competition 🏆 Not Participated 2024-06-01 Not Participated View Certificate ICPC昆明邀请赛（铜奖） 🏆 铜奖 2024-05-15 2024年ICPC国际大学生程序设计竞赛亚洲区昆明邀请赛铜奖。 View Certificate 团体程序设计天梯赛（省级团队一等奖） 🏆 省级团队一等奖 2024-04-15 2024年团体程序设计天梯赛省级团队一等奖。 View Certificate 蓝桥杯大赛（省赛一等奖） 🏆 省赛一等奖 2024-04-15 第15届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。 View Certificate ACM-ICPC Regional Contest 🏆 Honorable Mendal 2023-11-15 Participated in the ACM-ICPC regional programming contest. View Certificate 百度之星程序设计大赛（省赛铜奖） 🏆 省赛铜奖 2023-09-15 2023年百度之星程序设计大赛省赛铜奖。 View Certificate 睿抗机器人开发者大赛（国赛三等奖） 🏆 国赛三等奖 2023-08-15 2023年睿抗机器人开发者大赛（RAICOM）国赛三等奖。 View Certificate 睿抗机器人开发者大赛（省赛二等奖） 🏆 省赛二等奖 2023-07-15 2023年睿抗机器人开发者大赛（RAICOM）省赛二等奖。 View Certificate 蓝桥杯大赛（国赛三等奖） 🏆 国赛三等奖 2023-06-15 第14届蓝桥杯全国软件和信息技术专业人才大赛国赛三等奖。 View Certificate 团体程序设计天梯赛（贵州省团队一等奖） 🏆 贵州省团队一等奖 2023-05-15 2023年团体程序设计天梯赛贵州省团队一等奖。 View Certificate 蓝桥杯大赛（省赛一等奖） 🏆 省赛一等奖 2023-04-15 第14届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。 View Certificate"
        },{
          "title": "CV",
          "url": "/cv/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "Zifan Tang 📧 3340589482@qq.com 🐙 github.com/TZF0237 洛谷 Codeforces Education 2022.09-2026.06 Guizhou Minzu University Bachelor of Engineering in Computer Science and Technology Experience Add your work/research experience here. Skills Add your skills here. Publications Paper Title Number 2 Your Name, You. (2010). &quot;Paper Title Number 2.&quot; Journal 1. 1(2). Paper Title Number 1 Your Name, You. (2009). &quot;Paper Title Number 1.&quot; Journal 1. 1(1). Competition Awards 蓝桥杯大赛（国家级二等奖） — 国家级二等奖 (2026) 蓝桥杯大赛（省赛一等奖） — 省赛一等奖 (2026) 睿抗机器人开发者大赛（国家级一等奖） — 国家级一等奖 (2025) 睿抗机器人开发者大赛（省赛一等奖） — 省赛一等奖 (2025) 蓝桥杯大赛（国家级三等奖） — 国家级三等奖 (2025) ICPC贵州省赛（金奖） — 金奖 (2025) 蓝桥杯大赛（省赛一等奖） — 省赛一等奖 (2025) 睿抗机器人开发者大赛（国家级一等奖） — 国家级一等奖 (2024) 百度之星程序设计大赛（省赛铜奖） — 省赛铜奖 (2024) 睿抗机器人开发者大赛（省级一等奖） — 省级一等奖 (2024) ICPC贵州省赛（银奖） — 银奖 (2024) 蓝桥杯大赛（国家级二等奖） — 国家级二等奖 (2024) Kaggle Data Science Competition — Not Participated (2024) ICPC昆明邀请赛（铜奖） — 铜奖 (2024) 团体程序设计天梯赛（省级团队一等奖） — 省级团队一等奖 (2024) 蓝桥杯大赛（省赛一等奖） — 省赛一等奖 (2024) ACM-ICPC Regional Contest — Honorable Mendal (2023) 百度之星程序设计大赛（省赛铜奖） — 省赛铜奖 (2023) 睿抗机器人开发者大赛（国赛三等奖） — 国赛三等奖 (2023) 睿抗机器人开发者大赛（省赛二等奖） — 省赛二等奖 (2023) 蓝桥杯大赛（国赛三等奖） — 国赛三等奖 (2023) 团体程序设计天梯赛（贵州省团队一等奖） — 贵州省团队一等奖 (2023) 蓝桥杯大赛（省赛一等奖） — 省赛一等奖 (2023)"
        },{
          "title": "Page Archive",
          "url": "/page-archive/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "404 - Page Not Found Hi, I'm Zifan Tang 👋 Blogs Posts Posts by Category Competition CV Page Archive Publications Sitemap Posts by Tags Blog posts"
        },{
          "title": "Publications",
          "url": "/publications/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "Journal Articles Paper Title Number 2 Published in Journal 1, 2010 This paper is about the number 2. The number 3 is left for future work. Recommended citation: Your Name, You. (2010). &quot;Paper Title Number 2.&quot; Journal 1. 1(2).Download Paper | Download Slides Paper Title Number 1 Published in Journal 1, 2009 This paper is about the number 1. The number 2 is left for future work. Recommended citation: Your Name, You. (2009). &quot;Paper Title Number 1.&quot; Journal 1. 1(1).Download Paper | Download Slides | Download Bibtex"
        },{
          "title": "Sitemap",
          "url": "/sitemap/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "{% include base_path %} A list of all the posts and pages found on the site. For you robots out there, there is an [XML version]({{ base_path }}/sitemap.xml) available for digesting as well. Pages {% for post in site.pages %} {% include archive-single.html %} {% endfor %} Posts {% for post in site.posts %} {% include archive-single.html %} {% endfor %} {% capture written_label %}'None'{% endcapture %} {% for collection in site.collections %} {% unless collection.output == false or collection.label == \"posts\" %} {% capture label %}{{ collection.label }}{% endcapture %} {% if label != written_label %} {{ label }} {% capture written_label %}{{ label }}{% endcapture %} {% endif %} {% endunless %} {% for post in collection.docs %} {% unless collection.output == false or collection.label == \"posts\" %} {% include archive-single.html %} {% endunless %} {% endfor %} {% endfor %}"
        },{
          "title": "Posts by Tags",
          "url": "/tags/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "{% include base_path %} {% include group-by-array collection=site.posts field=\"tags\" %} {% for tag in group_names %} {% assign posts = group_items[forloop.index0] %} {{ tag }} {% for post in posts %} {% include archive-single.html %} {% endfor %} {% endfor %}"
        },{
          "title": "Blog posts",
          "url": "/year-archive/",
          "date": "",
          "categories": [],
          "tags": [],
          "excerpt": "",
          "content": "{% include base_path %} {% capture written_year %}'None'{% endcapture %} {% for post in site.posts %} {% capture year %}{{ post.date | date: '%Y' }}{% endcapture %} {% if year != written_year %} {{ year }} {% capture written_year %}{{ year }}{% endcapture %} {% endif %} {% include archive-single.html %} {% endfor %}"
        },{
        "title": "Paper Title Number 1",
        "url": "/publication/2009-10-01-paper-title-number-1",
        "date": "2009-10-01",
        "categories": ["Publication"],
        "tags": [],
        "excerpt": "This paper is about the number 1. The number 2 is left for future work.",
        "content": "The contents above will be part of a list of publications, if the user clicks the link for the publication than the contents of section will be rendered as a full page, allowing you to provide more information about the paper for the reader. When publications are displayed as a single page, the contents of the above “citation” field will automatically be included below this section in a smaller font."
      },{
        "title": "Paper Title Number 2",
        "url": "/publication/2010-10-01-paper-title-number-2",
        "date": "2010-10-01",
        "categories": ["Publication"],
        "tags": [],
        "excerpt": "This paper is about the number 2. The number 3 is left for future work.",
        "content": "The contents above will be part of a list of publications, if the user clicks the link for the publication than the contents of section will be rendered as a full page, allowing you to provide more information about the paper for the reader. When publications are displayed as a single page, the contents of the above “citation” field will automatically be included below this section in a smaller font."
      },{
        "title": "蓝桥杯大赛（省赛一等奖）",
        "url": "/competitions/2023-04-15-lanqiao-cup-provincial",
        "date": "2023-04-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第14届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。",
        "content": "第14届蓝桥杯全国软件和信息技术专业人才大赛，省赛一等奖（C/C++程序设计大学B组）。"
      },{
        "title": "团体程序设计天梯赛（贵州省团队一等奖）",
        "url": "/competitions/2023-05-15-team-programming-ladder",
        "date": "2023-05-15",
        "categories": ["Competition"],
        "tags": ["team-ladder","programming"],
        "excerpt": "2023年团体程序设计天梯赛贵州省团队一等奖。",
        "content": "2023年团体程序设计天梯赛，荣获贵州省团队一等奖。"
      },{
        "title": "蓝桥杯大赛（国赛三等奖）",
        "url": "/competitions/2023-06-15-lanqiao-cup-national",
        "date": "2023-06-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第14届蓝桥杯全国软件和信息技术专业人才大赛国赛三等奖。",
        "content": "第14届蓝桥杯全国软件和信息技术专业人才大赛，荣获全国总决赛三等奖（C/C++程序设计大学B组）。"
      },{
        "title": "睿抗机器人开发者大赛（省赛二等奖）",
        "url": "/competitions/2023-07-15-ruikang-robot-provincial",
        "date": "2023-07-15",
        "categories": ["Competition"],
        "tags": ["ruikang","robot"],
        "excerpt": "2023年睿抗机器人开发者大赛（RAICOM）省赛二等奖。",
        "content": "2023年睿抗机器人开发者大赛（RAICOM），荣获省赛二等奖。"
      },{
        "title": "睿抗机器人开发者大赛（国赛三等奖）",
        "url": "/competitions/2023-08-15-ruikang-robot-national",
        "date": "2023-08-15",
        "categories": ["Competition"],
        "tags": ["ruikang","robot"],
        "excerpt": "2023年睿抗机器人开发者大赛（RAICOM）国赛三等奖。",
        "content": "2023年睿抗机器人开发者大赛（RAICOM），荣获全国总决赛三等奖。"
      },{
        "title": "百度之星程序设计大赛（省赛铜奖）",
        "url": "/competitions/2023-09-15-baidu-star-provincial",
        "date": "2023-09-15",
        "categories": ["Competition"],
        "tags": ["baidu-star","programming"],
        "excerpt": "2023年百度之星程序设计大赛省赛铜奖。",
        "content": "2023年百度之星程序设计大赛，荣获省赛铜奖。"
      },{
        "title": "ACM-ICPC Regional Contest",
        "url": "/competitions/2023-11-15-acm-contest",
        "date": "2023-11-15",
        "categories": ["Competition"],
        "tags": ["programming","algorithms"],
        "excerpt": "Participated in the ACM-ICPC regional programming contest.",
        "content": "Detailed description of the contest experience, team members, and solutions."
      },{
        "title": "蓝桥杯大赛（省赛一等奖）",
        "url": "/competitions/2024-04-15-lanqiao-cup-provincial",
        "date": "2024-04-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第15届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。",
        "content": "第15届蓝桥杯全国软件和信息技术专业人才大赛，荣获省赛一等奖（C/C++程序设计大学B组）。"
      },{
        "title": "团体程序设计天梯赛（省级团队一等奖）",
        "url": "/competitions/2024-04-15-team-programming-ladder",
        "date": "2024-04-15",
        "categories": ["Competition"],
        "tags": ["team-ladder","programming"],
        "excerpt": "2024年团体程序设计天梯赛省级团队一等奖。",
        "content": "2024年团体程序设计天梯赛，荣获省级团队一等奖。"
      },{
        "title": "ICPC昆明邀请赛（铜奖）",
        "url": "/competitions/2024-05-15-icpc-kunming",
        "date": "2024-05-15",
        "categories": ["Competition"],
        "tags": ["icpc","programming","algorithms"],
        "excerpt": "2024年ICPC国际大学生程序设计竞赛亚洲区昆明邀请赛铜奖。",
        "content": "2024年ICPC国际大学生程序设计竞赛亚洲区昆明邀请赛，荣获铜奖。"
      },{
        "title": "Kaggle Data Science Competition",
        "url": "/competitions/2024-06-01-kaggle-competition",
        "date": "2024-06-01",
        "categories": ["Competition"],
        "tags": ["data-science","machine-learning"],
        "excerpt": "Not Participated",
        "content": "Detailed description of the competition participation, methods used, and lessons learned."
      },{
        "title": "蓝桥杯大赛（国家级二等奖）",
        "url": "/competitions/2024-06-15-lanqiao-cup-national",
        "date": "2024-06-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第15届蓝桥杯全国软件和信息技术专业人才大赛国家级二等奖。",
        "content": "第15届蓝桥杯全国软件和信息技术专业人才大赛，荣获全国总决赛二等奖（C/C++程序设计大学B组）。"
      },{
        "title": "ICPC贵州省赛（银奖）",
        "url": "/competitions/2024-07-15-icpc-guizhou",
        "date": "2024-07-15",
        "categories": ["Competition"],
        "tags": ["icpc","programming","algorithms"],
        "excerpt": "2024年ICPC国际大学生程序设计竞赛贵州省赛银奖。",
        "content": "2024年ICPC国际大学生程序设计竞赛贵州省赛，荣获银奖。"
      },{
        "title": "睿抗机器人开发者大赛（省级一等奖）",
        "url": "/competitions/2024-07-15-ruikang-robot-provincial",
        "date": "2024-07-15",
        "categories": ["Competition"],
        "tags": ["ruikang","robot"],
        "excerpt": "2024年睿抗机器人开发者大赛（RAICOM）省级一等奖。",
        "content": "2024年睿抗机器人开发者大赛（RAICOM），荣获省级一等奖。"
      },{
        "title": "百度之星程序设计大赛（省赛铜奖）",
        "url": "/competitions/2024-08-15-baidu-star-provincial",
        "date": "2024-08-15",
        "categories": ["Competition"],
        "tags": ["baidu-star","programming"],
        "excerpt": "2024年百度之星程序设计大赛省赛铜奖。",
        "content": "2024年百度之星程序设计大赛，荣获省赛铜奖。"
      },{
        "title": "睿抗机器人开发者大赛（国家级一等奖）",
        "url": "/competitions/2024-08-15-ruikang-robot-national",
        "date": "2024-08-15",
        "categories": ["Competition"],
        "tags": ["ruikang","robot"],
        "excerpt": "2024年睿抗机器人开发者大赛（RAICOM）国家级一等奖。",
        "content": "2024年睿抗机器人开发者大赛（RAICOM），荣获全国总决赛一等奖。"
      },{
        "title": "蓝桥杯大赛（省赛一等奖）",
        "url": "/competitions/2025-05-15-lanqiao-cup-provincial",
        "date": "2025-05-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第16届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。",
        "content": "第16届蓝桥杯全国软件和信息技术专业人才大赛，荣获省赛一等奖（C/C++程序设计大学B组）。"
      },{
        "title": "ICPC贵州省赛（金奖）",
        "url": "/competitions/2025-06-15-icpc-guizhou",
        "date": "2025-06-15",
        "categories": ["Competition"],
        "tags": ["icpc","programming","algorithms"],
        "excerpt": "2025年ICPC国际大学生程序设计竞赛贵州省赛金奖。",
        "content": "2025年ICPC国际大学生程序设计竞赛贵州省赛，荣获金奖。"
      },{
        "title": "蓝桥杯大赛（国家级三等奖）",
        "url": "/competitions/2025-06-15-lanqiao-cup-national",
        "date": "2025-06-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第16届蓝桥杯全国软件和信息技术专业人才大赛国家级三等奖。",
        "content": "第16届蓝桥杯全国软件和信息技术专业人才大赛，荣获全国总决赛三等奖（C/C++程序设计大学B组）。"
      },{
        "title": "睿抗机器人开发者大赛（省赛一等奖）",
        "url": "/competitions/2025-07-15-ruikang-robot-provincial",
        "date": "2025-07-15",
        "categories": ["Competition"],
        "tags": ["ruikang","robot"],
        "excerpt": "2025年睿抗机器人开发者大赛（RAICOM）省赛一等奖。",
        "content": "2025年睿抗机器人开发者大赛（RAICOM），荣获省赛一等奖。"
      },{
        "title": "睿抗机器人开发者大赛（国家级一等奖）",
        "url": "/competitions/2025-08-15-ruikang-robot-national",
        "date": "2025-08-15",
        "categories": ["Competition"],
        "tags": ["ruikang","robot"],
        "excerpt": "2025年睿抗机器人开发者大赛（RAICOM）国家级一等奖。",
        "content": "2025年睿抗机器人开发者大赛（RAICOM），荣获全国总决赛一等奖。"
      },{
        "title": "蓝桥杯大赛（省赛一等奖）",
        "url": "/competitions/2026-05-15-lanqiao-cup-provincial",
        "date": "2026-05-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第17届蓝桥杯全国软件和信息技术专业人才大赛省赛一等奖。",
        "content": "第17届蓝桥杯全国软件和信息技术专业人才大赛，荣获省赛一等奖（C/C++程序设计大学B组）。"
      },{
        "title": "蓝桥杯大赛（国家级二等奖）",
        "url": "/competitions/2026-06-15-lanqiao-cup-national",
        "date": "2026-06-15",
        "categories": ["Competition"],
        "tags": ["lanqiao-cup","programming"],
        "excerpt": "第17届蓝桥杯全国软件和信息技术专业人才大赛国家级二等奖。",
        "content": "第17届蓝桥杯全国软件和信息技术专业人才大赛，荣获全国总决赛二等奖（C/C++程序设计大学B组）。"
      }]
