题解:「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\) ...
随机推荐
- Grafana的仪表盘URL参数设置
转载请注明出处: 在调试grafana时,需要对grafana进行share的url图表进行一些自定义设置,总结下常用的参数 参考网站:https://grafana.com/docs/grafana ...
- Kruskal和Prim模板
例题:P3366 [模板]最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Kruskal #include <bits/stdc++.h> #define d ...
- 使用python-slim镜像遇到无法使用PostgreSQL的问题
前言 之前不是把 DjangoStarter 的 docker 方案重新搞好了吗 一开始demo部署是使用 SQLite 数据库的,用着没问题,但很快切换到 PostgreSQL 的时候就遇到问题了- ...
- JavaScript设计模式样例十三 —— 模版方法模式
模板方法模式(Template Method Pattern) 定义:一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.目的:一些方法通用 ...
- vscode使用说明
# 要经常保存 # centos打开vscode方式 普通用户:[bw@localhost ~]$ /usr/share/code/bin/code 超级用户:[root@localhost shar ...
- Ansible-playbook 应用梳理
前面已经介绍过Ansible的安装配置及常见模块的使用 --<Linux下使用Ansible处理批量操作> Palybook简介 palybook是由一个或多个paly组成的列表,play ...
- WPF 如何利用Blend给Button添加波纹效果
先看一下效果吧: 如果不会写动画或者懒得写动画,就直接交给Blend来做吧; 其实Blend操作起来很简单,有点类似于在操作PS,我们只需要设置关键帧,鼠标点来点去就可以了,Blend会自动帮我们生成 ...
- Go context 介绍
在 Go 编程语言中,context 包提供了一个用于在 goroutine 之间传递上下文信息的方法.它通常用于控制 goroutine 的生命周期.传递请求范围内的数据.以及处理超时或取消信号.c ...
- mysql 8.0.18 根据.ibd文件和建库SQL恢复数据
前提:执行建库SQL,(包括建表的SQL) 1. 在mysql 的data文件夹中,找到需要恢复的DB名称,清除其文件夹下的所有文件,将待恢复的.ibd文件复制到此文件夹内 2. 执行SQL,然后查询 ...
- JSP的文件上传和下载
文件的上传和下载 文件的上传和下载,是非常常见的功能.很多的系统中,或者软件中都经常使用文件的上传和下载. 比如:微信头像,就使用了上传. 邮箱中也有附件的上传和下载功能. 文件的上传介绍 1.要有一 ...