首页 > 其他分享 >P8907 [USACO22DEC] Making Friends P

P8907 [USACO22DEC] Making Friends P

时间:2024-09-20 17:24:26浏览次数:1  
标签:int P8907 long ans 编号 集合 Making Friends

题目

image

思路

我们可以统计出所有点对之间应该有的边的数量然后再减去之前的 \(m\)。

对于每个点维护一个集合,统计该点应该连接的点。

对于每条初始边,我们将其看作从编号小的点连向编号大的点,并在编号小的集合中放入编号大的点。

处理删除 \(i\) 点操作,答案加上目前集合 \(i\) 的大小,表示 \(i\) 在之前一定会与这些点相连;然后求出目前集合 \(i\) 的编号最小的点 \(x\),将所有 \(i\) 集合中的点删除 \(x\) 后放入集合 \(x\) 中,表示 \(x\) 会与这些点相连。

最后将答案减去 \(m\) 即可。

这种做法聪明之处在于,它完美地利用了删点从小到大的性质,将本应该在点 \(i\) 删除时处理的点对,延迟处理。

代码

#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 200010;

int n, m;
set<int> g[N];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        g[min(u, v)].insert(max(u, v));
    }

    int ans = 0;
    for (int i = 1; i <= n; i++) {
        if (!g[i].size()) continue;
        ans += g[i].size();
        int x = *g[i].begin();
        g[i].erase(g[i].begin());
        if (g[i].size() > g[x].size()) swap(g[x], g[i]);
        for (auto y : g[i]) g[x].insert(y);
    }
    ans -= m;
    cout << ans << '\n';
    return 0;
}

标签:int,P8907,long,ans,编号,集合,Making,Friends
From: https://www.cnblogs.com/Yuan-Jiawei/p/18422889

相关文章

  • 老友记台词 第一季 第十七集 Friends 117(全英版)
    文章目录117TheOneWithTwoParts,Part2[Scene:AnEmergencyRoom,RachelandMonicaenter.RachelislimpingandleaningonMonicaforsupport.][Scene:CentralPerk,Chandler,hassplituphisnewspapersoJoeycanlookatthefunnies,whileRoss'......
  • ACCT1101 Accounting for Decision Making
    ACCT1101AccountingforDecisionMakingProblemSetAssessmentType:ProblemSet/sLearningObjectivesAssessed:1,2,3,4DueDate:13September202415:00(3pmBrisbanetime)Weight:25%IndividualTaskDescription:Thisassessmentisbasedonacaseo......
  • CF241B Friends 题解
    是异或粽子的超级加强版,但是本题因为\(m\)很大,不能套用那一题的解法。换一种思路:考虑把\(a_i\)从高位到低位插入0-1Trie之后,二分第\(m\)大,通过第\(m\)大求答案。对于二分的一个值\(x\),枚举每个位置\(i\),在0-1Trie上找与\(a_i\)异或值大于等于\(x\)的值的......
  • 题解:CF1630F Making It Bipartite
    题意图上有\(n\)个点,且具有点权,点权保证互不相同,若两个点点权有倍数关系,则两点之间有一边,问你最少删去多少个点能使图变为二分图。思路因为如果\(a\)是\(c\)的倍数且\(c\)是\(b\)的个数,所以\(a\)是\(c\)的倍数。由此可以看出,若\(a\)与\(b\)相连且\(b\)与......
  • Friends
    注意到这里\(m\)太大了,我们肯定没办法把所有的前\(m\)大的数找出来,所以我们只能先尝试把第\(m\)大的数找出来这里的trick跟上一题一样,先将\(m\)乘以\(2\),但是这里必须二分第\(m\)大的值,设为\(ans\)找到之后我们再统计严格大于\(ans\)的值的和以及数量就可以做了和:预处理\(sum\)......
  • 2024牛客暑期补题 4 I Friends
    新手做题当然会有许多的经验。本人就是蒟蒻(这个题用到map作为预备大二)还没有完全学懂stl但是大体内容学的差不多。用到图论的知识以及set的自动排序和去重以及双指针就可以做。大家要是像我一样水平可以先去看看这几个知识图论看怎么构建set了解一下就行双指针最好去......
  • 题解:CF771A Bear and Friendship Condition
    CF771ABearandFriendshipCondition题解算法并查集,图的基本性质分析题目意思是,一旦有一些点联通,那么这些点必须两两直接相连。换句话讲,就是图中的每个联通块都是完全图。所谓完全图,就是图中的每个点都两两相连,假设一个完全图有\(n\)个点,那么我们可以通过乘法原理算出这......
  • A. Vika and Her Friends
    原题链接题解每次move,两人之间的距离要么-2,要么不变,所以如果两人的距离是奇数肯定抓不到如果两人是偶数,则想要使两人之间的距离不变,必须要往与猎人所在位置相反的方向跑,由于会撞墙,所以经过若干次move之后,两人距离-2是必然发生的,无限次move后,距离一定会为0code#include<bits/s......
  • ACCT2002 Cost Analysis for Decision Making
    ACCT2002CostAnalysisfor Decision MakingTrimester2A,2024SyllabusThisisamanagementaccountingfoundationunitthatsupportsmanagerialplanninganddecisionmakingthroughtheintegrationofethicsandstrategytocostingmodelsandprofitplanni......
  • [debug]解决cmake编译报错:can not be used when making a PIE object:recompile with -
    问题描述最近在跟施磊老师的高性能服务器项目,使用make命令后一直报错以下问题解决方法报错一大堆recompilewith-fPIC,多半是链接静态库是出错了。根据网上经验,在CmakeLists文件中加入-no-pie,但是两种方法进行尝试后都没有效果。#第一种方法add_compile_options(-fPIC)#......