首页 > 其他分享 >CF729B Spotlights 题解

CF729B Spotlights 题解

时间:2024-05-05 12:55:05浏览次数:22  
标签:CF729B Spotlights int 题解 cin ans 上方 dp define

题目简述

给出一个 $n$ 行 $m$ 列的 $01$ 矩阵,定义每个点的价值为上下左右四个方向有 $1$ 的方向数,求所有为 $0$ 的点的价值和。

题目分析

我们首先可以考虑暴力,但是发现是不行的。于是我们考虑动态规划

设 $dp_{i,j,0/1/2/3}$ 分别表示 $(i,j)$ 这个点上方,左方,下方,右方是否有 $1$。接下来考虑如何转移,我们先考虑上方,显然当 $a_{i-1,j}=1$ 时,$dp_{i,j,1} \leftarrow 1$。如果 $dp_{i-1,j,1}=1$,这也说明 $(i,j)$ 上方有 $1$,所以也有 $dp_{i,j,1} \leftarrow 1$。知道了上方怎么转移,那么其他三个方向也是一样的道理。但是要注意左方和下方的转移顺序。时间复杂度 $\mathcal{O}(n \times m)$,可以通过。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define random(a,b) (rand()%(b-a+1)+a)
#define se second
#define fi first
#define pr pair<int,int>
#define pb push_back
#define ph push
#define ft front
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,a,b) for(int i=a;i>=b;i--)
const int N=1010;
int n,m,a[N][N],ans,dp[N][N][4]; 
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
	For(i,1,n)
	{
		For(j,1,m)
		{
			cin>>a[i][j];
		}
	} 
	For(i,1,n)
	{
		For(j,1,m)
		{
			if(!a[i][j])
			{
				dp[i][j][0]=dp[i-1][j][0]|a[i-1][j];//利用位运算精简一下
			    dp[i][j][1]=dp[i][j-1][1]|a[i][j-1];
			    ans+=dp[i][j][0]+dp[i][j][1];
			}
		}
	}
	Rep(i,n,1)
	{
		Rep(j,m,1)
		{
			if(!a[i][j])
			{
				dp[i][j][2]=dp[i+1][j][2]|a[i+1][j];
			    dp[i][j][3]=dp[i][j+1][3]|a[i][j+1];
			    ans+=dp[i][j][2]+dp[i][j][3];
			}
		}
	}
	cout<<ans;
	return 0;
}

标签:CF729B,Spotlights,int,题解,cin,ans,上方,dp,define
From: https://www.cnblogs.com/zhuluoan/p/18173424

相关文章

  • [SCOI2007] 蜥蜴 题解
    发现实际上就是在求有多少只蜥蜴能逃出来。发现可以将柱子拆成入点和出点两部分,自己的出点向别人的入点连边,自己的入点向自己的出点连边。最后再加一个超级源点\(S\),连接所有有蜥蜴的柱子入点;再加一个超级汇点\(T\),连接所有能够跳出地图的柱子。我们猛然发现:这个问题不就是求......
  • 题解:AT_abc352_C [ABC352C] Standing On The Shoulders
    考场憋了很久,最后代码贼短……理想状态下,直接全排列解决问题。但是,\(1\len\le2\times10^5\),明显TLE,试都不用试的。咋优化呢?其实,前面的巨人只负责“打地基”,作为“塔尖儿”的巨人有且仅有1个。而前面地基随便排列,地基高度(他们的和)都不会变。所以,我们只需要枚举塔尖即......
  • 牛客小白月赛92 题解
    牛客小白月赛92题解A.获得木头签到\((x\times4)/2\times4=x\times8\)#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebug(x......
  • 牛客 215E 黄魔法师 题解
    Description给出\(n,k\),求一个长度为\(n\)的数组\(a\),满足有恰好\(k\)对数对\((i,j)(1\leqi<j\leqn)\)满足\(a_i+a_j\)为完全平方数。如果不存在,输出\(-1\)。linkSolution显然如果\(k>\binom{n}{2}\)就一定无解。构造时会发现肯定要尽量弄成相同的......
  • 题解【[ABC155F] Perils in Parallel】(未完成)
    题目链接两个常规转化:灯的坐标与区间坐标都很大,不妨将其离散化,转化为\(1\simn\)的点与\(1\simn\)的操作区间。对于一段区间取反,可以理解为对一段区间异或\(1\),转化为在异或差分数组上操作,即差分数组\(diff_i=a_i\bigoplusa_{i-1}\),区间\([l,r]\)异或\(1\)转化为差......
  • 5月3日模拟赛题解(李时珍的皮肤衣 , 马大嘴的废话 , SSY的队列 , 清理牛棚 , 历史の研究)
    T1李时珍的皮肤衣发现是二进制进位,所以直接快速幂即可。#include<bits/stdc++.h>#defineint__int128inlineintread(){charch=getchar();intx=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'......
  • 题解:ssy的队列
    题目链接题目描述SSY是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有\(N\)个身高互不相同的同学,请你求出这\(N\)个人的所有排列中任意两个相邻同学的身高差均不为给定整数\(M\)的倍数的排列总数。输入格式共三行:第一行为\(N\)第二行为\(N\)个不同的......
  • P10064 [SNOI2024] 公交线路 题解
    弱化版:CF1827EBusRoutes。对于\(n=2\)的情况可以判掉,剩下的情况取一个度数大于一的点作为根。首先发现如果叶子间满足条件,那么整棵树也满足条件。考虑叶子间什么时候满足条件,记点\(x\)通过最多一条路径可以到达的所有点的集合为\(S_x\),则需满足\(\forallx,y\in\mathbf......
  • [国家集训队] 矩阵乘法 题解
    发现实际上就是二维静态区间最大值,可以用整体二分维护。时间复杂度\(O((q+n^2)\log\max(a_{i,j})\logn^2)\)。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintW=310005;constintQ=6e4+5;intn,q,w,ans[Q];intc[505][505],m;voidadd(i......
  • 题解【[ABC147F] Sum Difference】
    题目链接下为口胡题解:入手方向推导:直接考虑题目所给式子显然困难:\[w(S)=\sum_{i\inS}A_i-\sum_{i\notinS}A_i\]因为两个式子虽然相关但是都在变化,不妨转化为:\[w(S)=2\times\sum_{i\inS}A_i-\sum_{i=1}^nA_i\]这样只用求出有多少个不同的\(\sum_{i\inS}A_i\)。由于......