当前位置: 首页 > news >正文

【周赛刷题】平衡树+图中最短环

2612. 最少翻转操作数(平衡树)

在这里插入图片描述
在这里插入图片描述
题目的难度有一部分在于数学推导。对于某个点 iii 进行反转是有一个范围的,这个范围需要考虑到边界的情况。可以的得到的一个结论是。对于窗口反转,KaTeX parse error: Expected group after '^' at position 4: i+i^̲' = R+L

并且在c++中可以用到有序set的一些特性的,在实现上是一个红黑树。比如我们可以使用upper_bound()lower_bound()。这两者返回的都是迭代器,其中lower_bound( )函数返回指向第一个大于等于给定值的元素的迭代器, upper_bound( ) 函数返回指向第一个大于给定值的元素的迭代器。

class Solution {
public:vector<int> minReverseOperations(int n, int p, vector<int>& banned, int k) {// [max(k-1-i, i-k+1), min(2n-1-k-i, i+k-1)]set<int> st[2];// 初始化vector<int> ans(n, -1);queue<int> q;q.push(p); ans[p] = 0;unordered_set<int> ban;for (int x:banned){ban.insert(x);ans[x] = -1;}// 考虑到奇偶性,维护两颗平衡树for(int i = 0;i<n;i++){if(i!=p && !ban.count(i)){st[i%2].insert(i);}}while(!q.empty()){int cur = q.front();q.pop();int l = max(k-1-cur, cur-k+1);int r = min(2*n-1-k-cur, cur+k-1);// 如果不加 & 就会复制一份,导致超时// 并不是复制,而至直接拿到引用set<int>& cur_st = st[l%2];auto it = cur_st.lower_bound(l);// 对于迭代器的使用// 1. 首先需要知道lower_bound得到是一个迭代器// 2. 如果得不到合适的,就返回end,因此我们需要判断下// 3. 对于迭代器的取值,需要用*while(it != cur_st.end()){int cur_v = *it;if(cur_v > r) break;ans[cur_v] = ans[cur]+1;q.push(*it);// 对于set常用的函数 insert(), erase()it = cur_st.erase(it);}}return ans;}
};

2608. 图中的最短环

在这里插入图片描述
这可能是一个模板题目,实现一个最短的环。

基本的思路有两种,都是基于bfs进行操作。一个是删除边,一个是删除点。都是需要枚举起始点。

对于删除边,就对于两个连通的边,我们进行bfs操作。对于起点 iii,我们如果能第二次访问到点 iii,就说明存在环,并且bfs的特性保证一定是第一次最短的。

class Solution {
public:int findShortestCycle(int n, vector<vector<int>>& edges) {// 模板构建双向无权图vector<vector<int>> g(n);for (auto &e: edges){int x = e[0], y = e[1];g[x].push_back(y);g[y].push_back(x);}// 初始化一个数组int dis[n];auto bfs = [&](int i){// 初始化一个数组memset(dis, -1, sizeof(dis));dis[i] = 0;queue<pair<int, int>> q;// emplace 方法构造一个对应的pairq.emplace(i, -1);while(!q.empty()){// 使用auto的方法,自动定位正确的cur和fa的类型auto [cur, fa] = q.front(); q.pop();for (int y: g[cur]){if (dis[y] == -1){dis[y] = dis[cur] + 1;q.emplace(y, cur);}else{if (fa == y) continue;return dis[cur] + dis[y] +1;}}}return INT_MAX;};int ans = INT_MAX;for(int i = 0;i<n;i++){ans = min(ans, bfs(i));}return ans==INT_MAX? -1: ans;}
};
http://www.lryc.cn/news/45275.html

相关文章:

  • C++笔记——第十篇 继承 的解析,详细易懂哦
  • SQL Server中的全文搜索
  • 自适应平移混音方法
  • 炼钢厂VR职业技能实训软件,提高员工学习效率和掌握技能速度
  • MySQL数据库范式
  • 通过多层方法重塑网络安全
  • Golang学习+深入(四)-运算符
  • C++ 运算符重载:C++ 运算符重载的高级技巧和最佳实践
  • 软件测试找了2个月了,找不到工作怎么办?
  • 满足高并发的TB API接口接入说明
  • Themis Pro版将正式推出,3次迭代到底在酝酿什么?
  • 边缘检测和轮廓检测
  • 二分法模板以及例题 (三)
  • 向下转型和向上转型(易理解)
  • 华为OD机试用JS实现 -【机智的外卖员】(2023-Q2 押题)
  • 同态加密:一个基于多方计算的CKKS方案
  • 最小生成数
  • 【模板】树状数组
  • 网站都变成灰色了,怎么实现的?
  • NeRF详解
  • Java之静态代码块和静态类、静态导入
  • Python3 File isatty() 、os.chflags()方法
  • 【SH_CO_TMT_PACKAGE保留60天数据和增加索引】
  • 2022蓝桥杯省赛——数位排序
  • 弥散磁共振成像在神经科学中的应用
  • 多进程(python)
  • 利用Kali工具进行信息收集(35)
  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)
  • 实体商家做抖音运营如何做矩阵?
  • java 双列集合Map 万字详解