基站建设(三元环计数+根号分治 / bitset)
基站建设
- 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)+RaRb。
求测试基站的最大可靠度。
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)相关推荐
- 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd(i,j)g ...
- P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...
- 三元环计数四元环计数
三元环计数 问题 给出一张n个点m条边的无向图,问图中有多少个三元组{ u , v , w } ,满足图中存在 { (u,v) , (v,w) , (w,u) } 三条边. 求解 Step1 定向 将 ...
- 【Codeforces - 找不到题号】三元环计数(bitset优化,压位)
题干: 给你一个二维字符矩阵,如果 ( i , j ) 为+ 表明 两点之间有一条有向边,为-表示没有边,那么你要找出所有的三元环的个数.顶点数N<=1500. 解题报告: 考虑最暴力的方法,开 ...
- 洛谷 - P1989 无向图三元环计数(思维建图)
题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,求三元环的个数 题目分析:对于原图建新图,对于原来的每条边来说 如果度数不同,度数小的点指向度数大的点 如果度数相同,编 ...
- HDU6184【Counting Stars】(三元环计数)
题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...
- P1989 无向图三元环计数 思维 + 建图
传送门 文章目录 题意: 思路: 题意: 统计无向图中三元环的个数. 思路: 很明显有一种暴力的方法,就是枚举每条边,让后再跑两个点的所有边,可以卡到复杂度O(m2)O(m^2)O(m2). 我们可以 ...
- 【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 ...
- 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi:i 在原图中的度数 ...
最新文章
- vs配色方案_提高生产力:配色,模板参数过滤及IntelliCode
- pyenv、pipenv 环境管理
- How to reduce Index size on disk?减少ES索引大小的一些小手段
- 签消费贷合同免费领取苹果手机? 捷信、马上等多家消费金融“躺枪”
- Javascript 常用功能收集-blogjava
- 《Dubbo迈出云原生重要一步-应用级服务发现解析》
- 案例详解:Linux文件系统异常导致数据库文件无法访问
- applicationstatewinec7 电源管理
- java编程应该要的英语_java编程中常用英语单词
- 手机视频监控系统小结
- 拿到窗口ID,为什么画的内容没有显示出来
- hilbert希尔伯特变换
- C语言实训心得体会(精选4篇)
- 算法:买卖股票最佳时机(c++)
- TCP 与 UDP 的异同
- 破坏网络可信身份认证,黑灰产业链正在兴起
- 互动媒体技术——对十二个“一”的文艺创作作业进行文本分析、统计和可视化
- android 谷歌定位demo,android实现定位与目的地的导航示例代码
- python无法定位到table_爬虫无法定位到tbody下的tr求助!!!!
- Python实现部分主元法下LU分解
热门文章
- ant vue 语言_Ant Design Vue是什么
- 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~
- MYSQL数据库表大小计算,计算mysql数据库数据表的大小,不精确,只是大略的数据...
- java中注解的解析_全面解析Java中的注解与注释
- java类型转换造成的字节丢失,java 编码转换(已解决,转换字节丢失,无法实现)
- mysql 拷贝安装_Mysql的安装和主从复制
- 三菱plc选型手册_模拟量是什么?PLC和模拟量是如何转换的?
- 查漏补缺方为上策!!两万六字总结vue的基本使用和高级特性,周边插件vuex和vue-router任你挑选
- linux多行变一列,多行转为一列
- java while do循环_c语言中,while 和 do while 循环的主要区别是( )