1408E Avoid Rainbow Cycles

概述

非常有趣的题目(指解法,不难,但很难想)

非常崇拜300iq,今天想做一套div1时看见了他出的这套题Grakn Forces 2020,就立马开始补这套题,果然不出我所料,全是iq题(误

题目

m个set中有1-n的一些数,首先我们可以把一个数 j 从set i 中删除,代价是 \(a[i]+b[j]\) ,至于为什么要删除之后再说

接着我们对于每个set i,\(\forall x,y \in i\),建边\((x,y)\)并染色为 \(i\) 。

最后我们定义\(Rainbow Cycle\)为从某个节点x 出发,经过一个回路能够重新回到x 且,回路中的边颜色两两各不相同

问题是求出最小的删除费用使得图中没有\(RainbowCycle\)

题解

核心:建图跑最小生成树

建图方式:数 \(j\) 在set \(i\) 里就建一条边\((n+i,j)\) ,这样实际上每个\(x,y\)在set里的都已经联通了,\(RainbowCycle\) 其实就变成了新图里的一条普通回路

问题就很明显了,一个没有环的图且删边费用最小就是最大生成树

总结

给\((x,y)\)边染色为\(z\),可以增加一个新节点\(n+z(防止点重复)\) ,建两条边\((x,n+z),(n+z,y)\) 这样方便对边进行操作

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+10;
int pre[N],tot=0;
ll a[N],b[N];
struct E
{
int x,y;
ll val;
E(int x1,int y1,ll val1){
x=x1;y=y1;val=val1;
};
E(){
x=y=val=0;
};
}edge[2*N];
bool cmp(E x,E y)
{
return x.val>y.val;
}
int find(int x)
{
if(pre[x]==x) return x;
else return pre[x]=find(pre[x]);
}
int merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy) return 0;
pre[fx]=fy;
return 1;
}
int main()
{
int n,m;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) scanf("%lld",&a[i]);
for(int j=1;j<=n;j++) scanf("%lld",&b[m+j]);
for(int i=1;i<=m+n;i++) pre[i]=i;
for(int i=1;i<=m;i++){
int x;scanf("%d",&x);
for(int j=1;j<=x;j++){
int y;scanf("%d",&y);
E cnt(i,m+y,a[i]+b[m+y]);
edge[++tot]=cnt;
}
}
sort(edge+1,edge+tot+1,cmp);
ll res=0;
for(int i=1;i<=tot;i++){
E cnt=edge[i];
int x=cnt.x,y=cnt.y;
if(merge(x,y)){
continue;
}
else{
res+=cnt.val;
//cout<<x<<' '<<y<<' '<<cnt.val<<endl;
}
}
printf("%lld\n",res);
}

CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)的更多相关文章

  1. Grakn Forces 2020 ABCDE题解

    看到老外评论区中说,这场的难度估计是\(div.1\)和\(div.1.5\)的合并 A. Circle Coloring #构造 题目链接 题意 给定三个长度为\(n\)数组\(a,b,c\),要你 ...

  2. Grakn Forces 2020

    比赛链接:https://codeforces.com/contest/1408 A. Circle Coloring 题意 给出三个长为 $n$ 的序列 $a,b,c$,对于每个 $i$,$a_i ...

  3. Effective Objective-C [上]

    网上看到的 http://esoftmobile.com/2013/08/10/effective-objective-c/ 本文是针对<Effective Objective-C>一书的 ...

  4. ios中strong和weak的解释理解

    来自stackoverflow解释的挺有意思的 Imagine our object is a dog, and that the dog wants to run away (be dealloca ...

  5. A million requests per second with Python

    https://medium.freecodecamp.com/million-requests-per-second-with-Python-95c137af319 Is it possible t ...

  6. Linux内存管理 (15)页面迁移

    专题:Linux内存管理专题 关键词:RMAP.页面迁移. 相关章节:反向映射RMAP.内存规整. 页面迁移的初衷是为NUMA系统提供一种将进程迁移到任意内存节点的能力,后来内存规整和内存热插拔场景都 ...

  7. Effective Objective-C [下]

    http://esoftmobile.com/2013/08/17/effective-objective-c-2/ Chapter 6: Blocks and Grand Central Dispa ...

  8. Objective-C Properties

    Objective-C Properties Apple introduced properties, a combination of new compiler directivesand a ne ...

  9. apache ignite系列(八):问题汇总

    1,java.lang.ClassNotFoundException Unknown pair 1.Please try to turn on isStoreKeepBinary in cache s ...

随机推荐

  1. 第3.8节 Python百分号占位符的字符串格式化方法

    一.    概念         格式化字符串就是将一些变量转换为字符串并按一定格式输出字符串,包括指定字符的位置.对齐方式.空位补充方式等.Python提供了多种字符串格式设置方法.本节先介绍一种简 ...

  2. 老猿学5G扫盲贴:中国移动的5G计费架构解读

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 在<老猿学5G扫盲贴:3GPP中的 ...

  3. PyQt(Python+Qt)学习随笔:QMainWindow的splitDockWidget方法将QDockWidget停靠窗分割排列

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 主窗口的splitDockWidget方法用于将一个停靠窗占据的空间分 ...

  4. Python函数学习遇到的问题

    Python函数的关键字参数 Python函数独立星号(*)分隔的命名关键字参数 Python函数中的位置参数 Python中对输入的可迭代对象元素排序的sorted函数 Python中函数的参数带星 ...

  5. java8+ Lambda表达式基本用法

    LIST public class LambdaTest { @Getter @Setter @AllArgsConstructor static class Student{ private Lon ...

  6. react路由初探(2)

    对着官网的例子反正是没有搞出来,所以搜了一大堆,最终搞出来了,记录一下 import React from 'react'; // 首先我们需要导入一些组件... (这个是中文网示例,按这个做,报一大 ...

  7. 手把手教你写DI_3_小白徒手支持 `Singleton` 和 `Scoped` 生命周期

    手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期 在上一节:手把手教你写DI_2_小白徒手撸构造函数注入 浑身绷带的小白同学:我们继续开展我们的工作,大家都知道 Si ...

  8. AcWing 392. 会合

    一个思路不难,但是实现起来有点毒瘤的题. 显然题目给出的是基环树(内向树)森林. 把每一个基环抠出来. 大力分类讨论: 若 \(a, b\) 不在一个联通量里,显然是 \(-1, -1\) 若 \(a ...

  9. 九、git学习之——git基本命令全总结

    初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit,完成. ...

  10. Consul 多数据中心下的服务注册发现与配置共享

    1. Consul简介   Consul是HashiCorp公司推出的开源软件,它提供了一套分布式高可用可横向扩展的解决方案,能为微服务提供服务治理.健康检查.配置共享等能力.   Eurake2.x ...