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

CF1475C Ball in Berland - crazy-

CF1475C Ball in Berland

Ball in Berland - 洛谷

题意

在毕业典礼上,有\(a\)个男孩和\(b\)个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。

现在你知道\(k\)个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。

思路

暴力

最朴素,也是简单的方法,就是通过暴力组合进行配对。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6;
int a,b,k,boy[maxn],girl[maxn],ans;
int run()
{ans=0;cin>>a>>b>>k;for(int i=0;i<k;i++) cin>>boy[i];for(int i=0;i<k;i++) cin>>girl[i];for(int i=0;i<k;i++){int t1=boy[i],t2=girl[i],flag=1,cnt=0;for(int j=i+1;j<k;j++){if(t1==boy[j] || t2==girl[j]) flag=0;else{ans++;}}}cout<<ans;
}int main()
{int t;cin>>t;while(t--){run();cout<<endl;}
}

然而,会在第四个点超时,所以还得优化

利用桶进行优化

我们注意到,超时的原因就是这段代码:

for(int j=i+1;j<k;j++){if(t1==boy[j] || t2==girl[j]) flag=0;else{ans++;}}

那么,该怎么进行优化,使其从\(O(k)\)变为\(O(1)\)呢?

这段代码的用途其实就是在\(t1,t2\)后面查找有没有重复出现的人。关注题目中的数据范围:\(1 \leq t \leq 10^4,1\leq a,b,k \leq 2\cdot 10^5\),因此可以开一个桶来存储男生和女生各出现的次数,然后再与当前\(t1,t2\)作差即可

手玩一下样例:

最开始的桶是这样的:

boy 2 1 1
girl 0 2 1 1

随后,对\((1,2)\)进行判断,ans=剩余组数(\(3\))-重复数量(\(2-1+2-1\)),即\(ans=1\)

然后,桶变成了这样:

boy 1 1 1
girl 0 1 1 1

为了避免重复,每次计算完1组后都需要更新一下对应的男女生人数。进行完\((1,3)\)的操作后,\(ans=3\)

随后是这样:

boy 0 1 1
girl 0 1 0 1

继续进行如上操作,\(ans=4\),更新桶

接着:

boy 0 0 1
girl 0 0 0 1

当只剩1组时,意味着枚举结束了,并输出\(ans\)\(4\)

整个程序的时间复杂度是\(O(5tk)\)CF的机子慢所以算精确点,不会超时

另:十年CF一场空,不开\(long\space long\)见祖宗

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+10;
int boy[MAXN],girl[MAXN],a,b,k,ans,bo[MAXN],g[MAXN];
void run()
{ans=0;memset(boy,0,sizeof(boy));memset(girl,0,sizeof(girl));cin>>a>>b>>k;for(int i=0;i<k;i++){cin>>bo[i];boy[bo[i]]++;}for(int i=0;i<k;i++){cin>>g[i];girl[g[i]]++;}for(int i=0;i<k;i++){int t1=bo[i],t2=g[i];ans+=(k-i-1)-(boy[t1]+girl[t2]-2);boy[t1]--,girl[t2]--;}cout<<ans<<endl;
}
signed main()
{int t;cin>>t;while(t--) run();
}
http://www.jsqmd.com/news/88829/

相关文章:

  • 大数据领域体系认知
  • 储能系统双向 DCDC 变换器双闭环控制:解锁蓄电池充放电仿真的奥秘
  • CF1506C Epic Transformation - crazy-
  • 服务端渲染(SSR)中的 JS 激活(Hydration):前后端状态同步的底层挑战
  • 2025年男孩取名机构推荐:权威榜单TOP5机构深度解析 - 十大品牌推荐
  • 1、深入了解 UNIX 操作系统:特性、历史与哲学
  • CF1536C Diluc and Kaeya - crazy-
  • JavaScript 源代码的 AST 转换:Babel 插件是如何改变你编写的代码的?
  • 2、UNIX基础入门教程
  • 2025年男孩取名机构推荐:2025年专业取名机构权威榜单TOP5深度解析 - 十大品牌推荐
  • 2025年互联网行业:AI技能+CAIE认证打造核心竞争力
  • CF1538F Interesting Function - crazy-
  • 2025年男孩取名机构推荐:权威取名机构榜TOP5深度解析 - 十大品牌推荐
  • 快速排序的理解与实践(c语言实现)
  • 3、学习 UNIX 的额外资源
  • Open-AutoGLM 实战:手把手教你用 AI 做App自动化测试「喂饭教程」
  • 6、互联网通信全解析:从邮件到多媒体的多元世界
  • 含分布式电源配电网潮流计算及相关实践
  • CF1542B Plus and Multiply - crazy-
  • React 新手村通关指南:状态、组件与魔法 UI
  • 7、UNIX 外壳:从基础到高级编程的全面指南
  • CF1545A AquaMoon and Strange Sort - crazy-
  • 8、深入了解Bash:功能、安装与使用指南
  • 动态规划01背包问题
  • 停止造Agent,开始造Skills吧!Claude Skills创造者:Agent聪明但不够专业,非技术人员也能造Skills
  • 面向对象程序设计——第二章作业总结
  • 如何理解:“模型训练编排” 是 AI 创新的关键 ?
  • 2025年男孩起名机构推荐:权威起名榜单TOP5深度解析 - 十大品牌推荐
  • 游戏中的开发模式有哪些?一篇带你了解常用的设计模式!<二>
  • 【Python】conda更换国内镜像源