(题目来源于洛谷,省一代码分享)
P16232 [蓝桥杯 2026 省 B] 青春常数
题目背景
本站蓝桥杯 2026 省赛测试数据均为洛谷自造,与官方数据可能存在差异,仅供学习参考。
题目描述
小蓝与蓝桥杯的缘分已经走到了第四个年头。从 2023 年的初出茅庐,到 2024、2025 年的披荆斩棘,而今年的 2026 年,将是他大学生涯最后一次站上这个赛场。
退役前夕,百感交集的小蓝在草稿纸上将这四届参赛的年份倒序写下,拼接成了一个巨大的整数 N=2026202520242023。
在整理四年的竞赛心得时,他决定将这一常数 N 拆分为两个非负整数 x 和 y,分别代表他这段旅程的前半段积累与后半段突破。按照拆分规则,这两部分的数值之和必须恰好等于 N(即 x+y=N)。
同时,由于在后半段赛程中小蓝积累了更深厚的算法功底,因此后半部分的数值 y 必须严格大于前半部分的数值 x(即 0≤x<y)。
现在,请你计算满足上述条件的整数对 (x,y) 共有多少个?
输入格式
无
输出格式
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
输入输出样例
输入 #1复制
输出 #1复制
实现代码:
#include<bits/stdc++.h> using namespace std; int main(){ cout<<"1013101260121012"; return 0; }P16234 [蓝桥杯 2026 省 B] 循环右移
题目背景
本站蓝桥杯 2026 省赛测试数据均为洛谷自造,与官方数据可能存在差异,仅供学习参考。
题目描述
给定三个整数 N,X,Y。请计算有多少个长度为 N 的整数数组 A 满足以下条件:
- 数组 A 中的每个元素 Ai 都满足 X≤Ai≤Y;
- 对于数组 A 中的任意一个连续子数组,对其进行一次循环右移操作,得到的新子数组与原数组完全一致。
循环右移:对一个长度为 k 的连续子数组 [B1,B2,…,Bk] 执行一次循环右移操作,是指将该子数组变换为 [Bk,B1,B2,...,Bk−1](即把最后一个元素移到最开头,其余元素保持原有顺序依次向后顺延一位)。
输入格式
第一行包含一个整数 T,表示测试数据的组数。
接下来的 T 行,每行包含三个由空格隔开的整数 N,X,Y。
输出格式
对于每组测试数据,输出一行,包含一个整数,表示满足条件的数组 A 的个数。
输入输出样例
输入 #1复制
3 3 1 2 5 10 10 2 5 3
输出 #1复制
2 1 0
说明/提示
【评测用例规模与约定】
对于 30% 的评测用例,1≤T≤20, 1≤N≤100, 1≤X,Y≤100;
对于 100% 的评测用例,1≤T≤103, 1≤N≤1018, 1≤X,Y≤1018。
实现代码:
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0), cin.tie(0); int T; cin >> T; while (T--) { long long N, X, Y; cin >> N >> X >> Y; if (X > Y) cout << "0\n"; else cout << Y - X + 1 << '\n'; } return 0; }P16235 [蓝桥杯 2026 省 B] 蓝桥竞技
题目描述
小蓝,作为电竞俱乐部“蓝桥竞技”的战队经理,正面临着一个巨大的管理危机。俱乐部目前签约了 N 种不同位置的职业选手,其中第 i 种位置的选手共有 Ai 名。
为了参加即将举办的“峡谷 5v5”,小蓝必须将俱乐部内的所有选手都编入战队,不能有任何一人坐冷板凳。
根据赛事组委会的严苛规则,一支合法的战队必须满足以下条件:
- 5 人成团:每支战队由且只能由 5 名选手组成。
- 职业互斥:同一支战队内的 5 名选手,必须来自 5 种完全不同的位置。
现在,请你帮助小蓝判断:在当前的人员数量下,是否有一种分组方案,能够将所有选手恰好分配完,且每支战队都符合参赛规则?
输入格式
第一行包含一个整数 T,表示测试用例组数。
接下来包含 T 组数据,每组数据的格式如下:
- 第一行包含一个整数 N,表示职业位置的种类数量。
- 第二行包含 N 个整数 A1,A2,…,AN,分别表示第 i 种位置的选手人数。
输出格式
对于每组测试用例,如果存在满足条件的分组方案,输出 T,否则输出 F。
输入输出样例
输入 #1复制
4 5 1 1 1 1 1 6 2 2 2 2 1 1 5 1 1 1 1 2 6 3 1 1 1 2 2
输出 #1复制
T T F F
说明/提示
【样例说明】
第一组数据:共有 5 名选手,各占 1 个位置,恰好可以组成 1 支战队。
第二组数据:共有 10 名选手,可以分成 2 支战队。一种合法的分配方案是:战队一由位置 1,2,3,4,5 的选手组成;战队二由位置 1,2,3,4,6 的选手组成。
第三、四组数据不存在满足条件的分组方案。
【评测用例规模与约定】
对于 30% 的评测用例:1≤T≤5, 1≤N≤20, 0≤Ai≤100;
对于 100% 的评测用例:1≤T≤103, 1≤N≤105, 0≤Ai≤109,且保证所有测试用例中 N 的总和不超过 2×105。
实现代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; void solve() { int n; cin >> n; vector<ll> a(n); ll s = 0; ll m = 0; for (int i = 0; i < n; i++) { cin >> a[i]; s += a[i]; if (a[i] > m) m = a[i]; } if (s % 5 != 0) { cout << "F" << endl; return; } ll k = s / 5; if (m > k) { cout << "F" << endl; return; } cout << "T" << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { solve(); } return 0; }P16236 [蓝桥杯 2026 省 B] LQ 聚合
题目描述
2056 年,探险队在月球背面的环形山深处发现了一座信号发射塔,其核心控制台正在不断闪烁着一串长度为 N 的粒子序列。
序列中的每个位置被严格定义为 L 型粒子、Q 型粒子,或者因岁月侵蚀而模糊不清的未知状态 ?。这些粒子将被依次射入反应场,而反应场的稳定性取决于序列的“LQ 聚合”数量,该数量被定义为所有满足 1≤i<j≤N 且第 i 个节点为 L、第 j 个节点为 Q 的二元组数量。
为了重启这座沉睡的巨塔,探险队需要将序列中所有的 ? 修复为确定的 L 或 Q。
现在,请你计算出在所有可能的修复方案中,所能得到的“LQ 聚合”数量的最大值是多少。
输入格式
第一行输入一个整数 N,表示粒子序列的长度。
第二行输入一个长度为 N 的字符串,仅包含字符 L、Q 和 ?,表示当前探测到的粒子序列状态。
输出格式
输出一个整数,表示在将所有 ? 替换为 L 或 Q 后,能获得的最大“LQ 聚合”数量。
输入输出样例
输入 #1复制
5 ??L??
输出 #1复制
6
说明/提示
【样例说明】
一种最优的策略是将序列修复为 LLLQQ。此时位于前面的 3 个 L 与位于后面的 2 个 Q 共可产生 3×2=6 个聚合。
【评测用例规模与约定】
对于 30% 的评测用例,字符串 ? 的个数不超过 10。
对于所有评测用例,2≤N≤105。
实现代码:
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; string s; cin >> n >> s; long long totQ = 0; for (char c : s) if (c == 'Q') ++totQ; long long curL = 0, curQ = 0; long long base = 0; vector<int> lp; vector<int> qb; for (int i = 0; i < n; ++i) { char c = s[i]; if (c == 'L') { ++curL; } else if (c == 'Q') { base += curL; ++curQ; } else { lp.push_back((int)curL); qb.push_back((int)curQ); } } int m = lp.size(); vector<long long> preL(m + 1, 0), preQ(m + 1, 0); for (int i = 1; i <= m; ++i) { preL[i] = preL[i - 1] + lp[i - 1]; preQ[i] = preQ[i - 1] + (curQ - qb[i - 1]); } long long totalLpref = preL[m]; long long ans = 0; for (int k = 0; k <= m; ++k) { long long cur = base + (totalLpref - preL[k]) + preQ[k] + 1LL * k * (m - k); if (cur > ans) ans = cur; } cout << ans << "\n"; return 0; }P16237 [蓝桥杯 2026 省 B] 应急布线
题目描述
实验室内,小蓝负责维护一个由 N 台计算机组成的局域网络。这些计算机原本通过高速网线互联,但随着设备老化,目前仅剩 M 条网线还能正常工作。正因如此,原本统一的网络分裂成了多个互不相连的通信区域。
为了恢复通信,小蓝计划架设一种特殊的“应急跳线”来重新连接这些区域。在物理逻辑上,只要任意两台计算机之间可以通过残存的网线或新架设的应急跳线建立直接或间接的通路,即视为它们之间恢复了连通。小蓝的任务是选定最优的布线方案,使得实验室内的所有 N 台计算机重新回到全连通的状态。
由于应急跳线的接口会占用计算机宝贵的硬件资源,小蓝在制定方案时设定了两个优先层级:首先,必须确保使用的应急跳线总数达到理论上的最小值;其次,为了减轻单台计算机的负载压力,他要求尽可能平均地分摊这些跳线。具体而言,他需要寻找一种方案,使得在所有计算机中,接入这种应急跳线数量最多的那一台机器,其接入的跳线数降到最低。
现在,请你根据当前网线的残存连接情况,计算出实现全连通所需的最少应急跳线数量,以及在这一最优前提下,单台计算机接入应急跳线数量最大值的最小可能值。
输入格式
第一行包含两个整数 N 和 M,分别表示计算机的总数和目前完好的网线数量。
接下来的 M 行,每行包含两个整数 a 和 b,表示计算机 a 和 b 之间目前仍存在一条完好的网线。
输出格式
输出一行,包含两个由单个空格隔开的整数。第一个整数表示最少需要添加的应急跳线数量,第二个整数表示在确保跳线总数最少的前提下,单台计算机接入跳线数量最大值的最小可能值。
输入输出样例
输入 #1复制
7 2 1 2 2 3
输出 #1复制
4 2
说明/提示
【样例说明】
通过连接 1−4, 4−5, 5−6, 6−7(共计 4 条跳线),可以使节点 4,5,6 各承担两条跳线,而其他节点仅承担一条或不承担,从而使最大值达到最小值为 2。
【评测用例规模与约定】
对于 30% 的评测用例,1≤N≤100, 0≤M≤100;
对于所有评测用例,1≤N≤105, 0≤M≤105, 1≤a,b≤N, a=b。保证输入的连接信息中不包含重边。
实现代码:
#include <bits/stdc++.h> using namespace std; struct DSU { vector<int> p, r; DSU(int n) : p(n), r(n, 0) { iota(p.begin(), p.end(), 0); } int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } void unite(int a, int b) { a = find(a); b = find(b); if (a == b) return; if (r[a] < r[b]) swap(a, b); p[b] = a; if (r[a] == r[b]) ++r[a]; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; DSU d(N); for (int i = 0; i < M; ++i) { int a, b; cin >> a >> b; --a; --b; d.unite(a, b); } int C = 0; for (int i = 0; i < N; ++i) if (d.find(i) == i) ++C; long long edges_needed = C - 1; long long need = 2LL * edges_needed; long long D = (need + N - 1) / N; cout << edges_needed << ' ' << D << '\n'; return 0; }P16238 [蓝桥杯 2026 省 B] 理想温度
题目描述
一条工业流水线上排列着 n 个温度传感器。当前各个传感器测得的温度记录在数组 A 中,而各传感器对应的理想标准温度记录在数组 B 中(即 Ai 为第 i 个传感器的当前温度,Bi 为第 i 个传感器的理想温度)。
为了让尽可能多的传感器达到理想温度,你可以进行一次区域温度补偿操作:
- 在流水线上划定一段连续的传感器区间 [l,r](即第 l 个到第 r 个传感器)。
- 输入一个温度补偿值 k(k 为任意整数),使得该区间内所有传感器的当前温度都加上 k。
请问在执行完这一次校准操作后,最多能使多少个传感器的温度恰好等于其对应的理想标准温度?
输入格式
第一行包含一个整数 n,表示传感器的数量。
第二行包含 n 个整数 A1,A2,…,An,表示各传感器的当前温度。
第三行包含 n 个整数 B1,B2,…,Bn,表示各传感器对应的理想标准温度。
输出格式
输出一行,包含一个整数,表示补偿操作后处于理想温度的传感器最大数量。
输入输出样例
输入 #1复制
5 1 2 3 4 5 2 3 2 3 2
输出 #1复制
2
说明/提示
【评测用例规模与约定】
对于 30% 的评测用例,保证 1≤n≤2000;
对于所有评测用例,保证 1≤n≤2×105, −109≤Ai,Bi≤109。
实现代码:
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector<int> a(n), b(n), d(n), p(n+1, 0); for(int i=0;i<n;++i) cin>>a[i]; vector<pair<int,int>> v; for(int i=0;i<n;++i){ cin>>b[i]; d[i]=b[i]-a[i]; p[i+1]=p[i]+(d[i]==0); if(d[i]!=0) v.push_back({d[i], i+1}); } sort(v.begin(), v.end()); int ans=p[n]; int sz=v.size(); for(int i=0;i<sz;){ int j=i; while(j<sz&&v[j].first==v[i].first) j++; int min_v=0, max_d=0; for(int k=i;k<j;++k){ int idx=v[k].second; int cnt=k-i+1; min_v=min(min_v, (cnt-1)-p[idx-1]); max_d=max(max_d, cnt-p[idx]-min_v); } ans=max(ans, p[n]+max_d); i=j; } cout<<ans<<"\n"; return 0; }