首页 > 其他分享 >Educational Codeforces Round 80 (Rated for Div2)

Educational Codeforces Round 80 (Rated for Div2)

时间:2024-12-05 19:31:59浏览次数:5  
标签:10 Educational Rated int Codeforces leq cnt dp

Educational Codeforces Round 80 (Rated for Div. 2) - Codeforces

Problem - A - Codeforces

数学

双钩函数,直接显然极值点是\(\sqrt{d}-1\),但要注意取整的时候可能存在偏差,暴力搜索一下附近的值就好了

#include<bits/stdc++.h>
using namespace std;
void solve()
{
	int n,d;scanf("%d%d",&n,&d);
	if(n>=d){cout<<"YES"<<endl;return ;}
	int x=pow(d*1.0,0.5);
	for(int i=-2;i<=2;i++)
	{
		int u=i+x;
		if(u>=1&&u<=n)
		{
			int f=u+(d+u)/(u+1);//向上取整
			if(n>=f)
			{
				cout<<"YES"<<endl;
				return ;
			}
		}
	}
	cout<<"NO"<<endl;
}
int main()
{
	int t;cin>>t;
	while(t--)solve();
}

Problem - B - Codeforces

构造

设\(y\)为\(b\)的位数

\[a*b+a+b=conc(a,b)=a*10^{y}+b\\ a*b+a=a*(b+1)=a*10^{y}\\ b+1=10^{y} \]

显然\(a\)可以取任意值,\(b\)只能取\(9,99,999.....\)

#include<bits/stdc++.h>
using namespace std;
int n,m;
void solve()
{
	int a,b;scanf("%d%d",&a,&b);
	int cnt=9;long long ans=0;
	while(cnt<=b)
	{
		ans++;
		cnt=cnt*10+9;
	}
	cout<<ans*a<<endl;
}
int main()
{
	int t;cin>>t;
	while(t--)solve();
}

Problem - C - Codeforces

\(DP\) 排序

观察题目我们可以发现两个数组可以直接拼起来(分开来做也差不多)

\(a_1\leq a_2...\leq a_m\leq b_m ..\leq b_2\leq b_1\)

题目就变成了求满足最大值不超过\(n\)的,长度为\(2*m\)的不递减序列的个数(对他使用\(dp\)吧!)

定义\(dp[i][j]\)为长度为\(i\),末尾元素为\(j\)的序列的个数

观察前后项的递推关系发现,在\(i-1\)中的每个小于\(j\)的序列后面都可以接上一个\(j\).

那么转移方程就很显然了\(dp[i][j]=\sum_{k=1}^{j}dp[i-1][k]\)

关注一下\(dp\)的初始化问题,先写出代码,从\(i=2\)开始遍历,我们发现第一次求解的时候利用的是\(dp[1][k]\)的值

只需将\(1:n\)的\(dp[1][i]\)初始化即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=1e9+7;
int n,m;
int dp[N][N];
long long ans;
int main()
{
	scanf("%d%d",&n,&m);
	m=m*2;
	for(int i=1;i<=n;i++)dp[1][i]=1;
	for(int i=2;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<=j;k++)
			{
				dp[i][j]=(0LL+dp[i][j]+dp[i-1][k])%M;
			}
		}
	}
	for(int i=1;i<=n;i++)ans=(ans+dp[m][i])%M;
	cout<<ans<<endl;
}

Problem - D - Codeforces

状态压缩 二分

说实话看到最大的最小值就该想到二分的,但我不会状压....

给出一个 \(n\) 行 \(m\) 列的数字矩阵 \(a\),找出两行 \(x, y\),令 \(b_j = \max(a_{x, j}, a_{y, j})\),试使得 \(\min\limits_{1 \le j \le m}b_j\) 最大,输出选择的 \(x, y\),可以相同。

我们先看看数据范围\(n\leq 3e5,b\leq 8\),感觉奇奇怪怪

基本思路是先二分出答案要求的\(\min\limits_{1 \le j \le m}b_j\),然后根据这个值找到对应的\(x,y\)

关键在于\(check\)函数和查找,\(n\)的范围很大,暴力显然会超时,这里可以用二进制压缩

在二分的时候,把每个\(\geq mid\)的数字设置为\(1\),反之设置为\(0\),然后将这行数字看作一个二进制数

如果有两行数组符合条件,显然他们的按位或的结果为\(11...11=2^m-1\)(或者单独一行为\(2^m-1\)也行)

由于\(m=8\),暴力枚举\(2^m*2^m=2^{2*m}=65536\),可以接受,直接设置一个\(cnt\)数组来记录即可

时间复杂度:\(log(le9)*(n*m+2^{2*m})\)

