蓝桥杯题型
蓝桥杯
- 蓝桥杯题型分类
- 语法基础
- 艺术与篮球(日期问题)
- 时间显示(时间问题)
- 跑步计划(日期问题)
- 偶串(字符)
- 最长子序列(字符)
- 字母数(进制转换)
- 6个0(进制转换)
- 优秀的拆分(位运算)
- 异或数列(位运算)
- 幸运数字的个数(预计算)
- 填空
- 握手问题
- 报数问题
- 二分
- 123
- 双指针
- 小齐的奶牛配对挤奶计划
- 卓儿探寻全球变暖
蓝桥杯题型分类
语法基础
艺术与篮球(日期问题)
#include <bits/stdc++.h>
using namespace std;map<char,int>myMap;
int basketball,calligraphy;//日期是否合法模板
int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int date)
{int year=date/10000,month=date%10000/100,day=date%100;if(!month||month>=13||!day)return false;if(month!=2&&day>months[month])return false;if(month==2){int leap=(year%100!=0&&year%4==0)||year%400==0;if(day>28+leap)return false;}return true;
}int main()
{// 插入数字与笔画数myMap['0'] = 13;myMap['1'] = 1;myMap['2'] = 2;myMap['3'] = 3;myMap['4'] = 5;myMap['5'] = 4;myMap['6'] = 4;myMap['7'] = 2;myMap['8'] = 2;myMap['9'] = 2;// 遍历日期范围,从2000年1月1日到2024年4月13日for(int i=20000101;i<=20240413;i++){if(check(i)){string s=to_string(i);int num=0;for(auto j:s){num+=myMap[j];}if(num>50){basketball++;}}}cout<<basketball;return 0;
}
时间显示(时间问题)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main()
{ll x;cin >> x;// 计算小时、分钟、秒数ll hh = (x / 3600000) % 24; // 小时数,取 24 小时制ll mm = (x / 60000) % 60; // 分钟数,取 60 分钟ll ss = (x / 1000) % 60; // 秒数,取 60 秒// 输出时间格式printf("%02lld:%02lld:%02lld", hh, mm, ss);return 0;
}
跑步计划(日期问题)
#include <bits/stdc++.h>
using namespace std;int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 每个月的天数// 检查数字是否包含1
bool check(int x) {while (x) {if (x % 10 == 1) {return true; // 如果数字中包含1,返回true}x /= 10; // 去除最后一位}return false; // 如果没有1,返回false
}int main() {int ans = 0; // 总跑步的千米数int week = 6; // 2023年1月1日是星期天,所以初始化为6(星期天)// 遍历每个月for (int i = 1; i <= 12; i++) {// 遍历每个月的每一天for (int j = 1; j <= months[i]; j++) {week = (week % 7) + 1; // 更新星期几,确保在1到7之间循环(星期天为7)// 如果日期、月份或星期几包含1,跑5千米if (check(i) || check(j) || check(week)) {ans += 5;} else {ans += 1; // 否则跑1千米}}}cout << ans; // 输出小蓝总共跑的千米数return 0;
}
偶串(字符)
使用 Map 或者 unordered_map。
遍历字符串中的每个字符。对每个字符,检查它是否已经在你的数据结构中。如果是,增加它的计数。
#include <iostream>
#include <unordered_map>
using namespace std;int main() {string str;cin >> str; // 输入字符串unordered_map<char, int> char_count; // 用哈希表存储每个字符的出现次数// 遍历字符串并统计每个字符的出现次数for (char c : str) {char_count[c]++;}// 检查是否每个字符出现次数为偶数bool is_even = true;for (auto& pair : char_count) {if (pair.second % 2 != 0) { // 如果出现次数是奇数is_even = false;break;}}// 输出结果if (is_even) {cout << "YES" << endl;} else {cout << "NO" << endl;}return 0;
}
创建一个大小为26的整数数组(假设为 cnt),用于存储每个小写字母的出现次数。数组的索引
0−25 分别对应字母 a-z。
遍历字符串的每一个字符(假设为 c):
将字符 c 转为其 ASCII 值。
通过计算 c - 'a' 来得到一个从 0
0 到 25 的索引,这个索引对应于字符 c。
使用这个索引来增加 cnt 数组中对应元素的值。
遍历结束后,cnt 数组中的每个元素就存储了对应字母在字符串中的出现次数。
#include <iostream>
#include <vector>using namespace std;int main()
{string s;vector<int> cnt(26);cin >> s;for (auto c : s){cnt[c - 'a']++;}for (int i = 0; i < 26; ++i){if (cnt[i] % 2){cout << "NO" << '\n';return 0;}}cout << "YES" << '\n';return 0;
}
最长子序列(字符)
#include <iostream>
#include <string>
using namespace std;int main() {string s, t;int num = 0;cin >> s >> t;for (char ch : t) {// 查找当前字符ch在s中的位置size_t pos = s.find(ch);if (pos == string::npos) {// 如果找不到字符,直接输出已找到的匹配数并结束程序cout << num;return 0;} else {// 如果找到了字符,更新字符串s并增加计数num++;s = s.substr(pos + 1); // 从pos+1开始截取s}}// 输出最终匹配的字符数cout << num;return 0;
}
字母数(进制转换)
#include <bits/stdc++.h>
using namespace std;using ll=long long;
int a[1000];
char ch[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };bool solve(int x)//十进制转换为16进制
{string ans;while(x){if(ch[x%16]>='A'){ans+=ch[x%16];x/=16;}else{return false;}}reverse(ans.begin(),ans.end());return true;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int i=2022;while(true){i++;if( solve(i)){cout<<i;return 0;}}return 0;
}
6个0(进制转换)
#include <bits/stdc++.h>
using namespace std;bool check(int x)
{// 检查最低的 5 位是否都为 0for(int i = 0; i < 5; i++){if(((x >> i) & 1) != 0) // 如果第 i 位不为 0,返回 false{return false;}}return true;
}int main()
{int x = 2022; // 从 2022 开始查找while(true){x++; // 从 2023 开始检查if(check(x)) // 如果 x 的最低 5 位全为 0{cout << x;return 0;}}return 0;
}
优秀的拆分(位运算)
- 输入输出样例
示例 1
输入
6
输出
4 2
示例 2
输入
7
输出
-1
7的二进制数为(0111),6的二进制数为(0110),可以发现7的二进制位的最低位(第0位)为1,值为
2 0 2^0 20 ,所以只要最低位为1,就不是优秀的拆分。我的从最高位开始遍历,只要第i位为1,我们就输出 1<<i ,即为 2 i 2^i 2i
#include <bits/stdc++.h>
using namespace std;int main() {int num;cin >> num;// 如果最低位为 1,输出 -1if (((num >> 0) & 1) == 1) {cout << -1 << endl;return 0;}// 从最高位开始遍历,检查每一位for (int i = 30; i >= 0; i--) {// 如果当前位为 1,输出 2^iif (((num >> i) & 1) == 1) {cout << (1 << i) << " ";}}return 0;
}
异或数列(位运算)
示例 1
输入
4
1 1
1 0
2 2 1
7 992438 1006399 781139 985280 4729 872779 563580
输出
1
0
1
1
解题思路
我们设在游戏结束后 Alice 的数变为 c
,Bob 的数变为 d
。
我们先来解决平局的情况:
根据异或性质可得:若 c = d
,则 c ⊕ d = 0
。
而 c ⊕ d = X1 ⊕ X2 ⊕ ⋯ ⊕ Xn
,所以要使 c = d
,当且仅当 X1 ⊕ X2 ⊕ ⋯ ⊕ Xn = 0
。
接下来定输赢:
我们将 c, d
转换成二进制数。对于二进制数的比较,我们是从高位往低位开始的。所以要使自己的数最大,就需要从高位开始。
设当前枚举到二进制的第 i
位。设 X1, X2, X3, ..., Xn
中一共有 cnt1
个数在该位的值为 1
,cnt2
个数在该位的值为 0
。(cnt1 + cnt2 = n
)
结论一:
如果 cnt1
为偶数,则 Alice 和 Bob 无法在该位分出胜负。
证明方法和上述平局情况相同。 或者也可以这么想:cnt1
为偶数,那么 Alice 和 Bob 要么都从这 cnt1
个数中分到偶数个,要么 Alice 和 Bob 都在这 cnt1
个数中分到奇数个;所以无论怎么分配,c, d
在该位的异或值都必然相同。
反之当 cnt1
为奇数时,必然能决出胜负。证明方法和上述类似,就不再给出。
那么 cnt1
为奇数时如何判断谁输谁赢呢?
我们先定义,对于当前第 i
位,如果能让自己的数值从 0 → 1
,或者能让对手的数值从 1 → 0
,则自己的胜率 +1
;如果让自己的数值从 1 → 0
,或者让对手的数值从 0 → 1
,则自己的胜率 -1
;如果既不改变自己的数值,也不改变对手的数值,则自己的胜率不变。显然,游戏结束时,胜率越高的一方获胜。
结论二:
当 cnt1
为奇数,cnt2 = 0
时,先手必胜。
证明:
模拟一下可以发现先手后手走的每一步都必然是让自己胜率增加的一步。由于 cnt1
为奇数,所以先手可以比后手多走一步,所以先手的胜率必然会比后手高。
那么什么情况下必然会使自己的胜率减少呢?即当自己的数值为 1
,且对手的数值为 0
,且公共数列中只有 1
可以选取时。
结论三:
谁的胜率率先减少,则谁必败。
证明: 由于一方胜率减少了,所以可得公共数列中只有 1
可以选取,没有 0
可以选取。
设胜率率先减少的 Alice
,那么此时 Alice
和 Bob
的数值只有两种可能:
Alice
的数值为0
,Bob
的数值为0
;Alice
的数值为1
,Bob
的数值为1
。
由于 Alice
和 Bob
的数值相同,所以公共序列中使用的 1
的个数必然为偶数,剩余的 1
的个数必然为奇数。且此时是 Bob
先手,根据结论二,Bob
必胜,Alice
必败,证明完毕。
那么谁的胜率会先减少的呢?
结论四:
当 cnt1
、cnt2
为奇数时且 cnt1 > 1
时,先手的胜率会率先减少。
证明: 当 cnt2
为奇数时,先手第一步只能选取 0
或是 1
:
- 若先手先取
1
则后手取0
。此时先手的数值为1
,后手的数值为0
。为了不让自己的胜率降低,先手只能取0
,而后手也接着取0
。由于0
个为奇数,所以先手将率先无法取0
,只能取1
,使得自己的胜率降低。 - 若先手取
0
则后手也取0
。此时场面还是1
的个数为奇数,0
的个数为奇数的情况。若先手率先取了1
,则就回到了上述的情况,先手必败。所以先手只能不断取0
,而后手也跟着不断取0
。最后先手取完0
,将剩余奇数个1
,回到了结论三的情况。由于此时到了后手的轮次,所以先手必败。
结论五:
当 cnt1 = 1
时,先手必胜。
证明略。
根据上述五个结论,模拟一遍即可。
复杂度为 O(22 ∑ i=1 Tni)
。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];signed main() {int T = 1;cin >> T;while(T--) {int n, sum = 0, ans = 0;cin >> n;// 读取输入并计算异或和for(int i = 1; i <= n; i++) {cin >> a[i];sum ^= a[i];}// 结论1:如果异或和为 0,则平局if (!sum) {cout << 0 << '\n';continue;}// 对每一位进行分析for (int j = 20; j >= 0; j--) {int one = 0, zero = 0;// 统计当前位上的1和0的数量for (int i = 1; i <= n; i++) {if (a[i] >> j & 1) one++;else zero++;}// 结论2 如果当前位有奇数个1,则确定胜负if (one & 1) {if (zero % 2 && one != 1) ans = -1; //结论4 不满足条件,Bob 获胜else ans = 1; // 满足条件,Alice 获胜break;}}cout << ans << '\n'; // 输出结果}return 0;
}
幸运数字的个数(预计算)
样例输入
6
1 10
1 16
1 17
10 100
100 1000
1000 10000
样例输出
10
15
16
11
13
14
说明
对于所有评测数据:
1 ≤ T ≤ 1 0 5 , 1 ≤ l i ≤ r i ≤ 1 0 12 。 1≤T≤10^5,1≤l_i ≤r_i≤10^{12} 。 1≤T≤105,1≤li≤ri≤1012。
要用到的思想是先“离线”预计算所有可能的幸运数字,再用二分查找快速计算每个查询区间内的幸运数字数量。具体做法如下:
先枚举所有“十六进制中由同一字符重复”的数字,排除超过 10^12 的值,并将这些数字存储到一个数组并排序;
对每次给定的范围 [l, r],使用二分查找定位区间上下界,从而快速统计落在该区间内的幸运数字个数。
#include <bits/stdc++.h>
using namespace std;static const long long MAX_VAL = 1000000000000LL; // 1e12// 预先生成所有在 [1, 1e12] 范围内 "十六进制由同一数字重复" 的幸运数字
// 注意:digit 取值范围是 [0..15],长度取值范围适当即可(1~16足够覆盖1e12)
vector<long long> generateLuckyNumbers() {vector<long long> luckyNums;// 十六进制最大可用字符:0~f (共16个)for (int digit = 0; digit < 16; ++digit) {for (int length = 1; length <= 16; ++length) {// 构建长度为 length 的重复字符// 例如若 digit = 12 (十六进制 c),length = 4,则是"cccc"// 然后转为十进制,判断是否 <= 1e12// digit 转成对应的16进制字符char hexDigit;if (digit < 10) {hexDigit = char(digit + '0');} else {hexDigit = char(digit - 10 + 'a');}// 构建重复串string hexStr(length, hexDigit);// 转成十进制// stoll(hexStr, nullptr, 16) 有可能超范围,用更安全方式// 这里用 64位整型计算long long num = 0;for (char c : hexStr) {// digitVal 可以用 c - '0' 或 c - 'a' + 10// 但我们已经知道是同一个字符int val;if (isdigit(c))val = c - '0';elseval = c - 'a' + 10;num = num * 16 + val;// 若已经超过范围就中断if (num > MAX_VAL) break;}if (num > 0 && num <= MAX_VAL) {luckyNums.push_back(num);}}}// 去重并排序sort(luckyNums.begin(), luckyNums.end());luckyNums.erase(unique(luckyNums.begin(), luckyNums.end()), luckyNums.end());return luckyNums;
}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);// 预先生成所有可能的幸运数字static vector<long long> luckyNumbers = generateLuckyNumbers();int T;cin >> T;while (T--) {long long l, r;cin >> l >> r;// 在 luckyNumbers 中,用二分查找统计区间 [l, r] 内的元素个数auto leftIt = lower_bound(luckyNumbers.begin(), luckyNumbers.end(), l);auto rightIt = upper_bound(luckyNumbers.begin(), luckyNumbers.end(), r);cout << (rightIt - leftIt) << "\n";}return 0;
}
填空
握手问题
对于第一个人来说 除了自己以外要跟其他49人握手 所以第一个是49 ,对于第二个人来说 第一个人主动跟我握手了 有一次不算 所以第二个是48.。 以此类推 第43个人就是7 到了最后七个人呢 因为互相都没有握手 并且7个人都被前面的人握过手了 所以都是0
#include <iostream>
using namespace std;
int main(){int sum=0;for(int i=7;i<=49;i++) sum+=i;cout<<sum;return 0;
}
报数问题
第1-10个: 20 24 40 48 60 72 80 96 100 120第11-20个:140 144 160 168 180 192 200 216 220 240第21-30个:260 264 280 288 300 312 320 336 340 360第31-40个:380 384 400 408 420 432 440 456 460 480思路一:发现第10个数,第20个数,第30个数,第40个数......(每十个数为一轮)等等都是120的倍数,既然题目要求第202420242024个数,那我们不妨先求第202420242020个数,然后再往后再多求4个数就行。也就是202420242020/10*120=202429042904240,找它之后的四个能被20或24整除的数,也就是2429042904288思路二:通过观察发现,第奇数位个数是20的倍数,第偶数位个数是24的倍数。所以第202420242024个数就是24的倍数,那我们直接除以2(判断是这个数是第几个24的倍数),然后再乘24就行。也就是202420242024÷2×24=2429042904288
二分
123
传送门
1. 小区间的构成
假设数列的构成是如下形式:
- 第 1 个区间包含 1 个元素(
1
)。 - 第 2 个区间包含 2 个元素(
1 2
)。 - 第 3 个区间包含 3 个元素(
1 2 3
)。 - 第 4 个区间包含 4 个元素(
1 2 3 4
)。 - …
第 i
个小区间包含 i
个元素。我们将这些小区间连起来形成整个数列。
2. 数组 a[j]
的定义
数组 a[j]
表示前 j
个小区间的总元素数,同时也能表示每个小区间的和。例如:
a[1] = 1
(表示前 1 个小区间有 1 个元素)a[2] = 1 + 2 = 3
(表示前 2 个小区间共有 3 个元素)a[3] = 1 + 2 + 3 = 6
(表示前 3 个小区间共有 6 个元素)a[4] = 1 + 2 + 3 + 4 = 10
(表示前 4 个小区间共有 10 个元素)
注意,数组 a[j]
是单调递增的,因为每个小区间的元素个数都在增加。
关键点:k = i - a[j]
- 数列中的位置
i
是在第j+1
个区间中的某个元素。 - 前
j
个区间包含了a[j]
个元素,也就是说,第j+1
个区间的第一个元素出现在位置a[j] + 1
。
因此,位置 i
在第 j+1
个区间的具体位置是:
- 第
j+1
个区间的第k
个元素:k
就是位置i
相对于第j+1
个区间开始位置的偏移量。
由于前 j
个区间包含了 a[j]
个元素,第 j+1
个区间从位置 a[j] + 1
开始。所以位置 i
在第 j+1
个区间中的具体位置是:
k = i - a[j]
#include <iostream>
using namespace std;
using ll=long long;
const int N=1414215;ll a[N],s[N];ll persum(ll i)
{ll l=0,r=N;while(l<r){ll mid=(l+r+1)>>1;if(a[mid]<i)l=mid;else r=mid-1;}return s[l]+a[i-a[l]];
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);for(int i=1;i<N;i++){a[i]=a[i-1]+i;s[i]=s[i-1]+a[i];}int t;cin>>t;while(t--){ll l,r;cin>>l>>r;cout<<persum(r)-persum(l-1)<<endl;}return 0;
}
双指针
小齐的奶牛配对挤奶计划
样例输入
3
1 8
2 5
1 2
样例输出
10
评测数据规模
1 ≤ M ≤ 1 , 000 , 000 , 000 , M 为偶数, 1 ≤ N ≤ 100 , 000 1≤M≤1,000,000,000,M 为偶数,1≤N≤100,000 1≤M≤1,000,000,000,M为偶数,1≤N≤100,000
#include <bits/stdc++.h>
using namespace std;/*问题描述:给定若干组输入 (x, y),表示有 x 头奶牛,其挤奶产量为 y。这些 input 的 x 之和为 M(总奶牛数,且 M 为偶数)。将所有 M 头奶牛分成 M/2 对,并行挤奶时的总耗时,取决于所有配对 (A, B) 的挤奶时间 A+B 的最大值。目标是找到所有可能配对中,使 max(A+B) 最小的方案,并输出这个值。解决思路(双指针):1. 将每种产量 y 与其数量 x 记录下来,并按照 y 升序排序。2. 设置两端指针:left 指向最小产量,right 指向最大产量。3. 每次取尽可能多的奶牛对,数量为 min(左侧剩余奶牛数, 右侧剩余奶牛数)。4. 该批次配对的时间为 left 产量 + right 产量,用其更新全局最大值。5. 逐步减少两侧数量并移动指针,直至全部奶牛被配对完成。时间复杂度主要在对产量排序上,为 O(N log N),其中 N 最多为 100000(不按单头奶牛数量计)。
*/int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int N;cin >> N;// 记录 (y, x)vector<pair<long long, long long>> cows;cows.reserve(N);long long totalCount = 0; // 用于计算奶牛总数 Mfor (int i = 0; i < N; ++i) {long long x, y;cin >> x >> y;cows.push_back({y, x});totalCount += x;}// 按产量升序排序sort(cows.begin(), cows.end(), [](auto &a, auto &b){return a.first < b.first;});// 双指针:l 指向产量最小,r 指向产量最大int l = 0, r = (int)cows.size() - 1;long long res = 0;while (l <= r) {if (l == r) {// 剩余都在同一个产量上// 这时必然剩余的奶牛数为偶数,可以两两配对// 配对时间为 2 * cows[l].first// 但实际只需要一次就能给出最终答案res = max(res, 2LL * cows[l].first);break;}// 本轮可以配对的奶牛数long long num = min(cows[l].second, cows[r].second);// 对应配对时间long long sumTime = cows[l].first + cows[r].first;res = max(res, sumTime);// 扣除配对过的奶牛数cows[l].second -= num;cows[r].second -= num;// 如果左侧产量用完,则左指针右移if (cows[l].second == 0) {++l;}// 如果右侧产量用完,则右指针左移if (cows[r].second == 0) {--r;}}cout << res << "\n";return 0;
}
卓儿探寻全球变暖
样例输入
5 3
1 3 5 1 3
0 2 4
样例输出
1 2 1
1 ≤ n , d ≤ 1 0 5 , 1 ≤ h i ≤ 1 0 9 1≤n,d≤10^5,1≤h_i≤10^9 1≤n,d≤105,1≤hi≤109
暴力做法
变量含义:
• n 表示大楼数量,d 表示要查询的天数。
• 数组 h 存储每栋大楼的高度,数组 t 存储每个查询日对应的海平面高度。
• 布尔数组 st 标记某天是否“未被淹没”(true 为未淹没)。
对每个查询日的处理:
(1) 将大楼中高 <= 当前海平面的全部标记为 false(表示已淹没)。
(2) 随后扫描所有大楼,累积计算未淹没大楼所形成的连续“区域”数量:
- 如果遇到一段连续的 true(未淹没大楼),则算作一个区域;
- 当连续的 true 被一个 false(淹没大楼)打断时,再出现下一段 true 时,就会有一个新的区域。
(3) 将最终区域数输出。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;// h[] 用于存储每栋大楼的高度
// t[] 用于存储不同查询日的海平面高度
// st[] 用于标记某栋大楼今日是否仍未被淹没
vector<int> h(N);
vector<int> t(N);
bool st[N];int main() {int n, d;// 输入 n(大楼数量)和 d(查询天数)cin >> n >> d;// 读取大楼高度for (int i = 1; i <= n; i++) {cin >> h[i];}// 读取查询海平面天数数组for (int i = 1; i <= d; i++) {cin >> t[i];}// 将 st[] 初始化为 true,表示初始默认所有大楼都未被淹没memset(st, true, sizeof(st));// 对每个查询天数分别进行处理int region = 0; // 表示当前查询日下,未淹没大楼所形成的区域数量for (int i = 1; i <= d; i++) {int day = t[i]; // 当前海平面高度region = 0; // 每次查询前重置区域数bool flag = false; // 标记是否在扫描大楼时已经遇到一个“连续未淹没区域”// 1) 更新 st[j]: 若大楼高度 <= 当前海平面,则标记为已被淹没 (false)for (int j = 1; j <= n; j++) {if (h[j] <= day) {st[j] = false;}}// 2) 统计当前未淹没楼形成的连续区域数for (int j = 1; j <= n; j++) {if (st[j]) {// 如果此楼未淹没并且尚未记录一个新区域,则区域数加一if (!flag) {region++;flag = true; // 进入新区域}} else {// 如果此楼已被淹没,则结束之前的未淹没区域标记flag = false;}}// 输出当日的区域数cout << region << " ";}return 0;
}
双指针+排序
- 首先,将所有大楼 (高度, 下标) 按高度从小到大排序,便于后续根据海平面高度逐步淹没。
- 随后,有一个双指针循环:当海平面上升到 t[i] 时,就把所有高度 ≤ t[i] 的大楼“标记”为淹没(分别存储到 drown[i] 列表)。
- 利用一个布尔数组 st[] 来标记下标为 x 的大楼是否已被淹没;给 0 与 n+1 这两个“边界”强制设为已淹没状态(true),方便识别某大楼左右是否都是淹没状态。
- 遍历 drown[i],对于每一个新淹没的大楼 x:
• 若 x 左右均尚未淹没,则此次淹没会把原来的一个区域分割成两个,因此区域计数 ans 增加 1。
• 若 x 左右均已经淹没,则原先的两个淹没区在 x 处“连接”为一个区,区域计数 ans 减少 1。
• 最后将 x 标记为已淹没。 - 每次处理完后,输出当前 ans 值,即此刻剩余未淹没大楼的整体区域数量。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;bool st[N];
int main() {int n, d;cin >> n >> d;vector<pair<int,int>>h(n+1);// h[]数组存储(大楼高度, 其原始下标),下标从1开始使用for (int i = 1; i <= n; i++) {cin>>h[i].first;// 读入大楼高度h[i].second=i; // 存储对应的原始位置}// t[]数组存储每个查询的海平面高度(总共有d次查询)vector<int> t(d);for (int i = 0; i < d; i++) {cin >> t[i]; // 读入第i次查询的海平面高度}// 将 h 中的大楼数据按高度升序进行排序sort(h.begin() + 1, h.end());// drown[i]存储在第i次查询中「新被淹没」的大楼下标vector<vector<int>>drown(d);// 双指针:i遍历查询,j遍历大楼列表// 若 h[j+1].first <= t[i] => 说明该楼在第i次查询时已经被淹没// 则记录其位置到drown[i]中表示本轮新增被淹没的楼for (int i = 0, j = 0; i < d; i++) {while (j + 1 <= n && h[j + 1].first <= t[i]) {j++;drown[i].emplace_back(h[j].second);}}// st[x]用于标记下标为x的楼是否已被淹没// 在边界0和n+1处设置为true,方便判断左右是否淹没st[0] = true; // 边界视为已淹没st[n + 1] = true; // 边界视为已淹没int ans = 1; // 当前未淹没的大楼形成的区域数,初始设为1// 遍历每个查询,将在该日新增被淹没的楼进行处理for(auto &u:drown){// u中存储了本次查询“刚好在海平面下”的大楼索引for(auto x:u){// 情况1:若左右都未被淹,则淹没x会把一个连续区域分成两部分 => 区域数 +1if(!st[x-1]&&!st[x+1]){ans+=1;}// 情况2:若左右都已淹,则淹没x会将两个淹没区“连接”,相当于减少一个区域 => 区域数 -1if (st[x - 1] && st[x + 1]) {ans -= 1;}st[x]=true;}cout<<ans<<" ";}return 0;
}
相关文章:
蓝桥杯题型
蓝桥杯 蓝桥杯题型分类语法基础艺术与篮球(日期问题)时间显示(时间问题)跑步计划(日期问题)偶串(字符)最长子序列(字符)字母数(进制转换)6个0&…...
用Python分割并高效处理PDF大文件
在处理大型PDF文件时,将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区,它可以提高处理效率,并使分析或操作文档变得更容易。在本文中,我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...
DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元
背景 在全球人工智能技术高速迭代的背景下,算力成本高企、异构资源适配复杂、模型部署效率低下等问题,始终是制约企业AI规模化应用的关键。 DeepSeek以创新技术直击产业痛点,而博云先进算力管理平台AIOS的全面适配,则为这一技术…...
顶点着色器和片段着色器
在Unity渲染中,**顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工:想象你要画一幅由三角形组成的3D模型,顶点…...
Uniapp打包H5端弱网络环境下存在页面UI渲染错乱问题方案实现
一.需求 uniapp打包的H5项目,首页模块的业务逻辑偏多,调用的接口数量庞大,在弱网络的情况下切换了页面或者网络较好但是页面的UI未渲染完成的情况下快速地切换了页面会出现UI渲染错乱的问题,针对该问题个人从两个方面来进行处理&…...
Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)
Dify部署参考:Dify Rag部署并集成在线Deepseek教程(Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装) DifyDeepSeek - Excel数据一键可视化(创建步骤案例)-DSL工程文件(可直接导入&#x…...
## DeepSeek写水果记忆配对手机小游戏
DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件: 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…...
Windows系统编程(八)线程同步
线程安全问题 每个线程都有自己独立的堆栈,局部变量是存储在栈中的,这就意味着每个线程都会有一份自己的局部变量,当线程仅仅访问自己的局部变量时就不存在线程安全问题。但是全局变量是存储在全局区的,多线程共享全局变量&#…...
create_react_agent 函数,根据创建的 chat 模型实例和工具列表 tools 构造一个“反应式代理”(react agent)
graph create_react_agent(chat, tools)1. create_react_agent 函数的作用 create_react_agent 是一个工厂函数,它接收两个参数: chat 模型实例(这里是 ChatOpenAI 的对象):它负责生成语言模型的回复,也…...
Unity ECS与MonoBehaviour混合架构开发实践指南
一、混合架构设计背景 1. 技术定位差异 ECS(Entity Component System):面向数据设计(DOD),适用于大规模实体计算(如10万单位战斗) MonoBehaviour:面向对象设计&#x…...
在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持
由于移动端GPU规模有限,厂商并没有实现完整的OpenGL特性,而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台,最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备ÿ…...
「DataX」数据迁移-IDEA运行DataX方法总结
背景 业务需求希望把Oracle数据库中的数据,迁移至MySql数据库中,因为需要迁移全量和增量的数据,所以希望想用数据迁移工具进行操作。 经过一些调研查询,最终打算使用DataX进行数据的迁移。 DataX简单介绍 DataX 是阿里云 DataW…...
python从入门到精通(二十六):python文件操作之Word全攻略(基于python-docx)
python文件操作之word技巧大全 word技巧基础到高级操作大全A.准备工作1. 安装python-docx库2. 导入库 B.基础操作1. 创建Word文档1.1 创建文档对象1.2 添加word标题1.3 添加word段落1.4 设置段落样式1.5 创建有序列表1.6 创建无序列表1.7添加word分页1.8 添加word图片1.9 添加w…...
STM32 ST-LINK Utility 切换 NRST_MODE 后下载失败问题
在使用 STM32 ST-LINK Utility 烧录时,有需要改变芯片选择复位的时候需要修改 Option Bytes 中的 NRST_MODE 选项,可能会遇见 “Programming error 0x8000200!” 的错误,后面不管是取消读写加密还是复位都不能下载,包括再用 keil …...
【算法】010、合并两个有序链表
【算法】010、合并两个有序链表 文章目录 一、合并两个有序链表1.1 思路1.2 多语言解法 一、合并两个有序链表 1.1 思路 // go package mainimport ("fmt""strconv" )type ListNode struct {Val intNext *ListNode }func (n *ListNode) String() (ans s…...
FreeRTOS任务状态查询
一.任务相关API vTaskList(),创建一个表格描述每个任务的详细信息 char biaoge[1000]; //定义一个缓存 vTaskList(biaoge); //将表格存到这缓存中 printf("%s /r/n",biaoge); 1.uxTaskPriorityGet(…...
Django小白级开发入门
1、Django概述 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。 Django 框架的核心组件有: 用于创建模型的对象关系映射为最终用户设计较好的管理界面URL 设计设计者友好的模板…...
R语言的基础命令及实例操作
> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中,大小写是敏感的,也就是说…...
通用信息抽取大模型PP-UIE开源发布,强化零样本学习与长文本抽取能力,全面适配多场景任务
背景与简介 信息抽取(information extraction)是指,从非结构化或半结构化数据(如自然语言文本)中自动识别、提取并组织出结构化信息。通常包含多个子任务,例如:命名实体识别(NER&am…...
【玩转正则表达式】将正则表达式中的分组(group)与替换进行结合使用
在文本处理和数据分析领域,正则表达式(Regular Expressions,简称regex)是一种功能强大的工具。它不仅能够帮助我们匹配和搜索字符串中的特定模式,还能通过分组(Grouping)和替换(Subs…...
Kotlin和Java区别
哈哈哈,前段时间,面试的时候,突然问到我Kotlin和Java的区别,一下子把我问懵逼了,确实没遇到问这个的,想了下,说了下Kotlin的编译时空检查机制,代码更简洁,很多封装好的AP…...
大语言模型进化论:从达尔文到AI的启示与展望
文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…...
Django系列教程(5)——Django模型详解
目录 模型定义小案例 模型的组成 模型的字段 基础字段 关系字段 on_delete删除选项 related_name选项 模型的META选项 模型的方法 标准方法 示例一:自定义方法 示例二:自定义Manager方法 完美的高级Django模型示例 小结 Model (模型) 简而…...
2008-2024年中国手机基站数据/中国移动通信基站数据
2008-2024年中国手机基站数据/中国移动通信基站数据 1、时间:2008-2024年 2、来源:OpenCelliD 3、指标:网络类型、网络代数、移动国家/地区、移动网络代码、区域代码、小区标识、单元标识、坐标经度、坐标纬度、覆盖范围、测量样本数、坐标…...
Java在word中动态增加表格行并写入数据
SpringBoot项目中在word中动态增加表格行并写入数据,不废话,直接上配置和代码: 模板内容如下图所示: 模板是一个空word表格即可,模板放在resources下的自定义目录下,如下图示例。 实体类定义如下: @Data @AllArgsConstructor @NoArgsConstructor public class Person …...
记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)
文章目录 记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…...
JavaScript基础-比较运算符
在JavaScript编程中,比较运算符用于比较两个值,并返回一个布尔值(true或false),这对于我们进行条件判断和逻辑控制至关重要。掌握这些运算符不仅有助于编写高效的代码,也是处理复杂逻辑的基础。本文将详细介…...
2025 docker安装TiDB数据库
1.确保安装了docker和docker-compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod x /usr/local/bin/docker-compose2.编写 Docker Compose 文…...
【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程
智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台(Intelligent AI Travel Recommendation Platform)是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...
【定制开发】碰一碰发视频系统定制开发,支持OEM
在短视频营销爆发的2025年,"碰一碰发视频"技术已成为实体商家引流标配。某连锁餐饮品牌通过定制化开发,单月视频发布量突破10万条,获客成本降低80%!本文将深入解析该系统的技术架构与开发要点,助你快速搭建高…...
模型的原始输出为什么叫 logits
模型的原始输出为什么叫 logits flyfish 一、Logarithm(对数 log) 定义:对数是指数运算的逆运算,表示某个数在某个底数下的指数。 公式:若 b x a b^x a bxa,则 log b ( a ) x \log_b(a) x logb…...
YOLOv8改进SPFF-LSKA大核可分离核注意力机制
YOLOv8改进------------SPFF-LSKA 1、LSAK.py代码2、添加YAML文件yolov8_SPPF_LSKA.yaml3、添加SPPF_LSKA代码4、ultralytics/nn/modules/__init__.py注册模块5、ultralytics/nn/tasks.py注册模块6、导入yaml文件训练 1、LSAK.py代码 论文 代码 LSKA.py添加到ultralytics/nn/…...
Unity, AssetBundle的一些“隐藏”方法
只分享实战,理论不多说了,网上都烂大街了 在Project View可以通## 标题过输入“b:” 找到所有带assetbundleName的物件 AssetBundle打包前的查找和管理方法 若需要获取 每个AssetBundle名称对应的所有具体资源文件路径(类似AssetBundle Browser工具的功能),可以…...
分布式存储学习——HBase概述
1.1 HBase概述 1.1.1 理解大数据背景 1.1.2 HBase是什么 1.1.3 HBase与Hadoop的关系 1.1.4 HBase的核心功能模块 1.1.5 HBase的应用场景和经典案例 1.1.6 小结 本文参考于学校《HBase应用于开发》教材 1.1 HBase概述 本节将介绍大数据背景和HBase的基本概念,…...
Mysql表的复合查询
1.基本查询 使用scott案列 ----来源csdn: Mysql下-scott用户表的创建_风泊月mysql 员工表-CSDN博客 案列1:查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大小的J 查询雇员,从emp表中查询,s…...
RAG技术的PDF智能问答系统
关键要点 系统基于RAG(检索增强生成)技术,允许用户上传PDF并进行智能问答。 使用Ollama的deepseek-r1模型和FAISS向量数据库,支持普通对话和基于PDF的问答模式。 提供简洁的Web界面,支持文件拖拽上传和多轮对话。 研…...
【Java基础-52】Java中URL类的openConnection()方法:原理与应用场景
在Java编程中,java.net.URL类是一个非常重要的类,用于表示统一资源定位符(URL)。通过URL类,我们可以方便地访问网络资源。其中,openConnection()方法是URL类中一个非常强大的方法,它允许我们与U…...
android为第三方提供部分系统接口
文章目录 Settings - 亮灭屏Settings - 恢复出厂设置Settings - 数字锁屏/解锁Settings - 设置系统时间PackageInstaller - 安装/卸载第三方应用摘要:本文对系统模块进行改造,提供广播等形式的接口对外提供无法直接调用的系统级别接口,实现部分功能的集合。如果是广播形式,…...
C#控制台应用程序学习——3.8
一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库,C# 程序可以方便地调用这些类库来实现各种功能,如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如,它使用…...
钣金加工行业数字化转型MES方案
一、 行业痛点:钣金加工行业普遍面临以下挑战: 订单多样化、小批量、定制化需求增多:传统生产模式难以适应快速变化的市场需求。 生产流程复杂、工序繁多:涉及切割、折弯、焊接、表面处理等多个环节,协同效率低。 生产…...
算法-回溯算法总结
回溯与递归的区别 回溯的本质是穷举,回溯一定代表有递归 递归就一直往深处递归就好了,但是回溯还伴随着递归结束之后的”回溯操作“,例如递归中处理的1,在回溯中要-1。 回溯的算法思路 一般都是返回void,参数不能一下子全部想定…...
ORACLE 执行查询语句慢(不走对应索引)
1. 索引未被创建或未正确创建 确保为查询中涉及的列创建了索引。例如,如果你经常需要按column_name列进行查询,确保已经为该列创建了索引,索引创建语句 CREATE INDEX idx_column_name ON table_name(column_name); 2、索引不可用 原因:索引可能被标记为不…...
零售交易流程相关知识(top-down拆解)
引入 关于POS机交易时的后台数据交互 模块之间数据交换,都可以能被窃取或篡改。由此引入加密、解密机制和签名、验签机制 经典的加密、解密机制: 对称加密:DES\ TDES\ AES\ RC4 非对称加密:RSA\ DSA\ ECC 经典的签名、验签…...
在人工智能软件的帮助下学习编程实例
1 引言 本文记录在人工智能软件的帮助下学习一种全新的编程环境的实例,之所以提人工智能软件而不是单指DeepSeek,一方面DeepSeek太火了,经常服务器繁忙,用本机本地部署的最多运行70b模型,又似乎稍差。另一方面也作为一…...
C语言_数据结构总结5:顺序栈
纯C语言代码,不涉及C 想了解链式栈的实现,欢迎查看这篇文章:C语言_数据结构总结6:链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯: 1. 就是遇到代码哪里不理解的,你就问豆包,C知道&a…...
c++ 游戏入门指南
在C++游戏开发中,你需要结合高性能编程、图形学、数学和游戏设计等多方面的知识。以下是C++游戏开发的核心步骤、工具和资源整理,帮助你从入门到进阶: 1. 开发环境搭建 编译器:MSVC(Visual Studio)、GCC、Clang。IDE:Visual Studio(Windows)、JetBrains CLion(跨平台…...
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
1、在 vscode 终端执行 get-ExecutionPolicy 返回 Restricted 状态是禁止的 返回 RemoteSigned 状态是可正常执行npm命令 2、更改状态 set-ExecutionPolicy RemoteSigned 如果提示需要管理员权限,可加参数运行 Set-ExecutionPolicy -Scope CurrentUser RemoteSi…...
STM32项目分享:智能家居语音系统(ASRPRO版)
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: STM32智能家居语音系统(ASRPRO版&am…...
vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components
1.使用ant-design-vue或者element-ui时,如何每个组件都去import导入组件,大大降低了开发效率,如果全局一次性注册会增加项目体积,那么如何实现既不局部引入,也不全局注册? 2.在element-plus官网看到有说明…...
前端安全面试题汇总及参考答案
目录 简述 XSS 攻击的原理及三种常见类型(存储型、反射型、DOM 型) 如何在前端防御 XSS 攻击?列举编码、过滤、CSP 策略的具体实现方式 富文本编辑器场景下如何安全处理用户输入的 HTML 内容? 如何通过 HttpOnly 属性增强 Cookie 安全性?它与 XSS 防御的关系是什么? …...