打击犯罪(black)

2024-05-16 10:20
文章标签 black 打击犯罪

本文主要是介绍打击犯罪(black),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线上OJ:

一本通:1386:打击犯罪(black)

核心思想:

1、如果按照题意,从1~k的顺序进行删除(枚举),则每次枚举完都要重置并查集,比较麻烦。

2、考虑逆向思维不从1 ~ k 顺序删除,而是从 n ~ k 逆序往图中添加

a. 如果添加到 k 时,最大集合的元素数量不超过 n/2 ,则说明k还可以继续减小

b. 如果添加到 k 时,最大集合的元素数量开始超过 n/2,则这个 k 点不能加入,也就是说:这个k点必须删除

备注:这个点k就是题目要求的k的最小值。因为把k删除后,最大集合的元素数量不超过 n/2;如果把比k大的元素删除,更加不会超过n/2。

3、初始化每个节点时,除了初始化p[i]=i,还要初始化cnt[i] = 1,表示 i 所在集合的元素的数量仅为自己。

4、由于是逆序把 k 添加进图(图中只有比k大的点),所以在分析k 的边时,只考虑已经在图中的点(即e[k][j] > k的点)

5、如果点k和点e[k][j] 尚不在一个集合中,则合并根节点,并更新根节点所在集合的元素数量(此处不需要更新每个点的cnt,只需更新根节点的cnt,因为后续的累加也只拿根节点来累加)

题解代码:
#include <bits/stdc++.h>
using namespace std;const int N = 1005;int n, p[N], cnt[N]; // p[i]表示 i 的根节点;cnt[i] 表示 i 所在集合的元素的数量
int e[N][N]; // e[i][0] 存储 i 有几条边;e[i][1] 存储 i 的第 1 条边连接的点... e[i][j] 存储 i 的第 j 条边连接的点int find(int x)  // 找根节点
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){p[i] = i;  // 初始化每个元素的根节点为自己(即每个元素都是独立的)cnt[i] = 1;// 初始化时,每个元素所在的集合都只有自己,所以 cnt 均为 1}// 读入数据,建立边for(int i = 1; i <= n; i++){scanf("%d", &e[i][0]); // 先存入i号节点边的数量for(int j = 1; j <= e[i][0]; j++)scanf("%d", &e[i][j]); // 再存入 i 的第 j 条边连接的点}// 核心代码:逆向处理,每次把 k 加入图中,并看新加入点导致的集合数量是否超过n/2for(int k = n; k >= 1; k --)  {for(int j = 1; j <= e[k][0]; j++)  // 分析与k相连的每一个点{if(e[k][j] > k)  // 由于是逆向把点加入图中。所以只有编号 >k 的点当前才在图中,才需要合并{int x = find(k), y = find(e[k][j]);if(x != y) // 如果点k和点e[k][j] 尚不在一个集合中{p[y] = x;  // 则合并根节点cnt[x] += cnt[y]; // 更新根节点所在集合的元素数量(此处不需要更新每个点的cnt,只需更新根节点的cnt,因为后续的累加也只拿根节点来累加)if(cnt[x] * 2 > n){printf("%d\n", k);return 0;}}}}}return 0;
}

这篇关于打击犯罪(black)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994630

相关文章

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

HDU1312 Red and Black

大致题意:搜索邻接字符到底有多少个 #define LOCAL#include <iostream>#include <fstream>using namespace std;const int maxn = 20 +1;char maze[maxn][maxn];int dx[4] = {0, 1, 0, -1};int dy[4] = {1, 0, -1, 0};int sum;

EOS black灵魂回响黑色无法联机/联机报错/联机失败怎么办

灵魂回响黑色EOS black中的职业系统,自由度非常高。从人物属性的精细调整,到装备属性的独特搭配,再到技能的个性化组合,每一步都充满了无限可能。更为惊喜的是,游戏中的角色职业不是一成不变的,而是随着手中武器的变换而灵动转变。 这款游戏也是很适合叫上朋友一起玩,不过有玩家表示在游戏过程中遇到了EOS black灵魂回响黑色联机报错/联机失败/无法联机等类似联机问题。我们来看看有没有比较

灵魂回响黑色EOS Black账号注册预创建角色+游戏客户端下载教程

新的一款MMORPG游戏:灵魂回响黑色已经在今天早上的11点正式开服了,游戏特色在于可以大规模的合作以及pvp游玩,而且游戏还可以支持离线状态下的游玩,这款游戏是前作灵魂回响的续作,在保留了前作玩法基础上,还添加了许多奇幻风的元素在游戏中,给玩家们带来了许多惊喜,同时游戏还优化了引擎,给玩家们带来了更加极致的游戏画面。 下面我给很多不了解游戏的玩家带来账号注册预创建角色+游戏客户端下载教

EOS Black灵魂回响黑色账号注册 EOS Black怎么注册账号教程

又一款新的MMORPG游戏即将上线,游戏名称叫做《灵魂回响:黑色》,游戏继承了《灵魂回响》系列的基本世界观和背景故事,从危险中救出来的阿尔卡纳们沉醉于权力开始堕落, 少数阿尔卡纳还没有忘记自己的本分,为净化世界而努力,去挖掘真相。另外,《灵魂回响:黑色》还支持打破服务器壁垒的世界服务器规模的PvP战斗模式和大规模攻城战。 游戏将在6月20号上线开始游玩,游戏还有一个很有意思的设定,我们打败其他玩

hdu 1442 Black Box

hdu 1442 Black Box 执行两种操作  ADD 和GET操作   ADD就是往数列中加数  GET就是获取当前数列中第i大的数(i的值为当前执行GET的次数) ADD操作和GET操作交错进行  给出ADD和GET操作的个数 以及每次ADD操作的数  GET操作的时间 答案输出执行GET操作时得到的值 这题主要的是要输出当前数组第K大的值    用两个优先队列对ADD的数进

black-box setting黑盒环境

“Black-box setting” 是一个术语,通常用于描述在机器学习、计算机安全和其他技术领域中的一种情况或设置。 定义和解释: 在技术和研究上,“black-box setting” 指的是对一个系统或模型的操作者来说,该系统或模型的内部工作机制是未知或不透明的。具体来说,这意味着操作者只能通过输入和输出的交互来观察系统的行为,而不能直接访问或了解系统的内部结构、算法或参数。 特点和

Codeforces #247 (Div. 2) A. Black Square

水题一道,4分钟AC 代码如下: #include <cstdio>#include <iostream>#include <algorithm>#define MAXN 100010#define ll long longusing namespace std;int a[MAXN];int main(void) {for(int i=1; i<=4; ++i) {cin >>

hdoj1312 Red and Black--深度优先搜索

分析:深度优先搜索 #include<stdio.h>#include<string.h>#include<limits.h>int map[22][22]; //存储int w,h,max=INT_MIN;int dx[]={0,1,0,-1},dy[]={-1,0,1,0};//定义方向,(-1,0)左移动,(1,0)右移动,(0,-1)上移动,(0,1)下移动void dfs(in

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作:SD卡烧录工具入门书籍推荐:BeagleBone cookbookBeagleBone概况? 重要路径 官方例程及脚本路径:/var/lib/cloud9BeagleBone Cookbook例程路径:/var/lib/cloud9/BeagleBone/Black/Cookb