Codeforces 1738G - Anti-Increasing Addicts(思维题)

好题啊!果然还是 anton 出的题人类智慧!(复刻)

首先根据 dilworth 定理,最长反链等于最小链覆盖,由于一个状态合法当且仅当其最长反链大小 \(\le k-1\),因此如果我们把横纵坐标都递增的点列视作从左上到右下的话,那么一个状态合法又等价于我可以用 \(k-1\) 条左下到右上的路径覆盖所有未被删除的点,而稍加思考就会发现,\(k-1\) 条路径最多覆盖的点数就是 \(n^2-(n-k+1)^2\)!这是因为第一条路径最多覆盖 \(2n-1\) 个点,第二条路径最多覆盖 \(2n-3\) 个点,以此类推,求和就可以得到 \(n^2-(n-k+1)^2\)

这样问题转化为,我需要用 \(k-1\) 条路径覆盖所有不可以删除的位置(也就是输入的所有 \(0\) 的位置)。显然我们可以贪心地让第 \(i\) 条反链从 \((n,i)\) 开始,在 \((i,n)\) 结束。考虑让第 \(i\) 条反链覆盖哪些 \(0\) 点,记 \(f_{i,j}\) 表示以 \((i,j)\) 开始的最长的由 \(0\) 点组成的横纵坐标均严格递增的序列。显然如果存在 \(f_{i,j}\ge k\) 答案就是 NO 了。否则我们希望第 \(i\) 条反链能够覆盖所有 \(f_{x,y}=k-i\)\((x,y)\)——显然类比 LIS,这样的 \((x,y)\) 肯定不存在两个满足其中一个横纵坐标均严格大于另一个,因此总是存在反链经过它们的,当然我们还要要求任意两条反链不交,因此我们考虑这样安排第 \(i\) 条反链的路径:尽量向上走,如果上面的点被其他反链经过或者发现向上走会错过某个 \(f_{x,y}=k-i\) 的点就向右,具体实现的话大概对 \(f_{x,y}\) 求个前缀 \(\max\),这样可以快速知道右边有没有 \(f_{x,y}=k-i\) 的点。

时间复杂度 \(O(n^2)\)

const int MAXN=1000;
int n,k,a[MAXN+5][MAXN+5],dp[MAXN+5][MAXN+5],lim[MAXN+5][MAXN+5],vis[MAXN+5][MAXN+5];
void solve(){
	scanf("%d%d",&n,&k);
	for(int i=0;i<=n+1;i++)for(int j=0;j<=n+1;j++)dp[i][j]=lim[i][j]=vis[i][j]=0;
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%1d",&a[i][j]);
	for(int i=n;i;i--)for(int j=n;j;j--){
		dp[i][j]=max(dp[i+1][j],dp[i][j+1]);
		if(a[i][j]==0)chkmax(dp[i][j],dp[i+1][j+1]+1);
		if(a[i][j]==0&&!lim[dp[i][j]][j])lim[dp[i][j]][j]=i;
		if(dp[i][j]==k)return puts("NO"),void();
	}
	for(int i=1;i<k;i++)for(int j=n;j;j--)chkmax(lim[i][j],lim[i][j+1]);
	// for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)printf("%d%c",dp[i][j]," \n"[j==n]);
	// for(int i=1;i<k;i++)for(int j=1;j<=n;j++)printf("%d%c",lim[i][j]," \n"[j==n]);
	for(int i=1;i<=n;i++)vis[0][i]=1;
	for(int i=k-1;i;i--){
		int x=n,y=1;while(vis[x][y])++y;
		while(y<=n){
			vis[x][y]=1;
			if(vis[x-1][y])y++;
			else if(x==lim[i][y+1])y++;
			else --x;
		}
	}puts("YES");
	for(int i=1;i<=n;i++,printf("\n"))for(int j=1;j<=n;j++)printf("%d",vis[i][j]);
}
int main(){
#ifdef LOCAL
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
#endif
	int qu;scanf("%d",&qu);while(qu--)solve();
	return 0;
}
posted @ 2022-12-23 19:16  tzc_wk  阅读(59)  评论(0)    收藏  举报