首页 > 其他分享 >Codeforces Round 893 (Div. 2) D

Codeforces Round 893 (Div. 2) D

时间:2024-04-10 22:46:36浏览次数:28  
标签:pre 893 sizeof ll memset Codeforces 这题 思路 Div

链接

第一个想法:\(O(n^2)\)可过,很明显,我可以直接统计出来每一个位置作为中心,向两边扩展最多能得到的多少个连续的1。

这个想法是不成熟的,但是我甚至开始写了。哎。然后写了140行,发现寄了,思路太复杂,完全用不了。

这里就引出了一个事情:太复杂的思路其实不能算是思路,因为表达是不可能这么复杂的。这是一定要纳入出题人的考虑之中的。

所以当想到一个可行,但是实现想想都巨复杂,就不要当成是训练代码能力了。一个简单而优美的实现思路是非常值得学习的。

对于这题,其实就是在锻炼实现思路的简洁。我觉得这题对我是可以说到2400左右难度的,但是思路确实一点都不难想。\(O(n^2)\)的限制实在是特别宽裕。你不管怎么样,随便统计答案都可以。

而这个实现思路在我看来是真的非常优秀的,简洁,优美,我看到他代码的思路的时候就感觉很喜欢。

对于这题,我们其实可以直接钦定一段,把这段全部都变成1,然后再计算两边最长的。而我们把这段全部变成1所花的代价是固定的,也就是我们不需要枚举k,可以直接通过枚举这段的左右端点来计算答案。

这也就是我们的实现思路了。
我也想能想出来这种思路。。这个和思维习惯相关吧,这个题目的要求毕竟太松,想要准确的想到这个好写的思路,还是有点碰运气的。
但是我觉得总体上可以得到一个办法,就是先去固定难以描述的,或者是先找到一个,把这个固定下来能够简单的描述尽可能多的东西的东西。这题里面,直接固定l,r,就很方便,然后再根据这个需求去算其他东西。
但是,要想到这思路,那我可能想做法的时候就要想到了。但是我现在还是跟习惯从左到右的dp。
以后想的时候可以试试看,如果我直接把左右端点固定下来,会不会很方便?

只能这样了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read() {
	char c=getchar();ll a=0,b=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
	for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;return a*b;
}
ll n,k,pre[3001][3001],f[3001],sub[3001][3001],ans[3001];
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ll T=read();
	while(T--)
	{
		n=read(),k=read();
		string s;
		cin>>s;
//		memset(sub,0,sizeof(sub));
//		memset(pre,0,sizeof(pre));
//		memset(ans,0,sizeof(ans));
//		memset(f,0,sizeof(f));
		for(ll i=0;i<=n;i++)
		{
			ans[i]=f[i]=-1e9;
			for(ll j=0;j<=n;j++)
			{
				pre[i][j]=sub[i][j]=0;
			}
		}
		for(ll l=0;l<n;l++)
		{
			ll cnt1=0;
			for(ll r=l+1;r<=n;r++)
			{
				if(s[r-1]=='1')cnt1++;
				pre[r][cnt1]=max(pre[r][cnt1],r-l);
				sub[l][cnt1]=max(sub[l][cnt1],r-l);
			}
		}
		for(ll r=0;r<=n;r++)
		{
			for(ll j=0;j<=n;j++)
			{
				if(r!=0)pre[r][j]=max(pre[r][j],pre[r-1][j]);
				if(j!=0)pre[r][j]=max(pre[r][j],pre[r][j-1]);
			}
		}
		for(ll l=n;l>=0;l--)
		{
			for(ll j=0;j<=n;j++)
			{
				if(l!=n)sub[l][j]=max(sub[l][j],sub[l+1][j]);
				if(j!=0)sub[l][j]=max(sub[l][j],sub[l][j-1]);
			}
		}
		for(ll l=0;l<n;l++)
		{
			ll cnt0=0;
			for(ll r=l;r<=n;r++)
			{
				if(r!=l&&s[r-1]=='0')cnt0++;
				if(cnt0>k)break;
				f[r-l]=max(f[r-l],max(sub[r][k-cnt0],pre[l][k-cnt0]));
			}
		}
		for(ll i=0;i<=n;i++)
		{
			for(ll a=1;a<=n;a++)
			{
				ans[a]=max(ans[a],f[i]*a+i);
			}
		}
//		cout<<f[1]<<endl;
		for(ll i=1;i<=n;i++)
		{
			cout<<ans[i]<<' ';
		}
		cout<<endl;
	}
	return 0;
}

