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

leetcode 3607. 电网维护 中等

给你一个整数 c,表示 c 个电站,每个电站有一个唯一标识符 id,从 1 到 c 编号。

这些电站通过 n 条 双向 电缆互相连接,表示为一个二维数组 connections,其中每个元素 connections[i] = [ui, vi] 表示电站 ui 和电站 vi 之间的连接。直接或间接连接的电站组成了一个 电网 

最初,所有 电站均处于在线(正常运行)状态。

另给你一个二维数组 queries,其中每个查询属于以下 两种类型之一 

  • [1, x]:请求对电站 x 进行维护检查。如果电站 x 在线,则它自行解决检查。如果电站 x 已离线,则检查由与 x 同一 电网 中 编号最小 的在线电站解决。如果该电网中 不存在 任何 在线 电站,则返回 -1。

  • [2, x]:电站 x 离线(即变为非运行状态)。

返回一个整数数组,表示按照查询中出现的顺序,所有类型为 [1, x] 的查询结果。

注意:电网的结构是固定的;离线(非运行)的节点仍然属于其所在的电网,且离线操作不会改变电网的连接性。

示例 1:

输入: c = 5, connections = [[1,2],[2,3],[3,4],[4,5]], queries = [[1,3],[2,1],[1,1],[2,2],[1,2]]

输出: [3,2,3]

解释:

  • 最初,所有电站 {1, 2, 3, 4, 5} 都在线,并组成一个电网。
  • 查询 [1,3]:电站 3 在线,因此维护检查由电站 3 自行解决。
  • 查询 [2,1]:电站 1 离线。剩余在线电站为 {2, 3, 4, 5}
  • 查询 [1,1]:电站 1 离线,因此检查由电网中编号最小的在线电站解决,即电站 2。
  • 查询 [2,2]:电站 2 离线。剩余在线电站为 {3, 4, 5}
  • 查询 [1,2]:电站 2 离线,因此检查由电网中编号最小的在线电站解决,即电站 3。

示例 2:

输入: c = 3, connections = [], queries = [[1,1],[2,1],[1,1]]

输出: [1,-1]

解释:

  • 没有连接,因此每个电站是一个独立的电网。
  • 查询 [1,1]:电站 1 在线,且属于其独立电网,因此维护检查由电站 1 自行解决。
  • 查询 [2,1]:电站 1 离线。
  • 查询 [1,1]:电站 1 离线,且其电网中没有其他电站,因此结果为 -1。

提示:

  • 1 <= c <= 10^5
  • 0 <= n == connections.length <= min(105, c * (c - 1) / 2)
  • connections[i].length == 2
  • 1 <= ui, vi <= c
  • ui != vi
  • 1 <= queries.length <= 2 * 10^5
  • queries[i].length == 2
  • queries[i][0] 为 1 或 2。
  • 1 <= queries[i][1] <= c

分析:先用一个并查集,把所有处于同一个电网的电站放到一个集合里。对于每个不同的电网,设置若干个优先队列,把属于同一个电网的所有电站按照从小到大的顺序存储起来。再用一个标记数组,记录每个电站是否断网。

完成预处理后遍历查询数组,当查询为类型 1 时,首先检查该电站是否离线,如果没有离线,则答案为该电站自己的编号;如果离线,从它所在电网的优先队列中,不断检查队列第一个元素是否在线,如果不在线则让它出队,找到第一个没断电的电站作为答案,如果该电网中所有电站都离线了,答案记录为 -1。当查询类型为 2 时,先把标记数组中的对应位置标记为断电,退队操作只有在查询的时候才进行。

class Solution {
int findfat(int *fat,int ind)
{if(fat[ind]!=ind){int pos=findfat(fat,fat[ind]);fat[ind]=pos;return pos;}return ind;
}
public:vector<int> processQueries(int c, vector<vector<int>>& connections, vector<vector<int>>& queries) {int fat[100010],flag[100010];for(int i=1;i<=c;++i)fat[i]=i,flag[i]=1;for(int i=0;i<connections.size();++i){int x=min(connections[i][0],connections[i][1]),y=max(connections[i][0],connections[i][1]);if(findfat(fat,x)!=findfat(fat,y))fat[fat[y]]=fat[x];}for(int i=1;i<=c;++i)fat[i]=findfat(fat,i);priority_queue<int,vector<int>,greater<int>>que[100010];for(int i=1;i<=c;++i)que[fat[i]].push(i);vector<int>ans;for(int i=0;i<queries.size();++i){if(queries[i][0]==1){int x=queries[i][1],father=fat[x];if(flag[x])ans.push_back(x);else{int pos=-1,f=0;while(!que[father].empty()){pos=que[father].top();if(flag[pos]){f=1;break;}else que[father].pop();}if(f)ans.push_back(pos);else ans.push_back(-1);}}else flag[queries[i][1]]=0;}return ans;}
};

http://www.dtcms.com/a/578956.html

相关文章:

  • 【分层强化学习】#1 引论:选项框架与半马尔可夫决策过程
  • 鄂州网站建设哪家专业高端网站设计欣赏
  • 上海专业做网站公司有哪些网站域名邮箱
  • 如何做销售直播网站国外免费服务器申请
  • 从“零”构建零售EDI能力:实施路径与常见陷阱
  • 从零开始刷算法-单调栈-每日温度
  • 建设银行网银网站h5制作网页
  • 免费金融发布网站模板wordpress移动端顶部导航栏
  • 成都公司做网站西安做网站公司玖佰网络
  • 网站制作交易流程网站建设方案平台选择
  • 如何给网站划分栏目高端建站的公司
  • 做酱菜网站一元云淘网站开发
  • 柳州建网站互联网销售公司起名
  • 中信云 做网站公司注册地址是什么
  • 创业网站模板建设邯郸网站
  • 普中51单片机学习笔记-前言
  • 网站建设案例教程试卷优化网站改版
  • 网站建设的要点是什么意思网站建设工程师
  • 局域网问题排查手册
  • 【Java SE 基础学习打卡】01 计算机概述
  • MySQL 联合索引设计中字段顺序、区分度与优化器行为详解
  • 百度推广的网站怎么做哪些网站是做数据分析的
  • 家居装修企业网站源码个人网站方案建设书
  • 南阳网站推广价格青州哪里做网站
  • LMCache 实现细节与数据流转完全解析
  • codeforces1997(div.3)E F
  • linux下navicat无限重置试用期方法
  • vllm部署Qwen3-14B命令行参数配置详解
  • 数据库风险监测专题:让隐蔽的风险“看得见、控得住”
  • 做网站美工排版5种可以给网站带来流量的方式