首页 > 其他分享 >BanG Dream! It's MyGO!!!!!

BanG Dream! It's MyGO!!!!!

时间:2024-08-22 17:48:33浏览次数:6  
标签:int MyGO ret 乐团 leq BanG long Dream

BanG Dream! It's MyGO!!!!!

题目描述

在“BanG Dream! It's MyGO!!!”的世界里,各个乐团的演出和排练场地像星星一样被连接在一起,形成了一张美丽的网络图。每个乐团都有自己独特的演出场地和练习室,这些地点通过各种路径互相连接,组成了一张复杂的图谱。

koala 作为一名热爱音乐的乐团忠实粉丝,突然有了一个灵感。他想为最喜欢的乐团设计一个独特的徽章,这个徽章需要从网络图中找出一些特别的图案来代表乐团,比如选三条边连接到一起,具体来说,他对以下三种图案感兴趣:

三角形:由三条边构成的连通子图,这是一种经典的图案。

三芒星:四个点形成的图案,一个点连向其他三个点。

闪电折线:一种特别的折线,由四个点按顺序连接,即一条链。

koala 想知道有多少种情况满足,你能帮帮他吗?

输入描述:

第一行包合两个整数 $n,m$ $(1 \leq n \leq 10^5, 1 \leq m \leq 2 \cdot 10^5)$,依次表示无向图的点数和边数;接下来 $m$ 行,每行两个整數 $u,v$ $(1 \leq u,v \leq n)$,表示一条边 $(u,v)$ 题目保证无重边、自环。

输出描述:

输出包含一个整数,表示你的答案。

示例1

输入

5 5
1 2
1 3
2 3
2 4
3 5

输出

8

说明

满足条件的导出子图的边集分别为:

(1,2),(1,3),(2,3)
(1,2),(2,3),(2,4)
(1,3),(2,3),(3,5)
(1,2),(1,3),(2,4)
(1,2),(1,3),(3,5)
(2,4),(2,3),(3,5)
(1,3),(2,3),(2,4)
(1,2),(2,3),(3,5)

备注:

给定一个无向图,你需要给出三条边的导出子图是连通的情况数量。

 

解题思路

  先考虑简单的三芒星,枚举每个节点 $u$,那么以 $u$ 为中心的三芒星的数量就是 $C_{d_u}^{3}$,其中 $d_u$ 指 $u$ 的度数。

  再考虑闪电折线,我们可以枚举中间的边 $(u, v)$,那么以边 $(u,v)$ 为中心的折线数量就是 $(d_u - 1) \cdot (d_v - 1)$。需要注意的是该统计方法会顺便把每个三角形都统计了 $3$ 次。

  最后是三角形,就是统计图中三元组的数量,可以参考无向图三元环计数

  根号分治做法的 AC 代码如下,时间复杂度为 $O\left(\frac{nm}{w}\right)$:

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

typedef long long LL;

const int N = 2e5 + 5, M = 3000;

int x[N], y[N];
vector<int> g[N];
bool vis[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> x[i] >> y[i];
        g[x[i]].push_back(y[i]);
        g[y[i]].push_back(x[i]);
    }
    LL ret = 0, s = 0;
    map<int, bitset<N>> mp;
    for (int i = 1; i <= n; i++) {
        int s = g[i].size();
        if (s >= 3) ret += s * (s - 1ll) * (s - 2) / 6;
        if (s > M) {
            for (auto &j : g[i]) {
                mp[i][j] = 1;
            }
        }
    }
    for (int i = 1; i <= m; i++) {
        ret += (g[x[i]].size() - 1ll) * (g[y[i]].size() - 1);
        if (g[x[i]].size() > g[y[i]].size()) swap(x[i], y[i]);
        if (g[x[i]].size() <= M) {
            if (g[y[i]].size() <= M) {
                for (auto &v : g[y[i]]) {
                    vis[v] = true;
                }
                for (auto &v : g[x[i]]) {
                    if (vis[v]) s++;
                }
                for (auto &v : g[y[i]]) {
                    vis[v] = false;
                }
            }
            else {
                auto &p = mp[y[i]];
                for (auto &v : g[x[i]]) {
                    if (p[v]) s++;
                }
            }
        }
        else {
            s += (mp[x[i]] & mp[y[i]]).count();
        }
    }
    ret -= s / 3 * 2;
    cout << ret;
    
    return 0;
}

  建 DAG 做法的 AC 代码如下,时间复杂度为 $O(m \sqrt{m})$:

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

typedef long long LL;

const int N = 2e5 + 5, M = 250;

