首页 > 其他分享 >题解:「NOIP2022 提高组」种花

题解:「NOIP2022 提高组」种花

时间:2023-10-29 18:55:05浏览次数:36  
标签:ch mem 题解 sum leq 横线 种花 NOIP2022

题解:「NOIP2022 提高组」种花

题目大意:给定一个 \(n \times m\) 的01矩阵,0表示可以种花,1表示土坑(无法种花),现在要在图上种出一个C型或F型(C,F横着的两条线的长度都可以不同,但一定是面向右边的),现在问你种C和F分别有多少种方案(除了这个形状外不能在任何地方种花),多组数据,\(T \leq 5\)。 答案对998244353取模 。

原题面中对形状的定义是这样的:

一种种花方案被称为 \(\texttt{C-}\) 的,如果存在 \(x_1, x_2 \in [1, n]\),以及 \(y_0, y_1, y_2 \in [1, m]\),满足 \(x_1 + 1 < x_2\),并且 \(y_0 < y_1, y_2 \leq m\),使得第 \(x_1\) 的第 \(y_0\) 到第 \(y_1\) 、第 \(x_2\) 的第 \(y_0\) 到第 \(y_2\) 以及第 \(y_0\) 的第 \(x_1\) 到第 \(x_2\) 不为土坑,且只在上述这些位置上种花。

一种种花方案被称为 \(\texttt{F-}\) 的,如果存在 \(x_1, x_2, x_3 \in [1, n]\),以及 \(y_0, y_1, y_2 \in [1, m]\),满足 \(x_1 + 1 < x_2 < x_3\),并且 \(y_0 < y_1, y_2 \leq m\),使得第 \(x_1\) 的第 \(y_0\) 到第 \(y_1\) 、第 \(x_2\) 的第 \(y_0\) 到第 \(y_2\) 以及第 \(y_0\) 的第 \(x_1\) 到第 \(x_3\) 不为土坑,且只在上述这些位置上种花。

\(Subtask: n \leq 500\)

先考虑C形,发现当两横线位置固定时,竖线位置是固定的。所以只需关心横线对答案的贡献

横线对答案的贡献等于两横线长度之积,怎么快速求出每个点往右能延伸的最大长度呢?每一行从右往左做后缀和即可,预处理可以在 \(O(N^2)\) 内完成

考虑 \(O(N^3)\) 统计答案:

第一层循环枚举列数 \(j\)

第二层枚举上方横线所在行号 \(i\)

第三层枚举下方横线所在行号 \(k\)

记 \(r_{i,j}\) 表示点 \((i,j)\) 能向右延伸的最大长度,则有

\[ansc=\sum_{j=1}^{m}\sum_{i=1}^{n}\sum_{k=i+2}^{n}(r_{i,j}-1) \times (r_{k,j}-1) \]

那F形呢?发现就是在C的基础上在竖线下方加一截。

记 \(c_{i,j}\) 表示 \((i,j)\) 能向下延伸的最大长度,同样可以预处理后缀和,则有

\[ansc=\sum_{j=1}^{m}\sum_{i=1}^{n}\sum_{k=i+2}^{n}(r_{i,j}-1) \times (r_{k,j}-1) \times (c_{k,j}-1) \]

时间复杂度 \(O(TN^3)\) ,加上输出0的特判,期望得分67pts,但好像CCF数据太水,T根本没有5,所以实际得分75pts。

正解: $ n \leq 1000$

考虑怎么优化到 \(O(N^2)\) 或者 \(O(N^2logN)\) 。

发现固定 \(i,j\) 后, 涉及\(k\) 的部分可以进一步处理成前缀和。

所以记 \(sr_{i,j}\) 表示 \(\sum_{k=i}^{n} r_{k,j}-1\) ,\(ssr_{i,j}\) 表示 \(\sum_{k=i}^{n} (r_{k,j}-1) \times (c_{k,j}-1)\)

注意做的也是后缀和而不是前缀

然后就只需要枚举 \(i,j\) 即可,时间复杂度 \(O(N^2)\) , 期望得分100pts

