首页 > 其他分享 >Luogu P6680

Luogu P6680

时间:2024-09-19 22:14:08浏览次数:4  
标签:insert cout int Luogu ll P6680 using

题目描述

给定一张 \(N\) 个点,\(M\) 条边的无向简单图。

如果存在 \(1\le a<b<c\le N\) 满足存在边 \((a,b),(a,c)\),并且不存在 \((b,c)\),则加入边 \((b,c)\)。

求最后的边数。

思路

首先我们可以把边看做从小的连向大的。

通过观察可以发现只有在这种情况下才会建边:

image

这里红色的边是新加入的。

如果每次我们都对这样的建一个完全图,那么有很多边会被重复加入,所以我们考虑每个点会伸出去多少条边。

可以发现,这里只需要让最靠前的一个儿子建边就行了,也就是这样:

image

因为在枚举到这个儿子时又会传递给下一个。

所以我们用一个 set 记录连向的结点,然后用启发式合并的方法传递给儿子。

空间复杂度 \(O(N+M)\),时间复杂度 \(O(N\log^2 M)\)。

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int MAXN = 100001;

int n, m;
ll ans;
set<int> e[MAXN];

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1, u, v; i <= m; ++i) {
    cin >> u >> v;
    e[u].insert(v);
  }
  for(int i = 1; i <= n; ++i) {
    ans += e[i].size();
    if(e[i].size()) {
      int x = *e[i].begin();
      e[i].erase(x);
      if(e[i].size() > e[x].size()) {
        swap(e[i], e[x]);
      }
      for(int v : e[i]) {
        e[x].insert(v);
      }
    }
  }
  cout << ans;
  return 0;
}

标签:insert,cout,int,Luogu,ll,P6680,using
From: https://www.cnblogs.com/yaosicheng124/p/18421479

相关文章

  • luogu-P10596题解
    简要题意一个有\(N\)个元素的集合有\(2N\)个不同子集(包含空集),现在要在这\(2N\)个集合中取出若干集合(至少一个),使得它们的交集的元素个数为\(K\),求取法的方案数,答案模\(10^9+7\)。数据范围:\(1\leK\leN\le10^6\)。题解我们设\(f(i)\)表示选出子集大小恰好为\(i\)的......
  • Luogu P10812
    题目描述给定一根\(1\)到\(N\)的数轴。一开始有一个棋子在\(N\)。每次棋子\(x\)可以跳到\(x-1,x+1\)或\(x\)的因子处(不能超出\(1\)到\(N\))。每个点只能到达一次。求棋子到达\(1\)的方案数。思路由于求倍数比因子简单,所以把问题变成从\(1\)到\(N\),每次跳倍......
  • Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
    水影若深蓝:挺好的一道并查集构造题。观察不难发现“距离为\(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为\(2\)的点染成相同颜色。这个染色问题就很并查集。于是我们用并查集维护相同的种类。显然,当图上只有一个连通块的......
  • luogu2516题解
    随机说话第一次交的时候写的版本是这个。下面在sum的计算上少了个else,遂出错。以后写的时候还是尽量简单点,主要是调试的时候好调。题目分析题目里面的公共子序列就是可以不连续可以为空的在字符串里出现顺序相同的子串。对于一个公共子序列,在找到最后一个公共的字符的时......
  • Luogu P11036 GCD 与 LCM 问题 [ 蓝 ] [ 构造 ] [ 数论 ] [ adhoc ]
    LuoguP11036GCD与LCM问题:梦熊的题真是又神又逆天。思路观察到有个奇数的特殊性质,我们尝试从奇数构造入手。先来尝试带入极端数据,对于\(\gcd\),我们可以把\(b=1\)的情况先带进去看看。\[a+b+c+d=\gcd(a,b)+\operatorname{lcm}(c,d)\]\[a+1+c+d=1+\operatorname{lcm}(c,......
  • luogu4198题解
    随机说话这个题做法没见过记一下。我一开始以为是李超树的题,结果把李超树打上之后就不会做了。然后题读错了写了一个弱化版。题目分析做法参考这个题题意只是假装是一个有关线段的题。简化之后的题意如下。有一个初始都为\(0\)的实数数列,每一次会修改位置\(x\)的数为......
  • [luoguAT_abc369_f]Gather Coins
    题意给定\(N\timesM\)的网格,给定\(K\)个二元组\((x_1,y_1),(x_2,y_2),\cdots,(x_K,y_K)\),求从\((1,1)\)到\((N,M)\)只向右或向下走最多可以经过多少个给定的方格,并给出一种方案。赛时不会赛后由于只能向右或向下走,因此当前所处位置\((nowx,nowy)\)中,\(......
  • [luoguAT_abc369_e] Sight[luoguAT_abc369_e]Sightseeing Tour
    题意给定一个包含\(N\)个点和\(M\)条无向边的带权图,保证图中没有自环,但可能包含重边。给出\(Q\)次查询,每次查询给出\(K\)条边\(B_1,B_2,\cdots,B_K\),要求求出从节点\(1\)到节点\(N\)且这\(K\)条边都至少经过一次的最短路(经过边的方向和顺序任意)。赛时Dijkstra......
  • Luogu P2114 起床困难综合症
    LuoguP2114起床困难综合症由于这道题的三个操作都是位运算,所以我们可以按位考虑,即考虑初始攻击力和最后伤害的每一位分别是$0$还是$1$。因此我们可以先算出每一位分别取$0$和取$1$在经过所有防御门后最后得到的是什么,然后从高位向低位贪心即可。需要注意的是(也是被卡......
  • Luogu8990 做题记录
    link比较喜欢的题目。考虑合法的条件,从点亮的灯的角度难以维护。反过来看,从未点亮的灯角度考虑,条件相当于这些灯形成了一个包含\(1\)号灯的连通块。如何判定这些灯形成一个连通块?点减边!设\(c_i\)为操作前\(i\)次后,未点亮的灯的\(|V|-|E|\)的值,那么\(c_i=1\)即合......