专栏文章
题解:P8250 交友问题
P8250题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minm3u1m
- 此快照首次捕获于
- 2025/12/02 04:39 3 个月前
- 此快照最后确认于
- 2025/12/02 04:39 3 个月前
题意简述
给定一张 个节点 条无向边的好友关系图,有 次询问 的好友中不认识 的数量。()
解题思路
设 的好友集合为:
题目询问:
考虑暴力实现:可以 预处理 的数组存储邻接矩阵,每次询问 枚举所有好友。
考虑时间优化:可以用
bitset 存储邻接矩阵,每次询问将两行按位与,统计其中 的个数。考虑空间优化:可以不预处理邻接矩阵,而在每次询问时现场计算。
结合这两种优化方法,可以将度数大于阈值 的点预处理,其他的点现场计算。
由于有 条边,所有点的总度数为 ,所以预处理点不超过 个。
越大,空间越小,但时间越慢,只要在合理范围内都能通过。
参考代码
CPP#include <bits/stdc++.h>
using namespace std;
const int N=200005;
vector<int> G[N];
map<int,bitset<N>> a;
int in[N];
bitset<N> build(int u)
{
bitset<N> res;
for(auto v:G[u])res[v]=1;
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m,q;
cin>>n>>m>>q;
while(m--)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
in[u]++;in[v]++;
}
for(int i=1;i<=n;i++)
{
if(in[i]>1000)a[i]=build(i);
}
while(q--)
{
int u,v;
cin>>u>>v;
auto x=a.find(u)!=a.end()?a[u]:build(u);
auto y=a.find(v)!=a.end()?a[v]:build(v);
y[v]=1;
cout<<(x&~y).count()<<'\n';
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...