首页 > 其他分享 >CF1475C Ball in Berland

CF1475C Ball in Berland

时间:2023-11-23 19:12:34浏览次数:41  
标签:boy Ball run Berland int CF1475C ans MAXN girl

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();
}

标签:boy,Ball,run,Berland,int,CF1475C,ans,MAXN,girl
From: https://www.cnblogs.com/lyk2010/p/17852262.html

相关文章

  • [Codeforces] CF1475C Ball in Berland 题解
    BallinBerland-洛谷题意在毕业典礼上,有​个男孩和​个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。现在你知道​个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。思路暴力最朴素,也是简单的方法,就是通过暴力组合进行配对。#include......
  • CodeForces 1060G Balls and Pockets
    洛谷传送门CF传送门NOIP模拟赛T2。很厉害的题。想象数轴上\(a_1,a_2,\ldots,a_n\)位置上各有一个洞,每个非负整数位置上有一个点。每次操作相当于,对于每个点,如果它刚好位于一个洞,那么它会掉进去;否则设它的位置为\(p\),位置在它前面的洞有\(t\)个,那么这个点的位置变成......
  • 「解题报告」[AGC007C] Pushing Balls
    非常高级的题,但是感觉官方题解的做法和洛谷大部分题解的做法都并不很能说服我,感觉根据规律发现期望序列还是等差数列有点扯了。但是zhylj的题解的做法感觉很强啊,但是他题解后面的推导感觉好像有点问题。所以整出来这样一个做法,感觉还是很清楚的。首先我们可以考虑将原问题转化......
  • Educational Codeforces Round 151 (Rated for Div. 2)E. Boxes and Balls(数学,动态规
    题目链接:https://codeforces.com/contest/1845/problem/E 题意: 给定长度为n且只含0和1的数组,你可以进行以下操作: 交换相邻的0和1; 给正整数k,问经过k次操作后,会有多少种本质不同的结果; 分析: 如果1比0多,我们可以把他们取反(让0比1多,结果是一样的) 设计状态dp[i][j......
  • [AGC002F] Leftmost Ball 题解
    很好的一道组合题。思路直接设\(dp_{i,j}\)表示已经放了\(i\)个白点与\(j\)中颜色。然后直接组合数算即可。CodeAC记录。......
  • IfcGloballyUniqueId
    IfcGloballyUniqueId类型定义IfcGloballyUniqueId包含用于唯一标识IFC对象的编码字符串标识符。IfcGloballyUniqueId是一个全局唯一标识符(GUID),它是一个自动生成的128位数字。由于所有IFC对象实例都需要此标识符,因此需要对其进行压缩以减少开销。基本64个字符集的编码如下所示: ......
  • 题解 P7971【[KSN2021] Colouring Balls】
    postedon2022-10-0819:07:28|under题解|sourceproblem交互库有一个长为\(n\)的颜色序列,你可以询问区间\([l,r]\)中有多少种颜色,最后还原交互库手中的序列,只需要保持相对顺序不变。\(n\leq10^3\),最多询问次数\(Q=2000\)或\(Q=10^4\)。solution令\(C\)为\([1......
  • [ABC310G] Takahashi And Pass-The-Ball Game
    ProblemStatementThereare$N$Takahashi.The$i$-thTakahashihasaninteger$A_i$and$B_i$balls.Aninteger$x$between$1$and$K$,inclusive,willbechosenuniformlyatrandom,andtheywillrepeatthefollowingoperation$x$times.Forevery$i$,......
  • AT_agc002_f [AGC002F] Leftmost Ball 思考--zhengjun
    思维+dp。如果像题意那样先放球再染色的话不是很好做。所以考虑有\(n\)个白球,\(n\)种其他颜色的球各\(k-1\)个。那么限制就是说对于每个前缀,白球的个数\(\ge\)其他颜色球的种数。所以就可以设\(f_{i,j}\)为放了\(i\)个白球,\(j\)种颜色的\(k-1\)个球的方案数。......
  • CF755G PolandBall and Many Other Balls
    列出转移方程就是傻鸟题了,具体地,令\(f_{i,j}\)为前\(i\)球取出\(j\)组的方案数,有:\[f_{i,j}=f_{i-1,j-1}+f_{i-1,j}+f_{i-2,j-1}\]列出\(f_{i}\)的GF\(F_i(x)\):\[F_i(x)=F_{i-1}(1+x)+F_{i-2}\cdotx\]这是递推,把矩阵元素改成多项式,矩阵快速幂即可。\(O(k\logk\log......