图论之欧拉回路、差分约束——算法笔记比赛
欧拉回路无向代码1:
1234567891011void dfs(int x){ while(f[x]<to[x].size()){ int y=to[x][f[x]].first,idx=to[x][f[x]].second; f[x]++; if(!vis[idx]){ vis[idx]=vis[idx^1]=1; dfs(y); c[++l]=y; } }}
无向代码2:
1234567int x=0,y=0,z=0;for(int i=1;i<=n;++i){ if(d[i]&1)x=i,++y;}if(y&&y!=2){ cout<<"Impossible"<<endl;}
有向题目:
12345678910111213141516171819202122232425262728293031323334353637383940#inclu ...
第 $22$ 届浙大宁波理工学院程序设计大赛题解A. 字符串按照题意模拟即可,如果想要省掉代码量可以开个 std::vector<std::pair<char, int>> ve(n) 前一个记录字符,后一个记录当前的下标,直接进行升序排序,然后直接从k+1个开始输出。 提供排序的代码。
12345678910111213141516171819202122void clearlove13(void){ int n, k; std::cin >> n >> k; std::string s; std::cin >> s; std::vector<std::pair<char, int>> ve(n); for (int i = 0; i < n; i++) { ve[i] = std::make_pair(s[i], i); } std::sort(ve.begin(), ve.end()); std ...
P14702 [ICPC 2024 Tehran R] Boat 题解题目传送门
贪心,细节较多。
思路分析先特判无解情况。
提示
如果某个重量大于最大载重量 $w$,输出 −1,结束。
如果最轻的两个人重量之和超过了 $w$,即无人可以当船夫,输出 −1,结束。
否则一定有解,尽量让两人配对上船,为了用最少次数,先 sort 从小到大排序,再让最轻的人作为船夫,分为两种情况:
如果 $a_i+a_1 \leq w$,可以和最轻的人一起上船,可载两人。这样运送要 $2$ 次,$ans \leftarrow ans+2$。
否则,不可以和最轻的人一起上船,只载一人。这样运送要 $4$ 次,$ans \leftarrow ans+4$。
最后船夫不回来,所以输出 $ans-1$。
代码按思路写即可,注意细节,这里不放了。
结语感谢您的阅读!
P14731 [ICPC 2022 Seoul R] Parentheses Tree
题目传送门
前置知识STL 中的 stack 容器提供了一众成员函数以供调用,其中较为常用的有:
定义
头文件 $\color{green}\textbf{<stack>}$。
元素访问
st.top() 返回栈顶。
修改
st.push() 插入传入的参数到栈顶。
st.pop() 弹出栈顶。
容量
st.empty() 返回是否为空。
st.size() 返回元素数量。
部分内容来自 栈 - OI Wiki。
总体分析核心:用栈匹配括号并在叶节点累加距离。
思路引导提问如何对左括号进行判断是否为叶节点?
成功当 $s_i$ 为 ( 时,如果栈非空,将栈顶替换为 false,再将 true 入栈。
提问如何将答案进行累加?
成功当 $s_i$ 为 ) 时,如果栈顶 ( 是叶子节点,先累加栈内元素数量,再弹出栈顶。
警告不开 long long 见祖宗。
核心代码1234567891011121314151617cin>>s;for(c ...
追忆我常常追忆过去。
生命瞬间定格在脑海。我将背后的时间裁剪、折叠、蜷曲,揉捻成天上朵朵白云。
云朵之间亦有分别:积云厚重,而卷云飘渺。生命里震撼的场景掠过我的思绪便一生无法忘怀,而更为普通平常的记忆在时间的冲刷下只留下些许残骸。追忆宛如入梦,太过清楚则无法愉悦自己的幻想,过分模糊却又坠入虚无。只有薄雾间的山水,面纱下的女子,那恰到好处的朦胧,才能满足我对美的苛求。
追忆总在不经意间将我裹进泛黄的纸页里。分别又重聚的朋友,推倒又重建的街道,种种线索协助着我从一个具体的时刻出发沿时间的河逆流而上。曾经的日子无法重来,我只不过是一个过客。但我仍然渴望在每一次追忆之旅中留下闲暇时间,在一个场景前驻足,在岁月的朦胧里瞭望过去的自己,感受尽可能多的甜蜜。美好的时光曾流过我的身体,我便心满意足。
过去已经凝固,我带着回忆向前,只是时常疏于保管,回忆也在改变着各自的形态。这给我的追忆旅程带来些许挑战。
我该在哪里停留?我问我自己。
P14730 [ICPC 2022 Seoul R] Palindrome Type 题解
纯享阅读区题目传送门
总体分析核心:修改字符串 $s$ 使其成为回文串,记最小次数为 $k$,如果 $k\leq3$,输出 $k$,否则输出 -1 。
因此,可以从 $k=0\sim3$ 依次进行 DFS 搜索,只要有一次成功,输出 $k$,结束。
思路引导提问如何 DFS 搜索修改过程算出 $k$?
DFS 函数使用 双指针。
当 $l<r$ 时:
如果左指针 $l$ 和右指针 $r$ 对应的 $s_l=s_r$,那么这部分已经是回文的,$l$ 向右移,$r$ 向左移。
否则:
如果剩余次数 $step=0$,无法继续修改,返回无法完成。
如果删除 $l+1$ 或 $r+1$ 可完成,返回可以完成。
否则返回无法完成。
返回无法完成。
警告如果 $k\leq 3$ 都不可以,最后输出 -1 。
核心代码12345678910111213bool dfs(int l, int r, int step){ while(l< ...
AT_joi2024_yo1c_b 桁 (Digit)题解题目传送门
题目大意给出 $a, b$,求 $a+b$ 的位数。
思路引导提问如何统计 $a+b$ 的位数?
成功我们将 $a+b$ 转化为字符串函数大法好,输出 $a+b$ 的长度即可。
核心代码12345678910#include<bits/stdc++.h>using namespace std; int a, b; int main() { cin>>a>>b; cout<<to_string(a+b).size();//需使用洛谷IDE中C++14 (GCC 9)及以上版本,蓝C++会CE return 0;}
CF2139B Cake Collection 题解(全题解区最短代码)安利一下博客 🥳🎆🎉祝大家 2026 新年快乐!
纯享阅读区
题意分析核心:用 $m$ 秒去拿 $n$ 个烤好的蛋糕,要拿的尽量多。用 贪心 算法。
思路引导
如何保证能选到最好的方案? 对数组 $a$ 从大到小进行排序,如果 $n \le m$,则可以把所有烤箱中的蛋糕都拿一遍,生产蛋糕越多的越晚拿,且后面会给出证明:早拿一次再晚拿一次和直接晚拿一次一样,不如直接晚拿一次简单。否则 $n>m$,就直接拿排序后最好($a_i$ 较大)的烤箱中的蛋糕,同样,生产蛋糕越多的越晚拿。
综上,取个 $\min {n, m}$ 即可。 从大到小进行排序不用手写 cmp 了!使用 greater<int>() 可以直接大到小进行排序。 示例代码:
1sort(a+1,a+n+1,greater<int>());//对数组 a 从大到小进行排序
如何证明早拿一次再晚拿一次同一个烤箱,和直接晚拿一次一样? 证明: 设早拿的时间为 $p_1$,晚拿的时间为 $p_2$,烤箱每秒 ...
前提拥有一个 Github 的账号和博客仓库。
领取域名注册Github前往 Github 注册账号。
DigitalPlat Domains前往 Digitalplat 注册账号,完整人名、电话号码、完整地址等信息不用填写真实的,可以在 美国身份生成器 生成。注册完成后会发一封验证到邮箱。登录后需要 KYC 验证(使用 Github 账号即可)。验证成功后会显示这个页面。
获取书接上回,点击左侧 注册。
Digitalplat 于 2026/3/20(文章发布约一周后) 左右更新 UI 和页面交互,文章中获取部分截图为旧版,可能无法对应位置,但操作基本相同。
Update: 本文章已更新至最新。
引用站外地址
旧版存档
点击查看旧版
引用站外地址
...
















![题解:P14702 [ICPC 2024 Tehran R] Boat](/img/2026/top_img1.webp)
