专栏文章
题解:P14023 [ICPC 2024 Nanjing R] 社交媒体
P14023题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miny30dg
- 此快照首次捕获于
- 2025/12/02 10:14 3 个月前
- 此快照最后确认于
- 2025/12/02 10:14 3 个月前
我们把所有数对 分成三类:
- 初始时 都是我的好友,直接记入答案。
- 初始时只有 是我的好友,此时给 加 。 的含义是只要选择 就会给答案加上 。
- 初始时 都不是我的好友,这里需要计算一个额外的贡献,对于这样的关系计数,。
处理后面两类增加的贡献。考虑枚举新增的第一位好友 ,对于与 不存在第 类关系的点 ,没有额外的贡献,直接选择 中 最大的那个。
对于与 存在第 类关系的点 ,暴力枚举这样的 计算贡献。增加的贡献是 。
由于第 类关系只有 个,时间复杂度 ,瓶颈在于排序。
CPP#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int T,n,m,k;
bool cmp(int a,int b){return a>b;}
unordered_map<int,int> cnt,bj,mp[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n>>m>>k;
cnt.clear();bj.clear();
for(int i=0;i<=k;i++)mp[i].clear();
for(int i=1;i<=n;i++){
int f;
cin>>f;
bj[f]=1;
}
int ans=0;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
if(bj[a]&&bj[b])ans++;
else if(bj[a])cnt[b]++;
else if(bj[b])cnt[a]++;
else if(a==b)cnt[a]++;
else{
mp[a][b]++;
mp[b][a]++;
}
}
vector<int> v;
for(int i=1;i<=k;i++)
if(cnt[i]!=0)v.push_back(cnt[i]);
sort(v.begin(),v.end(),cmp);
int res=0;
for(int i=1;i<=k;i++){//新增的第一位好友
if(bj[i])continue;
if(!v.empty()){
if(cnt[i]==v[0]){
if(v.size()>=2)res=max(res,cnt[i]+v[1]);
else res=max(res,cnt[i]);
}
else res=max(res,cnt[i]+v[0]);
}
for(auto it=mp[i].begin();it!=mp[i].end();it++){
res=max(res,cnt[i]+cnt[(*it).first]+(*it).second);
}
}
cout<<ans+res<<'\n';
}
return 0;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...