关押罪犯 codevs 1069(整理:加权并查集?+虚点并查集+二分图染色)

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化 **摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。 阅读详情

go to the problem

题目描述 Description

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极

不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨

气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之

间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并

造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,

然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,

如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在

两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只

要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那

么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是少?

输入描述 Input Description

第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。

接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证,且每对罪犯组合只出现一次。

输出描述 Output Description

共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱

中未发生任何冲突事件,请输出0。

样例输入 Sample Input

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

样例输出 Sample Output

3512

数据范围及提示 Data Size & Hint

罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件

影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】

对于30%的数据有N≤ 15。

对于70%的数据有N≤ 2000,M≤ 50000。

对于100%的数据有N≤ 20000,M≤ 100000。

1.普通并查集(设虚点)

根据题目描述,我们的第一个反应一般都是用并查集把罪犯分到两个监狱。
但是问题是并查集只能维护并判断元素是否属于一个集合,并不能直接划分出两个集合。所以我们采用设虚点的方法,虚拟出两个监狱来。
对于罪犯i,设i+n为他的虚点(双胞胎 ???平行时空???)。
先把输入的罪犯组合按照他们的仇恨值从大到小排序,每次把两个罪犯分到两个监狱,直到不能再分了为止,此时的仇恨值便是最终的答案。
由于我们并不知道这个罪犯具体被分到那个监狱,所以每次分时就把x与y+n分到一个监狱,x+n与y分到一个监狱就行了。判断时判断x与y,x+n与y+n.

代码

#include<iostream>
#include<cstdio>
#include<cstring> 
#include<algorithm>
#include<cmath>
using namespace std;

int N,M;
int fa[20050<<1];

struct maple{
    int a,b,c;
    bool operator <(const maple &a)const{
       return a.c<c;
    }
}a[100010];
int find(int x)
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=2*N;++i) fa[i]=i;
    for(int i=1;i<=M;++i)
       scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
    sort(a+1,a+M+1);
    for(int i=1;i<=M;++i)
    {
        int x=find(a[i].a),y=find(a[i].b),X=find(a[i].a+N),Y=find(a[i].b+N);
        if(x!=y&&X!=Y)
        {
            fa[x]=Y;
            fa[y]=X;
        }   
        else 
        {
            cout<<a[i].c;
            break;
        }
    }
    if(M==1) cout<<0;
    return 0;
}

2.加权并查集 ???

之所以带问号是因为我也不能确定这到底是不是加权并查集,网上的代码也很少(*/ω\*)。。。并不打算粘代码。。。

对于这个题,有些人采用了和食物链0,1,2一样的神奇做法。

设一个数组num,规定num[i]=0表示i和fa[i]在同一个监狱,1表示i和fa[i]不在同一个监狱。
每次找父亲时同时计算num[i]的值,一样的,最后num[i]为i与根节点的关系。

计算公式为 num[i]=(num[i]+num[fa[i]]+num[fa[fa[i]]]+…+num[root])%2;

int find(int x)
{
     if(fa[x]==x) return x;
     int Fa=find(fa[x]);
     num[x]=(num[x]+num[fa[x]])%2;
     return fa[x]=Fa;
}

别的思想与1一样,但是判断时要同时判断两个罪犯的根节点和他们与根节点的关系,合并时也要注意更改根节点的num值。

if(x==y&&num[a[i].a]==num[a[i].b])
{
    cout<<a[i].c;
    break;
}
else
{
    fa[x]=y;
    num[x]=(num[a[i].a]+num[a[i].b]+1)%2;
}

3.二分答案+二分图染色

对每组罪犯组合建边。
把仇恨值排序后二分答案。
只保留仇恨值大于答案的边进行二分图染色Bfs,一个点染成黑色,另一个点染成白色,如果可以完成染色,则调整右边界,如果不行,则调整左边界。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;

int N,M,a,b,c,cnt,mid;
int First[20050],Next[200010],color[200010],q[200010];
int used[20050];
struct maple{
    int f,t,d;
    bool operator <(const maple &a)const{
       return d<a.d;
    }
}Per[200010]; 