#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
const int N=1010;
const ll mod=998244353;
int n,m,vc,vf,t,id;
char ch[N][N];
ll ansf,ansc,r[N][N],c[N][N],sr[N][N],ssr[N][N];
int main(){
//	freopen("plant.in","r",stdin);
//	freopen("plant.out","w",stdout);
	scanf("%d%d",&t,&id); 
	while(t--){
		ansf=0,ansc=0,mem(r),mem(c),mem(sr),mem(ssr),mem(ch);
		scanf("%d%d%d%d",&n,&m,&vc,&vf);
		F(i,1,n) scanf("%s",ch[i]+1);
		if(!vc && !vf){ puts("0 0"); continue; }
		F(i,1,n) G(j,m,1) ch[i][j]=='1'?r[i][j]=0:r[i][j]=r[i][j+1]+1;
		F(j,1,m) G(i,n,1) ch[i][j]=='1'?c[i][j]=0:c[i][j]=c[i+1][j]+1;
		F(j,1,m) G(i,n,1) {
			if(ch[i][j]=='1') continue;
			sr[i][j]=r[i][j]-1,ssr[i][j]=(r[i][j]-1)*(c[i][j]-1)%mod;
			if(ch[i+1][j]=='0' && i+1<=n) sr[i][j]=(sr[i][j]+sr[i+1][j])%mod,ssr[i][j]=(ssr[i][j]+ssr[i+1][j])%mod;
		}
		F(j,1,m){
			F(i,1,n-2){
				if(r[i][j]<=1 || ch[i+1][j]=='1' || ch[i+2][j]=='1') continue;
				ansc=(ansc+(r[i][j]-1)*sr[i+2][j]%mod)%mod;
				ansf=(ansf+(r[i][j]-1)*ssr[i+2][j]%mod)%mod;
			}
		}
		printf("%lld %lld\n",vc?ansc:0,vf?ansf:0);
	}
	return 0;
}

标签:ch,mem,题解,sum,leq,横线,种花,NOIP2022
From: https://www.cnblogs.com/superl61/p/17796207.html

相关文章

  • 【梦熊联盟】10月28日 NOIP十连测 第五场 题解
    目录T1男女排队简要题意:题解:T2树上最多不相交路径简要题意:题解:T3生日T4组队比赛简要题意:题解:T1男女排队简要题意:求长度为\(n\)的01序列不包含字串101或111的个数。\((n\leqslant10^{18})\)题解:一开始往容斥的思路去想,但是在推式子的时候发现其实很难容斥掉一个子串......
  • 常见问题解决 --- 安卓12关闭phantom processes killer杀后台功能
    1.adb连接成功后,执行adbdevices2.执行adbshell3.执行device_configset_sync_disabled_for_testspersistentdevice_configputactivity_managermax_phantom_processes2147483647settingsputglobalsettings_enable_monitor_phantom_procsfalse......
  • 常见问题解决 --- adb连接失败
    可能原因有,手机问题,电脑问题,线材问题。手机问题有:没有开启adb调试usb连接模式不是文件传输模式电脑问题有:adb驱动安装版本不匹配adb没有正确安装安卓驱动没有安装线材质量不好,断开 ......
  • VMware VCSA 5480 后台登录提示无法登陆问题解决
     通过控制台登入启用shell使用service-control--status--all查看applmgmt服务状态(显示已停止) 使用service-control--startapplmgmt启动服务 回车后会自动退出命令行模式 此时回到浏览器新建标签页重新登录5480端口成功    使用官网说明使用SingleS......
  • 【题解】P9753 [CSP-S 2023] 消消乐(字符串哈希,DP)
    【题解】P9753[CSP-S2023]消消乐不知道考场脑子是抽了还是有病,全程都不知道在放什么屁。特别鸣谢:@dbxxx给我讲解了解法一的满分做法,并让我对哈希有了更加深刻的认识;@Daidly给我讲解了解法二。题目链接P9753[CSP-S2023]消消乐题意概述给定一个长度为\(n\)的只含小......
  • AtCoder Beginner Contest 326 题解
    首先,\(\text{HappyBirthdaytome!}\)A-2UP3DOWN常规ABCA...//If,oneday,Ifinallymanagetomakemydreamsareality...//Iwonder,willyoustillbetherebymyside?#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false)#defineTI......
  • P2514 [HAOI2010] 工厂选址 题解
    目录DescriptionSolutionCodeDescription有\(m\)座煤矿,每一座煤矿有\(a_i\)吨煤,第\(i\)座煤矿到第\(j\)号发电厂的运费为\(c_{i,j}\)每吨。有一座发电厂(标号为0),需要恰好\(b\)吨煤矿发电,初始运行费用为\(h\)。还有\(n\)座待运行的发电厂(标号为1~n),每座发电厂初......
  • ctf_show Web的Web8题解
    好久没写博客,上次写还是在上次(三年前)。如题,写一次CTF的题解 根据题目提示得知这应该是一个注入,什么注入还不知道,进入靶场。 仅有三个地方可点,都点进去看看。从URL处可以看到前端是传了一个参数id给后端(另外两个类似,就不贴图了)。那很明显了是SQL注入。 首先在参数后......
  • 【深度学习 | 概念】那些深度学习路上必经的 常见问题解决方案及最佳实践,确定不来看看
    ......
  • CSP-J 2023 题解
    CSP-J2023题解T1小苹果这个题直接遍历枚举必定TLE,这是CCF的出题风格,每题T1巨水无比,但是往往又需要一些思维。这道题我们可以发现每一轮操作都会拿走\(1+(n-1)/3\)个苹果,所以每次让\(n\)减去\(1+(n-1)/3\)就可以了。然后记录编号为\(n\)什么时候拿......