标签:pre,893,sizeof,ll,memset,Codeforces,这题,思路,Div
From: https://www.cnblogs.com/HLZZPawa/p/18127692

相关文章

  • Codeforces Round 938 (Div. 3) A-H 题解
    A-YogurtSaleSolution当\(2a>b\)时,显然用\(a\)来买两个比较好,否则就用\(b\)来买两个比较好Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;inta,b;cin>>a>>b;b=min(b,a*2);int......
  • Codeforces-182E 题解
    Vasyahasrecentlyboughtsomelandanddecidedtosurrounditwithawoodenfence.Hewenttoacompanycalled"Woodenboard"thatproduceswoodenboardsforfences.Vasyareadinthecatalogofproductsthatthecompanyhasatitsdisposal\(......
  • Codeforces Round 938 (Div. 3)题解(A-E)
    A.YogurtSale题意:输入一份酸奶a元,两份b元,求买n份酸奶最少要多少钱。#include<iostream>#include<string>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongll;constintN=1e6+7;voidsolve(){ intn,a,b;cin>>n>>......
  • Codeforces Round 938 (Div. 3) E
    链接有点意思的题目。首先可以得到的一个结论就是,如果k能够完成,那唯一的操作方法就是从前往后,遇到0就使用,把这个点变成1。那么我们就能够做到O(n)验证了,然后发现O(n^2)可以接受,就过了。但是我因为滥用数据结构,导致我认为验证需要O(nlogn)然后5000又刚刚好跑不过去。所以觉得......
  • Codeforces Global Round 25 E
    链接其实还是很好写的。其实很明显,手玩一下就可以发现只用1次或者两次就可以分完,否则就是以下3中情况。aaaaaaaaabaaaabababa这个证明很简单。难在怎么想。其实就是手玩以下,看看怎么样分不了,然后就可以了。样例具有一定的迷惑性,还是很好解决的。然后马拉车数组清空要清到......
  • P4677DeerInZooDivOne
    费用流#二分图最大权匹配#dp\(dp_{x,y}\)表示以\(x,y\)为对应点的最大同构子树的大小对于一对点,转移为将\(x,y\)中的点按照一定顺序对应那么问题转化为如何求一组匹配,使得两两匹配的权值尽可能大,即一个二分图最大权匹配,可以费用流解决然后枚举断开的每条边,对左右都做上......
  • P4112DrawingPointsDivOne
    二分具有单调性,考虑二分答案对于\(x\)考虑怎么\(check\),可以暴力的展开\(x\)次,再缩小\(x\)次,如果得到的结果和初始状态相同,那么就合法,否则不合法//Author:xiaruizeconstintN=1e3+10;intn;piia[N];bools[N][N],cur[N][N],mp[N][N];boolcheck(intx)......
  • 2024.4.7 训练1(rating) Codeforces Global Round 25
    https://codeforces.com/contest/1951题解参考:https://zhuanlan.zhihu.com/p/691034931A题一开始的思路比较绕,wa很多发卡了半小时才过。hansun的思路比较硬直,他在极短的时间内过了Ahansun的题解:https://codeforces.com/contest/1951/submission/255262403我的想法是分奇偶情......
  • CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!)
    目录写在前面ABC1C2DE写在最后写在前面比赛地址:https://codeforces.com/contest/1942。过了这么长时间才来补太唐了、、、赛时写D写了一坨呃呃,用刷表法总是不可避免地要多枚举一个\(O(n)\)比较+转移妈的,赛后一看填表法+堆就不用枚举了笑烂了A签到。完全相等的数列随便......
  • Codeforces 1906H Twin Friends
    考虑到\(N\)的字符组成其实是固定的。所以可以把方案数拆为\(A\)的方案数\(\times\)\(A,B\)相匹配的方案数。对于\(A\)的方案数,就是多重集组合数,为\(\dfrac{n!}{\prod\limits_{i=0}^{25}(cnt_{A,i}!)}\)。接下来考虑求解\(A,B\)相匹配的方案数。考虑到对于......