void Build(int f,int t,int d)
{
    Per[++cnt]=(maple){f,t,d};
}
bool check(int t)
{
    int head=0,tail=1;
    color[t]=1;
    q[tail]=t;
    used[t]=1;
    while(head<tail)
    {
        ++head;
        for(int i=First[q[head]];i;i=Next[i])
            if(Per[i].d>Per[mid].d)  // 大于这个仇恨值的都被分到两个监狱 
               if(!used[Per[i].t])
               {
                  q[++tail]=Per[i].t;
                  color[Per[i].t]=color[q[head]]^1; // 染成不同颜色 
                  used[Per[i].t]=1;
               }
               else if(color[Per[i].t]==color[q[head]]) return false;
    }
    return true;
}
bool ok()
{
    memset(used,0,sizeof(used));
    memset(color,0,sizeof(color));
    for(int i=1;i<=N;++i)
      if(!used[i])
          if(!check(i)) return false;
    return true;  
}
int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        Build(a,b,c);
        Build(b,a,c);
    }
    sort(Per+1,Per+cnt+1);
    for(int i=1;i<=cnt;++i)
    {
        Next[i]=First[Per[i].f];
        First[Per[i].f]=i;  
    }
    int l=0,r=2*M;
    while(l+1<r)    
    {
        mid=(l+r)>>1;
        if(ok()) r=mid;
        else l=mid;
    }
    if(r!=1)cout<<Per[r].d;
    else cout<<0;
    return 0;
}

Ps:以后要不要考虑写点别的博客2333_(:з」∠)_

rk3588 LightSensor适配从驱动到应用层 本文详细介绍了在RK3588平台上实现光感驱动的开发流程。主要包括:1) 在设备树中配置I2C5接口挂载光感设备;2) 编写内核驱动代码实现光感数据采集;3) HAL层通过ioctl与驱动交互;4) 在BoardConfig.mk中启用相关宏定义;5) Framework层通过AutomaticBrightnessController实现自动亮度调节算法;6) 应用层可通过监听系统设置获取光感变化并调整屏幕亮度。整个流程涵盖了从底层驱动到上层应用的完整实现方案,重点解决了光感设备注册、数据采集传输和自动亮度 阅读详情

相关推荐

学习Python,小白如何搭建Python环境?

学习Python,首先需要搭建好Python环境,主要分为【运行环境搭建】、【开发环境搭建】以及【Python环境配置】三个环节,接下来我将对Python环境搭建这三个部分进行介绍。

weixin_72923265的博客 9001

并查集 虚拟节点

并查集 虚拟节点 最近学到并查集,遇到了 UVA11987 Almost Union-Find这个经典问题。此时就需要用到虚拟节点这个概念,但是看了很多博客都没怎么理解,今天把自己想法记录一下。 题目描述 输入两个元素 p 、 q ,如果 p 、q 不在一个集合中,合并这两个元素所在的集合。 输入两个元素 p 、 q ,如果 p 、q 不在一个集合中,将 p 添到 q 所在的集合。 输入一个元素 p ,查询 p 所在的集合的大小和元素和。 其中,1和3的操作通过并查集都可以很容易的实现,但是并查集不具有

qq_30108019的博客 374

一文告诉你:如何在trae中编译运行GD32程序,并让AI帮你修改代码

本文详细介绍了如何将GD32程序如何用官方固件库构建出来,然后从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 2661

并查集+虚点 [NOI2001]食物链(洛谷 P2024)

[NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。 现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这 N 个动物所构成的食物链关系进行描述: 第一种说法是 1 X Y,表示 X 和 Y 是同类。 第二种说法是 2 X Y,表示 X 吃 Y 。 此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假

不知所云的博客 387

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2000

京瓷扫描驱动安装_京瓷喷头拆解和供墨原理剖析

在工业喷头打印领域,京瓷喷头作为主流喷头广泛应用于喷墨行业,目前京瓷喷头市面上销售主要有两个系列:KJ4A和KJ4B。其中KJ4A系列设计是用于油性墨水,例如UV墨水,主要用在广告领域;而KJ4B设计用于水性墨水,例如活性、分散墨水等,主要用在数码印花领域。最近我们团队对京瓷喷头进行了拆解分析,本期和大家分享一下我们对京瓷喷头拆解和喷头供墨原理的研究。京瓷喷头介绍1. KJ4A系列(油性)如下图所...

weixin_39883906的博客 1672

食物链(并查集)(POJ - 1182)【建立虚点】

题目描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地说出K句话...

K_Code_的博客 285

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

hdu 2473 (并查集 删除操作)

Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5110    Accepted Submission(s): 1629 Problem Description Recogniz

勿忘初衷 3553

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 179

深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略

本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。

郑伟强dev的专栏 172

虚点+并查集 [BOI2003]团伙(洛谷P1892)

[BOI2003]团伙 题目描述 1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是: 我朋友的朋友是我的朋友; 我敌人的敌人也是我的朋友。 两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。 输入格式 输入文件gangs.in的第一行是一个整数N(2<=N<=1000),...

不知所云的博客 287

GraphRAG深度解析:架构设计与实战案例

生成模块结合检索到的图数据和用户输入的查询,生成高质量的文本输出。通过结合图数据库中的知识,模型可以更准确地回答用户的问题,提供更优质的客户服务。通过分析用户的行为和偏好,结合图数据库中的知识,模型可以为用户提供个性化的推荐。:通过图数据库存储和检索结构化的知识,为语言模型提供丰富的背景信息,提升生成内容的质量和准确性。:选择合适的图数据库,如Neo4j、OrientDB等,以支持高效的图数据存储和检索。:利用图数据库的高效检索能力,快速找到与用户查询最相关的图元素,提高系统的响应速度。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1591

【NOIP2010】关押罪犯 虚点并查集

CODEVS:http://codevs.cn/problem/1069/ 题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极 不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被

Qantun_Mechanics的博客 1694

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

UVA 11987 Almost Union-Find (虚点+并查集)

#include<bits/stdc++.h> using namespace std; #define rep(x,y,z) for(int (x)=(y);(x)<(z);x++) #define mst(x,y) memset(x,y,sizeof(x)) #define ll long long const int maxn=1e5+10; const int maxk...

满月照亮的路 281

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NOIP2010关押罪犯(并查集之构造虚点 C++)

NOIP2010关押罪犯 总时间限制: 1000ms 内存限制: 65536kB 描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c的罪犯被关押在同一监狱,他们俩之间会...

qq_42995099的博客 619

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

codevs 1069 关押罪犯 (虚点并查集)

题目链接思路:首先很容易想到,先按怒气值从高到低排序,然后一个个取出来,分成两拨,这样就能使最后的结果尽量小。这样看来就要维护两个集合,但是事实上并查集不是用来分割集合的。因此,可以用到虚点的概念,给每个罪犯都建立要给虚点,而这个虚点是跟自身对立的,意思就是假如A和B要分开,就把A和B’放入一个集合,把A’和B放入一个集合,来表示AB是分开的(也能理解为A和B的敌人是一伙的,即敌人的敌人就是朋友)...

JasonWu的博客 403

NOIP--关押罪犯(并查集)

问题 C: 关押罪犯时间限制: 1 Sec  内存限制: 128 MB提交: 94  解决: 32[提交][状态][讨论版][命题人:admin]题目描述S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨...

sher杨的博客 3243

noip关押罪犯 并查集做法

1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪

too_young -_-|| 3231

关押罪犯(prison.pas/cpp/in/out)

关押罪犯(prison.pas/cpp/in/out)   题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并

呼啦啦呼啦啦 3022

HDU - 2473 Junk-Mail Filter(并查集删点,虚点设置)

为每个结点设置映射,合并操作在映射上进行,删除操作相当于给当前结点换一个映射。 int n,m; int mp[MX],f[MX],vis[MX];//mpÐé½áµã int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } signed main() { int _=0; while(scanf("%d %d",&am...

欢迎光临 我的心 214

NOIP2010 Codevs 1069 关押罪犯 [并查集] [二分图判定]

1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程

C'est la vie. 663

并查集(删除节点)

删除节点,就是把原先的节点设置为虚点,然后把点的位置用num数组指向新的位置。#include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<set> using namespace std; typedef long long ll; int num[10005],fa[300005]; int _f

__water 2433

HDU-4829 Information(带权可删并查集+虚点)

题意 有 NNN 个坦克,完成以下 MMM 种操作: 1.1.1. AAA BBB XXX YYY 表示 AAA 坦克移动到了与 BBB坦克的相对位置是 (X,Y)(X,Y)(X,Y) 的地方,即 xA=xB+X,yA=yB+YxA=xB+X,yA=yB+Yx_A=x_B+X,y_A=y_B+Y。 2.2.2. AAA XXX YYY 表示 AAA 坦克移动到了绝对位置是 (X,Y...

Paulliant的博客 324

codevs1069 关押罪犯 [并查集]

1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极 不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正

NULL 714

PAT A1069/B1019 The Black Hole of Numbers

题目难度:一颗半星 题目大意:一个数字,排成最大的数字和最小的数字,求差,然后用差继续做该运算,打印出得到6174的步骤,如果相同,输出规定的样式。 题目坑点:其实没坑点,就是数值转换到数组中,然后再把数组中的数字变成数字而已。 代码如下: #include<iostream> #include<stdlib.h> #include<queue> #includ...

weixin_42302528的博客 552
上一篇: codevs 1155 金明的预算方案(背包)
下一篇: csdn 的友链设置
Loi_Mapleleaf
博客等级 码龄10年 17粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值