基站建设

  • problem
  • solution
  • code

problem

给定 nnn 个地点,以及每个地点的可靠度 RiR_iRi​。

有 mmm 条光纤架,每一条连接两个不同的地点,且是双向的。

测试基站由 444 个信号塔,有 222 个主信号塔和 222 个副信号塔。

要求主信号塔必须与其余三个塔相连,副信号塔必须与所有主信号塔相连。

每个地点都只能建一个信号塔,基站的可靠度为两个主信号塔所在地点可靠度+1+1+1的乘积再加上两个副信号塔所在地可靠度的乘积。即 (Ri+1)(Rj+1)+RaRb(R_i+1)(R_j+1)+R_aR_b(Ri​+1)(Rj​+1)+Ra​Rb​。

求测试基站的最大可靠度。

n≤3e5,1s,512MBn\le 3e5,1s,512MBn≤3e5,1s,512MB。

solution

observation:满足条件的子图其实上是有一条公共边的两个三元环。

求解公式并没有什么特殊性质,所以很有可能是需要枚举三元环的。

枚举三元环既可以枚举三个点,也可以枚举三条边,选择不同带来的时间效率也有所不同。

考虑根号分治。

对于度数 <m<\sqrt{m}<m​ 的点,枚举其两条出边再判断两条边的入点之间是否有边。

度数 >m>\sqrt{m}>m​ 的点,总个数不超过 m\sqrt{m}m​ 个。直接枚举三个点。

时间复杂度均为 O(mm)O(m\sqrt{m})O(mm​)。


上面的是正解,下面的是我在考场上自己想的做法。

最暴力的就是考虑一条边,这条边是连接主信号塔 u,vu,vu,v 之间的。

其实剩下的就是找 u,vu,vu,v 连接的点的交集之中可靠度最大的两个点。

暴力枚举边就是 O(m2)O(m^2)O(m2) 的。但是一旦使用 bitset 就不一样了。

直接 bitset 处理每个点直接相连的点的集合,将 u,vu,vu,v 的 bitset 直接取 &

然后 bitset 也自带快速找到为 111 的位置。

空间复杂度 O(n2)O(n^2)O(n2)。不卡!

时间复杂度是 O(nmω)O(\frac{nm}{\omega})O(ωnm​)

反正跑得挺快的。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 50005
#define maxm 200005
bitset < maxn > g[maxn];
pair < int, int > E[maxm];
int R[maxn];
int n, m;int main() {freopen( "station.in", "r", stdin );freopen( "station.out", "w", stdout );scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%d", &R[i] );for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );E[i] = { u, v };g[u][v] = g[v][u] = 1;}int ans = 0;for( int i = 1;i <= m;i ++ ) {int u = E[i].first, v = E[i].second;bitset < maxn > son = g[u] & g[v];son[u] = son[v] = 0;int max1 = 0, max2 = 0;for( int k = son._Find_first();k != son.size();k = son._Find_next( k ) ) {if( R[k] > max1 ) max2 = max1, max1 = R[k];else if( R[k] > max2 ) max2 = R[k];}if( ! max1 or ! max2 ) continue;ans = max( ans, ( R[u] + 1 ) * ( R[v] + 1 ) + max1 * max2 );}printf( "%d\n", ans );return 0;
}

基站建设(三元环计数+根号分治 / bitset)相关推荐

  1. 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd⁡(i,j)g ...

  2. P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...

  3. 三元环计数四元环计数

    三元环计数 问题 给出一张n个点m条边的无向图,问图中有多少个三元组{ u , v , w } ,满足图中存在 { (u,v) , (v,w) , (w,u) } 三条边. 求解 Step1 定向 将 ...

  4. 【Codeforces - 找不到题号】三元环计数(bitset优化,压位)

    题干: 给你一个二维字符矩阵,如果 ( i , j ) 为+ 表明 两点之间有一条有向边,为-表示没有边,那么你要找出所有的三元环的个数.顶点数N<=1500. 解题报告: 考虑最暴力的方法,开 ...

  5. 洛谷 - P1989 无向图三元环计数(思维建图)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,求三元环的个数 题目分析:对于原图建新图,对于原来的每条边来说 如果度数不同,度数小的点指向度数大的点 如果度数相同,编 ...

  6. HDU6184【Counting Stars】(三元环计数)

    题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...

  7. P1989 无向图三元环计数 思维 + 建图

    传送门 文章目录 题意: 思路: 题意: 统计无向图中三元环的个数. 思路: 很明显有一种暴力的方法,就是枚举每条边,让后再跑两个点的所有边,可以卡到复杂度O(m2)O(m^2)O(m2). 我们可以 ...

  8. 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)

    题干: Little A is an astronomy lover, and he has found that the sky was so beautiful! So he is countin ...

  9. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

    三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi​:i 在原图中的度数 ...

最新文章

  1. vs配色方案_提高生产力:配色,模板参数过滤及IntelliCode
  2. pyenv、pipenv 环境管理
  3. How to reduce Index size on disk?减少ES索引大小的一些小手段
  4. 签消费贷合同免费领取苹果手机? 捷信、马上等多家消费金融“躺枪”
  5. Javascript 常用功能收集-blogjava
  6. 《Dubbo迈出云原生重要一步-应用级服务发现解析》
  7. 案例详解:Linux文件系统异常导致数据库文件无法访问
  8. applicationstatewinec7 电源管理
  9. java编程应该要的英语_java编程中常用英语单词
  10. 手机视频监控系统小结
  11. 拿到窗口ID,为什么画的内容没有显示出来
  12. hilbert希尔伯特变换
  13. C语言实训心得体会(精选4篇)
  14. 算法:买卖股票最佳时机(c++)
  15. TCP 与 UDP 的异同
  16. 破坏网络可信身份认证,黑灰产业链正在兴起
  17. 互动媒体技术——对十二个“一”的文艺创作作业进行文本分析、统计和可视化
  18. android 谷歌定位demo,android实现定位与目的地的导航示例代码
  19. python无法定位到table_爬虫无法定位到tbody下的tr求助!!!!
  20. Python实现部分主元法下LU分解

热门文章

  1. ant vue 语言_Ant Design Vue是什么
  2. 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~
  3. MYSQL数据库表大小计算,计算mysql数据库数据表的大小,不精确,只是大略的数据...
  4. java中注解的解析_全面解析Java中的注解与注释
  5. java类型转换造成的字节丢失,java 编码转换(已解决,转换字节丢失,无法实现)
  6. mysql 拷贝安装_Mysql的安装和主从复制
  7. 三菱plc选型手册_模拟量是什么?PLC和模拟量是如何转换的?
  8. 查漏补缺方为上策!!两万六字总结vue的基本使用和高级特性,周边插件vuex和vue-router任你挑选
  9. linux多行变一列,多行转为一列
  10. java while do循环_c语言中,while 和 do while 循环的主要区别是( )