int x[N], y[N];
int deg[N];
vector<int> g[N];
bool vis[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> x[i] >> y[i];
        deg[x[i]]++, deg[y[i]]++;
    }
    LL ret = 0;
    for (int i = 1; i <= n; i++) {
        int s = deg[i];
        if (s >= 3) ret += s * (s - 1ll) * (s - 2) / 6;
    }
    for (int i = 1; i <= m; i++) {
        ret += (deg[x[i]] - 1ll) * (deg[y[i]] - 1);
        if (deg[x[i]] < deg[y[i]] || deg[x[i]] == deg[y[i]] && x[i] < y[i]) g[x[i]].push_back(y[i]);
        else g[y[i]].push_back(x[i]);
    }
    LL s = 0;
    for (int i = 1; i <= n; i++) {
        for (auto &j : g[i]) {
            vis[j] = true;
        }
        for (auto &j : g[i]) {
            for (auto &k : g[j]) {
                if (vis[k]) s++;
            }
        }
        for (auto &j : g[i]) {
            vis[j] = false;
        }
    }
    ret -= s * 2;
    cout << ret;
    
    return 0;
}

 

参考资料

  2024河南萌新联赛第六场题解:https://blog.csdn.net/qq_45809243/article/details/141322896

标签:int,MyGO,ret,乐团,leq,BanG,long,Dream
From: https://www.cnblogs.com/onlyblues/p/18374421

相关文章

  • dreambooth代码阅读
    网上dreambooth大部分只是对论文讲解,但代码讲解不是找不到就是收费,没办法,自己硬读,记录一下。水平不高,学机器学习不久,可能有错,欢迎指正,仅做参考。Dreambooth流程简单来说是1,通过在现有的Diffusion模型增加一个你要的token,变成一个新的模型,比如你给特定一只sys狗的照片训练,你新......
  • 推动视觉AI边界,智象未来HiDream荣登全球技术先锋榜单
    近日,世界经济论坛“全球技术先锋”荣誉榜单正式揭晓,智象未来HiDream凭借尖端技术成就入选。智象未来HiDream成立于2023年3月,是一家专注于多模态AIGC技术应用的公司,由加拿大工程院外籍院士IEEE/IAPR/CAAIFellow梅涛博士创立。回顾过往,众多知名企业,如Airbnb、Google、Tw......
  • HiDream引领图像文字嵌入技术新革命,助力多领域创意升级
    近日,HiDream“智象大模型2.0”正式上线!据官方信息显示,"智象大模型2.0"在处理文本、图像、视频以及3D内容的多模态能力上取得了显著进展。特别是在"文生图"领域,该模型实现了对长文本复杂逻辑的深入理解、图片与文字的精准嵌入,以及画面艺术感的充分展现,从而在三个关键维度上提升......
  • Living-Dream 系列笔记 第76期
    UVA1328简单题。我们有结论:对于一个周期串S的子串T,它的最小循环节即为T-nxt_{\left|T\right|}。(具体请查阅往期笔记)于是,我们枚举所有前缀,检验上式是否能被当前前缀的长度整除并且不止一个循环节即可。code#include<bits/stdc++.h>usingnamespacestd;constintN=......
  • Dreamforce '24重磅来袭!年度盛会将有何惊喜?
     作为Salesforce的旗舰会议,Dreamforce的历史已有20余年之久,是生态系统中的年度亮点。现如今,Dreamforce已经适应了线上受众的需求,通过Salesforce+提供直播和点播的参与方式。 近期,Salesforce宣布Dreamforce'24将于9月17日-19日举行,一年一度的科技盛会又要开始 Dreamforce......
  • Dreamweaver (DW)2021 下载 安装
    将 Dreamweaver2021 压缩包解压到本地:点击蓝色字体下载压缩包提取码ixsu鼠标右键点击 Set-up 选择 以管理员身份运行:点击 更改位置 可以自定义选择安装路径 也可以选择默认位置点击 继续:等待安装正常等待5分钟左右:安装完成点击关闭:双击桌面 Drea......
  • Living-Dream 系列笔记 第75期
    CF126B朴素解法:求出原字符串的最长border,并kmp匹配出出现在中间的最长border,若没有则不断缩短border的长度,直到中间存在。若border长度减到了\(0\),则无解。我们通过画图来探索优化方式。如图,蓝色部分为原串的最长border,红色部分为蓝色部分的最长border。容易发现,......
  • Living-Dream 系列笔记 第74期
    Kobe-Morris-Pratt算法定义一些基本定义:border:是一个字符串的子串(不与其本身相同)且满足既是其前缀又是其后缀的字符串,我们称之为该字符串的一个border。Kobe-Morris-Pratt算法(以下简称KMP算法),是解决字符串匹配问题的一种算法,实际做题中常偏思维,通常用到的只有其中的bo......
  • xinbang
                                                                 ......
  • Living-Dream 系列笔记 第71期
    众所周知,换根dp是非常套路的。换根真好玩(换根dp:当不同节点作为根时,dp结果不一致,若枚举每个节点作为根,则时间复杂度过高,在此种情形下,可使用换根dp处理相邻两节点间的贡献,从而达到快速换根的效果。使用场景:对于一棵树,寻找以某节点\(u\)为根时取得的最大值/最小值......