首页 > 其他分享 >CF1353E K-periodic Garland 题解

CF1353E K-periodic Garland 题解

时间:2024-03-07 14:33:25浏览次数:19  
标签:ch return Garland int 题解 il auto CF1353E define

分析

考虑 DP。

定义状态函数 \(f_i\) 表示处理完前 \(i\) 个字符且第 \(i\) 个字符为 \(1\) 时的最小代价。则对于 \(i\),有两种情况:

  1. \(i\) 不是第一个 \(1\),则上一个 \(1\) 的位置必定为 \(i-k\)。
  2. \(i\) 是第一个 \(1\),没有上一个 \(1\)。

得到转移方程:\(f_i = \min (f_{\max(0,i-k)}+w(\max(0,i-k),i-1),w(0,i-1))+[c_i \ne 1]\)。其中 \(w(l,r)\) 表示 \([l,r]\) 中 \(1\) 个数量,也就是将区间全部变成 \(0\) 的最小代价。

对于答案,枚举最后一个 \(1\) 的位置,然后后面的 \(1\) 全部变成 \(0\)。即 \(ans= \min\limits_{i=0}^{n}f_i+w(i+1,n)\)。

复杂度 \(O(n)\)。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define pii pair<int,int>
#define x first
#define y second
#define gc getchar()
#define rd read()
#define debug() puts("------------")

namespace yzqwq{
	il int read(){
		int x=0,f=1;char ch=gc;
		while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc;}
		while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=gc;
		return x*f;
	}
	il int qmi(int a,int b,int p){
		int ans=1;
		while(b){
			if(b&1) ans=ans*a%p;
			a=a*a%p,b>>=1;
		}
		return ans;
	}
	il auto max(auto a,auto b){return (a>b?a:b);}
	il auto min(auto a,auto b){return (a<b?a:b);}
	il int gcd(int a,int b){
		if(!b) return a;
		return gcd(b,a%b);
	}
	il int lcm(int a,int b){
		return a/gcd(a,b)*b;
	}
	il void exgcd(int a,int b,int &x,int &y){
		if(!b) return x=1,y=0,void(0);
		exgcd(b,a%b,x,y);
		int t=x;
		x=y,y=t-a/b*x;
		return ;
	}
	mt19937 rnd(time(0));
}
using namespace yzqwq;

const int N=1e6+10;
int n,k;
int f[N],s[N];
char c[N];

il int w(int l,int r){
	if(l>r) return 0;
	return s[r]-s[l-1];
}

il void solve(){
	n=rd,k=rd,scanf("%s",c+1);
	for(re int i=1;i<=n;++i) s[i]=s[i-1]+c[i]-'0';
	int ans=1e9+7;
	for(re int i=1;i<=n;++i)
		f[i]=min(f[max(0*1ll,i-k)]+w(max(0*1ll,i-k)+1,i-1),f[0]+w(1,i-1))+(c[i]!='1');
	for(re int i=0;i<=n;++i)
		ans=min(ans,f[i]+w(i+1,n));
	printf("%lld\n",ans);
	return ;
}

signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int t=rd;while(t--)
	solve();
	return 0;
}

标签:ch,return,Garland,int,题解,il,auto,CF1353E,define
From: https://www.cnblogs.com/harmisyz/p/18058839

