ABC370 Review
ABC 370 Review
A
模拟题,过
B
模拟题,过
C
很明显的贪心思路是把需要更改的字母分为两类:改大和改小。
首先我们要明确的是要让输出的串尽量拥有小的字典序,且字典序比较的第一关键字是位置,第二是长度
所以对于改小的部分,改的位置越靠前我们就放在越前面操作;
对于改大的部分,改的位置越靠前我们反而放在越后面操作;
这样排序下来就会是最优的。
D
考试的时候打了一个链表发现假了,根本无法维护现有的。
想起之前做过一道
简单来说就是通过二分查找
以前的知识
set<int> s; s.size(); s.count(int val); s.lower_bound(int val); s.erase(auto it/int val);
新学到的知识
vector<set<int>> s(n);可以预先声明大小 auto erase = [&](int x, int y) { h[x].erase(y); l[y].erase(x); }; 可以创建闭包在主函数使用临时函数 用 erase(x,y) 的格式调用 prev(it) 可以查找当前迭代器的上一个位置的迭代器(begin()小心越界)
其他都没有什么需要注意的地方了
更优秀的解法
运用
想起来之前 2022绵阳CCPC 有一道水题也是给定
但是这道题中被摧毁的点仍有可能在以后被查询到,所以链表就不适用了。
但有一种普适的算法就是 并查集
注意这个题需要维护四个方向上的并查集,还要判断有没有出界,部分代码如下:
int fa_l[N],fa_r[N],fa_u[N],fa_d[N]; inline bool check(int x,int y) { return 1<=x&&x<=n&&1<=y&&y<=m; } inline int get_l(int x,int y) { if(!check(x,y))return -1; if(!vis[x][y])return y; return fa_l[y]=get_l(x,fa_l[y]); }
E
连续区间划分问题
很明显的可以写出一个
for(int i=1;i<=n;++i) { if(sum[i]!=k)dp[i]=1; for(int j=1;j<i;++i) { if(sum[i]-sum[j]!=k)dp[i]+=dp[j]; } }
这样做必定会超时,那么想办法把第二维度优化掉。
我们在对当前的
考虑到每个
可以将其试做一个二元组
中间那段注释掉的
本文来自博客园,作者:Hanggoash,转载请注明原文链接:https://www.cnblogs.com/Hanggoash/p/18403332
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效