题解:「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)\) 能向右延伸的最大长度,则有
\]
那F形呢?发现就是在C的基础上在竖线下方加一截。
记 \(c_{i,j}\) 表示 \((i,j)\) 能向下延伸的最大长度,同样可以预处理后缀和,则有
\]
时间复杂度 \(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;
}
题解:「NOIP2022 提高组」种花的更多相关文章
- 「洛谷P1080」「NOIP2012提高组」国王游戏 解题报告
		P1080 国王游戏 题目描述 恰逢 \(H\)国国庆,国王邀请\(n\)位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 \( ... 
- 【题解】NOIP2016提高组 复赛
		[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ... 
- 【题解】NOIP2015提高组 复赛
		[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ... 
- 【题解】NOIP2017 提高组 简要题解
		[题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ... 
- 【题解】NOIP2016 提高组 简要题解
		[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ... 
- [题解+总结]NOIP2013-2014提高组题目浅析
		1.前言 迎接NOIP的到来...在这段闲暇时间,决定刷刷水题.这里只是作非常简单的一些总结. 2.NOIP2014 <1> 生活大爆炸之石头剪刀布(模拟) 这是一道考你会不会编程的题目. ... 
- 【华容道】题解(NOIP2013提高组day2)
		分析 这道题很容易想到令f[x][y][x1][y1]表示空白块在(x,y).指定棋子在(x1,y1)时的最少步数,让空白块和四周的棋子交换,当空白块要和指定棋子交换时,把指定棋子移动,搞一下BFS就 ... 
- 题解 P1850 [NOIP2016 提高组] 换教室
		做完这道题才略微感觉自己懂了一点关于概率与期望的知识QAQ... 一:关于概率与期望的定义 转载节选于blog 1.什么是数学期望? 数学期望亦称期望.期望值等.在概率论和统计学中,一个离散型随机变量 ... 
- 题解 「BZOJ4919 Lydsy1706月赛」大根堆
		题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有权值,从中选出一些点,使得满足大根堆的性质.(即一个点的祖先节点如果选了那么该点的祖先节点的权值一定需要大于该点权值) 问能选出来的大根堆 ... 
- 题解 「BJOI2018 治疗之雨」
		题目传送门 题目大意 有一个初始为 \(p\) 的数,每次操作分为以下两个: 有 \(\frac{1}{m+1}\) 的概率$+1,但是中途 \(p\) 的最大值只能为 \(n\)$ 有 \(k\) ... 
随机推荐
- WPF 实现图标按钮
			假设需要实现一个图标和文本结合的按钮 ,普通做法是 直接重写该按钮的模板: 如果想作为通用的呢? 两种做法: 附加属性 自定义控件 推荐使用附加属性的形式 第一种:附加属性 创建Button的附加属性 ... 
- Linux驱动| Linux内核 RTC时间架构
			上一篇文章我们给大家讲解了基于瑞芯微rk3568平台芯片hym8563驱动的移植,本文给大家详细讲解Linux内核的时间子系统. <Linux驱动|rtc-hym8563移植笔记> 一.L ... 
- 使用Packer构建镜像
			什么是Packer Packer 是一个强大的工具,它可以帮助我们轻松地构建各种类型的镜像,如虚拟机镜像.Docker 镜像等. Packer 的工作原理是通过定义一个配置文件,该文件描述了要构建的镜 ... 
- protostuff序列化接口封装
			1.pom <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId> ... 
- Java Swing Loading转圈的进度提示框
			Java Swing Loading转圈的进度提示框 具体只需要两个类 AnimatedPanel.java InfiniteProgressPanel.java 前因:我们开发的web应用,有个奇葩 ... 
- win10自动更新导致的任务栏假死,右键单击任务栏延迟菜单延迟出现
			系统是win10企业版,前天晚上回家之前,电脑还是好好的,然后前天早上跑过来以后,发现电脑自动重启了,我还以为是办公室停电了之类的(现在想了一下愚蠢,停电不会自动开机),没想到是自动更新 然后我发现, ... 
- 【YashanDB数据库】VMware虚拟机使用默认安装,在掉电之后数据库无法启动
			问题现象 客户使用VMware虚拟机使用默认安装,部署YashanDB个人版,在掉电之后无法启动 操作系统: Virtualization: VMware Operating System: Cent ... 
- CSS – Grid
			前言 有一种布局方式叫 Layout Grid 网格布局. 在 Figma – Layout Grid 有介绍过. 在 RWD 概念篇 也有讲到过 要实现这种布局, 可以用 Flex 也可以用 Gri ... 
- 用C#写个PDF批量合并工具简化日常工作
			一. 前言 由于项目需要编写大量的材料,以及各种签字表格.文书等,最后以PDF作为材料交付的文档格式,过程文档时有变化或补充,故此处理PDF文档已经成为日常工作的一部分. 网上有各种PDF处理工具,总 ... 
- WordPress产品分类添加,自动排序插件
			效果图如下 目前这个预览菜单这个效果有点问题,但是不影响实际排序,有懂源码的朋友可以自行修改一下,目录结构menu -assets menu.css menu.js menu.php 源码如下menu ... 
