首页 > 其他分享 >题解 Cow and Snacks

题解 Cow and Snacks

时间:2023-08-20 11:45:13浏览次数:42  
标签:siz fx Cow Snacks int 题解 fa fy find

被黄题创死了2333

题目链接

首先肯定有一个贪心的想法:尽量使得人们拿的花重复,即尽量使得每个人都拿一束花。当然第一个人必须拿两束。

接着思考:如何找出有几个人是必须拿两束花的。

其实很简单,当 \(A,B\) 两人不能通过其他人使得他们的花有联系,比如 \(A\) 喜欢 \(1,2\),\(B\) 喜欢 \(3,4\),那么由于两个人一点联系也没有,所以只能两人都取两束。

但如果还有一人 \(C\) 喜欢 \(2,3\),那么 \(A,B,C\) 就是联系起来的,可以按照 \(A,C,B\) 的顺序取。

那么本质上我们需要描述集合关系,也就是要先判断哪些人的花束会存在联系。这使用并查集就行。

对于一个大小为 \(x\) 的花束集合,一定存在一种顺序,使得第一个人取 \(2\) 束,剩下的人取 \(1\) 束,所以最多容纳 \(x-1\) 个人。

找出所有的集合大小,答案就是 \(k-\sum (x-1)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n,k;
int fa[N],siz[N];

int find(int x) {
    if(x==fa[x]) return x;
    else return fa[x]=find(fa[x]);
}

int main() {
    cin>>n>>k;
    for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
    for(int i=1;i<=k;i++) {
        int x,y; cin>>x>>y;
        int fx=find(x),fy=find(y);
        if(fx!=fy) {
            fa[fx]=fy;
            siz[fy]+=siz[fx];
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++) {
        if(fa[i]==i) sum+=siz[i]-1;
    }
    cout<<k-sum;
    return 0;
}

标签:siz,fx,Cow,Snacks,int,题解,fa,fy,find
From: https://www.cnblogs.com/zhangyuzhe/p/17643777.html

相关文章

  • 8.20题解
    T1sun暴力枚举即可时间复杂度分析:\((lnx)'=\frac{1}{x}\)根据牛顿-莱布尼茨公式可得:\(\sum_{x=1}^{n}{\frac{1}{x}}=\int_{1}^{n}{\frac{1}{x}}=ln(n)-ln{1}=ln(n)\)令\(ln(n)=k\)可得:\(n=e^{k}<=e^{15}\approx3269017\)T2order首先需要理解题意......
  • CF1656D K-good 题解
    CF1656DK-good题解题目大意给出\(t\)个整数\(n\),对于每一个\(n\)找出一个大于等于\(2\)的整数\(k\),使得\(n\)可以表示成\(k\)个mod\(k\)的结果互不相同的正整数之和。\(1\let\le10^5,2\len\le10^{18}\)。题解我们先将题意再次化简,可以得到,我们实际......
  • P9571 Horizon Blue 题解
    P9571HorizonBlue题解这个题拿平衡树写是不是小题大做了咳咳咳进入正题。首先转化一下题意。第一个操作是加入直线,第二个操作就是求所有斜率不等于\(k\)的直线的数量,第三个操作就是删掉所有斜率不等于\(k\)的和所有与该直线重合的直线。感觉这题完全就是FHQ_Treap的......
  • P9572 Colorful Days♪ 题解
    原题链接题目大意:有两个数组\(S\),\(T\),你可以把\(S\)进行复制并接到其后面形成\(S^k\),如\(S\)=123,则\(S^2\)=123123,\(S^3\)=123123123。让你求出\(S^k\)与\(T\)的最长公共子序列以及在最长公共子序列最长时\(k\)的最小值。首先思考如果无视\(k\)最小的要求,最......
  • P4197 Peaks 题解
    P4197Peaks题解题目描述在Bytemountains有\(n\)座山峰,每座山峰有他的高度\(h_i\)。有些山峰之间有双向道路相连,共\(m\)条路径,每条路径有一个困难值,这个值越大表示越难走。现在有\(q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的......
  • P9571 Horizon Blue 题解
    原题链接题目大意:\(有三个操作,分别为\)\(操作1加入一条直线\)\(操作2查询与一条直线相交但不重合的直线条数\)\(操作3删除所有与一条直线相交或重合的直线\)\(注意:后面两个操作的直线并不需要加入\)\(显然,两条直线相交不重合,当且仅当其k值不同\)\(所以可以把所有直线按k......
  • 寻宝 题解
    寻宝题目大意存在\(n\)个点和两种有向边:一类边分\(m\)组,每组的边权相同,从\([s_l,s_r]\)中的所有点连向\([t_l,t_r]\)中的所有点。二类边存在于任意两点\(i,j\)间,从\(i\)连向\(j\)的二类边的边权为\(|i-j|\timesa_i\)。求从点\(1\)到\(n\)的最短路......
  • P9425 [蓝桥杯 2023 国 B] AB 路线 题解
    ~~应该能过官方数据吧~~---回归正题。我开始想过更简单的深搜,但是我怕无法记忆化,所以选择了广搜。和普通的广搜不同,此题的队列要存$3$个维度,分别是$x$,$y$,$z$,分别表示横坐标、纵坐标、目前的步数模$2k$的值。此时我们可以把每$2k$步进行分组,前$k$步走在```A```的格子......
  • 洛谷P5410 【模板】扩展 KMP(Z 函数)题解
    题目链接P5410【模板】扩展KMP(Z函数)-洛谷|计算机科学教育新生态(luogu.com.cn) 分析先考虑z数组设nx[i]为字符串b与b以b[i]开头的后缀最长公共前缀设i为当前需要求的位置当前i+nx[i]-1的最大值所对应的i为q p为i对应的位置当i大于q+nx[q......
  • arc139,arc140,arc141题解
    ARC139A-DATrailingZeros憨的。BMakeN感觉没有那么naive。首先用\(1\)去更新一下后面两个决策的价值。然后有一个较为显然的东西是说\(\text{lcm}\)为周期,周期内应该贪心取最大的。周期外由于范围很小,可以直接枚举一种决策的次数,取最小值即可。复杂度是正确的。CO......