然后就是一些关于位运算的东西,要注意\((1<<m)\)这种东西最好加个括号....

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int a[N][10];
int cnt[1<<9];
int n,m;
bool check(int x)
{
	memset(cnt,0,sizeof cnt);
	for(int i=1;i<=n;i++)
	{
		int res=0;
		for(int j=1;j<=m;j++)
		{
			res=res*2+(a[i][j]>=x);
		}
		cnt[res]=i;
	}
	for(int i=0;i<=(1<<m)-1;i++)
	{
		for(int j=0;j<=(1<<m)-1;j++)
		{
			if(cnt[i]&&cnt[j]&&(i|j)==(1<<m)-1)return true;
		}
	}
	return false;
}
void ans(int x)
{
	memset(cnt,0,sizeof cnt);map<int,int>mp;
	for(int i=1;i<=n;i++)
	{
		int res=0;
		for(int j=1;j<=m;j++)
		{
			res=res*2+(a[i][j]>=x);
		}
		cnt[res]=i;
	}
	for(int i=0;i<=(1<<m)-1;i++)
	{
		for(int j=0;j<=(1<<m)-1;j++)
		{
			if(cnt[i]&&cnt[j]&&(i|j)==(1<<m)-1)
			{
				cout<<cnt[i]<<' '<<cnt[j]<<endl;return ;
			}
		}
	}
}
void solve()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	int l=0,r=1e9+10;
	while(l<r)
	{
		int mid=(l+1+r)>>1;
		if(check(mid))l=mid;
		else r=mid-1;
	}
	ans(l);
}
int main()
{
	int t=1;
	while(t--)solve();
}

标签:10,Educational,Rated,int,Codeforces,leq,cnt,dp
From: https://www.cnblogs.com/NIYAXIMEN/p/18589306

相关文章

  • Codeforces Round 990 (Div. 2) 题解 (A ~ E)
    A.AlyonaandaSquareJigsawPuzzle模拟即可#include<bits/stdc++.h>usingi64=longlong;voidsolve(){ intn;std::cin>>n; intcur=0; intans=0; for(inti=0,j=1;i<n;i++) { intx;std::cin>>x; cur+=x; ......
  • Educational Codeforces Round 172 (Rated for Div. 2)(A~D)
    比赛链接:https://codeforces.com/contest/2042这场爆了,卡死在C题了,QWQ.卡题得跳题啊!!!A.GreedyMonocarp题面:有\(n\)个箱子,第\(i\)个箱子最初包含\(a_i\)枚硬币。对于每个箱子,你可以选择任意非负数(0或更大)的硬币添加到该箱子中,有一个约束条件:所有箱子中的硬币总数必须变......
  • Educational Codeforces Round 172 (Rated for Div. 2) A ~ D
    EducationalCodeforcesRound172(RatedforDiv.2)广告:starrycoding九折优惠码(FV7B04LL)A思路需要拿至少\(k\)枚硬币.从大到小拿.拿到的硬币最少.题目没有要求补硬币的数目,要求回答的是拿最少硬币时至少补多少.而拿取的最小值最少为\(k\).求从大到小拿取到......
  • Educational Codeforces Round 172 (Rated for Div. 2) D. Recommendations
    算法听别人说这题比较简单,我来看看怎么个事转化题意,对于\(n\)条线段\([l_i,r_i]\),求每条线段被哪些线段完全覆盖,并求这些线段的交集减去其的长度显然的,\(j\)线段覆盖\(i\)线段,应该满足\(l_j\leql_i,r_i\leqr_j\)那么我们考虑将每一条线段当做一个点......
  • VMware Integrated OpenStack 7.3 现已支持 vSphere 8.0U3 和 NSX 4.2 互操作性
    VMwareIntegratedOpenStack7.3-VMware支持的OpenStack发行版VMware支持的OpenStack发行版:在VMware虚拟化技术之上运行企业级OpenStack云请访问原文链接:https://sysin.org/blog/vmware-vio-7/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareIn......
  • 【双堆懒删除】codeforces 1294 D. MEX maximizing
    前言双堆懒删除当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆\(ex\),新的堆为懒删除堆\(de\)。那么当需要从保存堆中删除任意一个元素时,可以先将元素放......
  • Educational Codeforces Round 169 (Rated for Div2)
    EducationalCodeforcesRound169(RatedforDiv.2)-CodeforcesProblem-A-Codeforces构造签到题,明显只有\(n\leq2\)的时候有解#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;typedefpair<int,int>pii;intn,m;inta[N];voidsolve(......
  • Educational Codeforces Round 171 (Rated for Div
    EducationalCodeforcesRound171(RatedforDiv.2)-CodeforcesProblem-A-Codeforces几何构造没什么好说的,\(45\)度交的时候长度最大#include<bits/stdc++.h>usingnamespacestd;constintN=3e5+10;voidsolve(){ intx,y,k;cin>>x>>y>>k; if(x......
  • E. Photoshoot for Gorillas(Codeforces Round 966 (Div. 3))
    https://codeforces.com/contest/2000/problem/E题目描述你非常喜欢屮大猩猩,于是你决定为它们组织一次拍摄活动。大猩猩生活在丛林中,丛林被表示为一个有n行m列的网格,有w个大猩猩同意参与拍摄,第i个大猩猩的身高ai.你希望将所有大猩猩放置在网格的单元格中,并且确保每个单......
  • 每日一题:https://codeforces.com/contest/1700/problem/B
    题目链接:https://codeforces.com/contest/1700/problem/B#include<iostream>#include<string.h>#include<string>#include<cmath>#include<algorithm>usingnamespacestd;intmain(){intu;cin>>u;for(inti=1;i......