当前位置: 首页 > news >正文

P8250 交友问题

P8250 交友问题https://www.luogu.com.cn/problem/P8250


题面描述:

一个有n个点m条边的无向简单图

每次询问u,v,问与u相邻且不为v的点中有多少个的点不与v相邻


题解:

正难则反,我们考虑有多少个点为v或与v相邻,在用u.size()减去即可

首先,让我们抛弃大O,先来思考暴力,

暴力1:我们对每个点开一个bitset,每次询问直接返回两个bitset相与的结果,时间复杂度O(\frac{nq}{w})

暴力2:我们开一个桶,每次将v的所以邻居加入桶,再用计算其中u的邻居的出现次数时间复杂度O(nq)

正解:

考虑将他们融合根号分治!!!

设置一个阈值T,将入度大于T的称为重点,入度小于等于T的称为轻点

因为图中一共只有2m个入度,所以当我们将阈值T设为sqrt(2m)时,即可将重点个数定为根号级

分四种情况讨论

1.(重,重) 采用暴力1的做法,O(\frac{nq}{w})

2.(轻,轻) 采用暴力2的做法,O(\frac{nq}{T})

3.(重,轻) 枚举轻点的邻居,利用重点的bitsetO(1)判断,O(\frac{nq}{T})

4.(轻,重) 与情况3相同,O(\frac{nq}{T})

在T取\sqrt{2m}时,情况1时间复杂度仍为O(\frac{nq}{w}),较为危险,容易别卡常,因此考虑面向数据编程

我们开桶记录答案,使答案变为O(\frac{(\frac{m}{T})^2n}{w}),即O(\frac{m^2n}{T^2w}),于是将T开大一点,实测T=1000可过

其实不加也可以

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,q,rd[N],cnt,anss[1100][1100];
vector<int>a[N];
bitset<N>vis[1100];
bool mp[N];
int main()
{memset(anss,-1,sizeof(anss));scanf("%d%d%d",&n,&m,&q);int k=1000;for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);a[x].push_back(y);a[y].push_back(x);}for(int i=1;i<=n;i++){if(a[i].size()<=k) continue;rd[i]=++cnt;vis[cnt][i]=1;for(auto it:a[i]) vis[cnt][it]=1;}while(q--){int x,y,ans=0;scanf("%d%d",&x,&y);if(x==y){printf("0\n");continue;}if(a[x].size()>k&&a[y].size()>k){if(anss[rd[x]][rd[y]]!=-1) ans=anss[rd[x]][rd[y]];else ans=anss[rd[x]][rd[y]]=(vis[rd[x]]&vis[rd[y]]).count()-(vis[rd[x]][y]);}if(a[x].size()>k&&a[y].size()<=k){for(auto it:a[y]) if(vis[rd[x]][it]) ans++;}if(a[x].size()<=k&&a[y].size()>k){for(auto it:a[x]) if(vis[rd[y]][it]) ans++;}if(a[x].size()<=k&&a[y].size()<=k){mp[y]=1;for(auto it:a[y]) mp[it]=1;for(auto it:a[x]) ans+=mp[it];for(auto it:a[y]) mp[it]=0;mp[y]=0;}printf("%d\n",a[x].size()-ans);}return 0;
}

http://www.dtcms.com/a/319211.html

相关文章:

  • 表单元素与美化技巧:打造用户友好的交互体验
  • zookeeper因jute.maxbuffer启动异常问题排查处理
  • 如何开发一个运行在windows系统服务器上的服务
  • “物联网+职业本科”:VR虚拟仿真实训室的发展前景
  • 纳米陶瓷与光子集成:猎板PCB定义下一代VR硬件的技术蓝图
  • 【unity实战】使用Unity程序化生成3D随机地牢(附项目源码)
  • 飞机起落架轮轴深孔中间段电解扩孔内轮廓测量 - 激光频率梳 3D 轮廓检测
  • 如何将Dubbo从Zookeeper平滑地迁移到Nacos?
  • 38.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加日志记录器
  • Android视图状态以及重绘
  • Java面试宝典:类加载
  • 利用vue.js2X写前端搜索页面,express写后端API接口展现搜索数据
  • SymPy 中 atan2(y, x)函数的深度解析
  • vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2
  • ArkTS: McPointChart
  • 【Redis面试精讲 Day 16】Redis性能监控与分析工具
  • 从Web2.0到Web3.0——用户体验如何演进
  • 树莓派安装中文输入法
  • Day09 Tlisa登录认证
  • Linux总线,设备和驱动关系以及匹配机制解析
  • FPGA学习笔记——VGA显示静态图片(ROM IP核)
  • 【博弈 拓扑序 缩点】P9220 「TAOI-1」椎名真昼|省选-
  • Bosco-and-Mancuso Filter for CFA Image Denoising
  • 如何快速掌握Excel公式?14天轻松通关
  • LeetCode 面试经典 150_数组/字符串_除自身以外数组的乘积(13_238_C++_中等)(前缀积)
  • Swift 实战:高效设计 Tic-Tac-Toe 游戏逻辑(LeetCode 348)
  • 解决chrome下载crx文件被自动删除,加载未打包的扩展程序时提示“无法安装扩展程序,因为它使用了不受支持的清单版本解决方案”
  • 冷库温湿度物联网监控系统解决方案:冷链智能化
  • 普通冷库如何升级物联网冷库?工业智能网关赋能冷链智能化转型
  • AI摄像机如何为煤矿减少90%违规事故?