相关文章

  • P10120『STA - R4』冰红茶 题解
    分析出得很好,模板套模板,希望下次再来。难点在于维护最后连续喝的DS饮料数量。设这次喝原味饮料的区间为\([l,r]\),上一次为\([l',r']\)。则有两种情况:\([l,r]\)与\([l',r']\)不相交。如:在\([l',r']\)和\([l,r]\)两个区间中的DS连续喝的同种饮料数量都会变成\(k......
  • AT_abc343_f [ABC343F] Second Largest Query 题解
    分析考虑乱搞。对于求次大值,用线段树维护就行了。记录下每个区间的最大、次大值。则两个子区间的父区间的最大值就是这四个最大的,次大值就是这四个次大的。复杂度\(O(\logn)\)。求次大值的出现次数,乱搞就行了。因为带修,带修莫队或者分块有些麻烦。其实用线段树就行。在维护区......
  • P8058 [BalkanOI2003] Farey 序列 题解
    分析考虑二分答案。对于当前二分的答案\(x\),设\(cnt\)表示Farey序列中\(\frac{p}{q}\lex\)的满足条件的数量。对于一组\((i,j)\),若\(\frac{j}{i}\lex\),则\(j\le\lfloori\timesx\rfloor\)。得到暴力式子:\[cnt=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{\lfloo......
  • P9989 [Ynoi Easy Round 2023] TEST_69 题解
    分析考虑线段树。\(20\)分统计节点懒标记,在每次询问之前统一下传\((lst,i-1)\)的修改懒标记,\(lst\)是上一次询问的位置。\(40\)分在统一下传的过程中打标记,如果当前节点的某个儿子所在子树中没有需要下传懒标记的节点,则不更新那个儿子的内容。\(70\)分注意到\(a\)......
  • CF1915G Bicycles 题解
    分析参照去年普及组T4,很显然能发现就是一个暴力最短路。设\(dis_{i,j}\)表示从\(1\)走到\(i\)且能得到的\(s\)最小为\(j\)时的最短路。那么答案就是\(\min\{dis_{n,i}|1\lei\leV\}\)。考虑最短路转移。对于当前的\(dis_{u,j}\),走到\(v\)的代价将会是\(w_{u......
  • AT_abc252_g [ABC252G] Pre-Order 题解
    分析考虑区间DP。定义状态函数\(\mathit{f}_{l,r,1/0}\)表示在\(P_l,P_{l+1},\dots,P_r\)这些点中,\(P_l\)是或不是唯一(子)树根时的答案。对于\(\mathit{f}_{l,r,1}\),\(P_l\)的第一个儿子一定是\(P_{l+1}\)。所以有:\(f_{l,r,1}=f_{l+1,r,1/0}\)(\(P_{l+1}\)是或不是\(P......
  • AT_abc338_f [ABC338F] Negative Traveling Salesman 题解
    分析考虑状压。定义状态函数\(f_{i,j}\)表示在经过点的情况为\(i\)且最后停在点\(j\)的最小花费。那有:\(f_{i,j}=\min\{f_{i',k}+w_{k\toj}|k\toj\}\)。然后就过不了样例一。根据样例一,可以发现\(f_{3,2}=f_{2,2}+w_{2\to1}+w_{1\to2}\)。也就是说我们在原本已经走......
  • P4958 [COCI2017-2018#6] Mate 题解
    分析考虑DP。先考虑\(A\)的答案。定义状态函数\(f_{i,j}\)表示在子串\(S_{1\dotsi}\)中选\(j\)个,且第\(S_i\)必选的方案数。则有:\(f_{i,j}=C_{i-1}^{j-1}\)。再考虑\(B\)的答案。枚举每一个位置\(x\)。令\(sum_x=\sum\limits_{i=1}^{x-1}f_{i,n-1}[S_i=A]\)。......
  • AT_abc283_f [ABC283F] Permutation Distance 题解
    分析分类讨论。对\(|p_i-p_j|+|i-j|\)分类讨论,有:\((p_i+i)-(p_j+j)\),\(p_i>p_j\landi>j\)。\(-(p_i-i)+(p_j-j)\),\(p_i<p_j\landi>j\)。\((p_i-i)-(p_j-j)\),\(p_i>p_j\landi<j\)。\(-(p_i+i)+(p_j+j)\),\(p_i<p_j\landi<j......
  • CF38E Let's Go Rolling! 题解
    分析考虑DP。因为\(n\le3000\),我们可以直接枚举插针的位置。定义状态函数\(f_i\)表示在从左往右第\(i\)个小球的位置上插针的最小花费。枚举该小球右边第一个插针的位置,则\(i\)到\(j-1\)的小球都会滚到小球\(i\)的位置。代价为\(\sum\limits_{k=i}^{j-1}x_k-x_i......