P8865 [NOIP2022] 种花
简要题意
\(T\) 组数据,给你一个 \(n\times m\) 的 \(01\) 矩阵。 \(0\) 部分可以组成 \(A_c\) 个 \(\texttt{C}\) 型图案和 \(A_f\) 个 \(\texttt{F}\) 型图案。你需要输出 \(A_c \times c \bmod 998244353,A_f \times f \bmod 998244353\)。
\(1\leq T \leq 5,1 \leq n,m \leq 10^3,c\in\{0,1\},f\in\{0,1\}\)
思路
纪念考场手切的 NOIP T1。
预处理 \(r_{i,j},d_{i,j}\) 表示向右、向下 \(0\) 可以延申到多少格以外。如:
0010
0000
0001
1010
0111
其中 \(r_{2,2}=2,d_{2,2}=2\).
首先考虑 \(\texttt{C}\) 型图案。由上面一横,中间一竖,下面一横组成。考虑枚举左上角 \((i,j)\),那么以这个点为左上角的 \(C\) 型图案就可以求出来了:
\]
解释:左下角为 \((i,k)\)。下限加 \(2\) 因为竖长最少为 \(1\)。求和的式子运用了乘法原理。
\(F\) 型图案只比 \(C\) 多了下面那一竖。我们也可以方便的推出式子:
\]
这样子暴力算是 \(O(Tn^2m)\) 的,可以获得 \(85\) 分。
考虑优化,上面两个式子把 \(r_{i,j}\) 提出来后直接前缀和优化即可。
这样子时间复杂度是 \(O(Tnm)\),可以通过本题。
代码
// O(nmt)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int t,id,n,m,c,f;
int a[1005][1005];
char s[1005];
int rgt[1005][1005],down[1005][1005];
int rdqzh[1005][1005],rgtqzh[1005][1005];
const int mod = 998244353;
inline int M(int x){
return (x%mod+mod)%mod;
}
inline void getrgt(){
for(int i=1;i<=n;i++){
int j=1;
while(j<=m){
if(a[i][j]==0){
int start=j;
for(;j<=m&&a[i][j]==0;j++);
for(int val=0,k=j-1;k>=start;k--,val++){
rgt[i][k]=val;
}
j--;
}
j++;
}
}
}
inline void getdown(){
for(int i=1;i<=m;i++){
int j=1;
while(j<=n){
if(a[j][i]==0){
int start=j;
for(;j<=n&&a[j][i]==0;j++);
for(int val=0,k=j-1;k>=start;k--,val++){
down[k][i]=val;
}
j--;
}
j++;
}
}
}
inline void preworks(){
getrgt();
getdown();
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
// rgtqzh[i][j] is rgt[1][j]+rgt[2][j]+...+rgt[i][j]
rgtqzh[i][j]=M(rgtqzh[i-1][j]+rgt[i][j]);
// rdqzh[i][j] is rgt[1][j]*down[1][j]+rgt[2][j]*down[2][j]+...+rgt[i][j]**down[i][j]
rdqzh[i][j]=M(rdqzh[i-1][j]+M(rgt[i][j]*down[i][j]));
}
}
}
inline int countc(){
int ans=0;
for(int i=1;i<=m;i++){// C's col
for(int j=1;j<=(n-2);j++){ // C's top row
if((j+2)>(j+down[j][i]))continue;
ans = M(ans+M(rgt[j][i]*M(rgtqzh[j+down[j][i]][i]-rgtqzh[j+2-1][i])));
// int pans=0;
// for(int k=j+2;k<=(j+down[j][i]);k++){// C's bottom row
// pans=pans+(rgt[k][i])%mod;
// pans%=mod;
// }
// ans=ans+pans*rgt[j][i]%mod;
}
}
return ans;
}
inline int countf(){
int ans=0;
for(int i=1;i<=m;i++){// F's col
for(int j=1;j<=(n-3);j++){// F's top row
if((j+2)>(j+down[j][i]))continue;
ans=M(ans+M(rgt[j][i]*M(rdqzh[j+down[j][i]][i]-rdqzh[j+2-1][i])));
// for(int k=(j+2);k<=(j+down[j][i]);k++){// F's bottom row
// ans=ans+(((rgt[j][i]*rgt[k][i])%mod)*down[k][i])%mod;
// ans%=mod;
// }
}
}
return ans;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#ifndef ZYBAKIOI
freopen("plant.in","r",stdin);
freopen("plant.out","w",stdout);
#endif
cin>>t>>id;
if(id==1){
while(t--)cout<<0<<' '<<0<<'\n';
return 0;
}
while(t--){
memset(rgt,0,sizeof(rgt));
memset(down,0,sizeof(down));
memset(rdqzh,0,sizeof(rdqzh));
memset(rgtqzh,0,sizeof(rgtqzh));
memset(a,0,sizeof(a));
cin>>n>>m>>c>>f;
for(int i=1;i<=n;i++){
cin>>(s+1);
for(int j=1;j<=m;j++){
a[i][j]=s[j]-'0';
}
}
preworks();
cout<<(c*countc())<<' '<<(f*countf())<<'\n';
}
return 0;
}
/*
I hope my grandfathers can give me a good prize in NOIP 2022.
ZYB,YSC,LF,LWX,HZY,ZBZ,YTXY,GRZ,LGS,DZY,WQX
they are my grandfathers,they AKed IOI!(%%%)
And They AK NOIP!
*/
P8865 [NOIP2022] 种花的更多相关文章
- P1834 种花小游戏
我只是想做壮鸭低劈啊,为什么只有状压没有DP-- 原题: 植物大战僵尸这款游戏中,还有个特别有意思的赚钱方式--种花(能长金币的花).种出来的金币需要玩家点击才能得到,或者,玩家可以购买一只蜗牛来帮助 ...
- 605. Can Place Flowers种花问题【leetcode】
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...
- 【LeetCode】数组-3(605)-种花问题( 1 的两侧不能有 1 )
开始的思路:首先统计需要种几只花,用花的数目统计连续 0 的个数.... ...[囧]突然觉得情况有点复杂啊,有连续的又有分散的怎么能统计全呢? 好吧这里喔偷偷的瞄了一眼参看答案... ...(就一眼 ...
- 种花 [JZOJ4726] [可撤销贪心]
Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场——南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...
- CDOJ 1292 卿学姐种花 暴力 分块 线段树
卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...
- Leetcode 605.种花问题
种花问题 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表 ...
- LeetCode 605. 种花问题(Can Place Flowers) 6
605. 种花问题 605. Can Place Flowers 题目描述 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. ...
- [noip模拟]种花<快速幂+结论>
描述: OI太可怕了,我决定回家种田.我在后院里开辟了一块圆形的花圃,准备种花.种花是一种艺术,通过一定技术手法,花材的排列组合会让花变得更加的赏心悦目,这就是花艺.当然你知道,我在种田之前是OIer ...
- Java实现 LeetCode 605 种花问题(边界问题)
605. 种花问题 假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种 ...
- LeetCode 605. Can Place Flowers (可以种花)
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...
随机推荐
- Vue学习之--------Vue中过滤器(filters)的使用(代码实现)(2022/7/18)
1.过滤器 1.1 概念 过滤器: 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理). 语法: 1.注册过滤器:Vue.filter(name,callback) 或 new V ...
- 在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard
欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码 3.优缺点 1.UML类图 2.源码 package com.zheng; ...
- vue中将验证表单输入框的方法写在一个js文件中(表达式验证邮箱、身份证、号码、两次输入的密码是否一致)
文章目录 1.实现的效果 2.编写的js文件(这里写在了api文件下) 3.在vue页面中引入(script) 4.页面代码 1.实现的效果 20220606_154646 2.编写的js文件(这里写 ...
- python 的time、datetime模块
python 时间模块 import datetime res = datetime.datetime.now() print(res) # 2022-08-07 16:47:07.120459 ...
- 用map来统计数组中各个字符串的数量
1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...
- 2022年Python顶级自动化特征工程框架⛵
作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...
- 面试官不按套路,竟然问我Java线程池是怎么统计线程空闲时间?
背景介绍: 你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官! 面试官: 小伙子,我看你简历上写的项目中用到了线程池,你知道线程池是怎样实现复用线 ...
- 【云原生 · Kubernetes】Kubernetes运维
(1)Node的隔离与恢复 在硬件升级.硬件维护等情况下,需要将某些Node隔离.使用kubectl cordon <node_name>命令可禁止Pod调度到该节点上,在其上运行的Pod ...
- python解释器下载与安装指导手册
python解释器下载与安装指导手册 1.python解释器 1.1下载地址 1 https://www.python.org/ 1.2.python解释器下载 1.3.python解释器主流版本 p ...
- i春秋SQLi
打开题目网页是个很简单的登录网页 先查看源码,抓包 都没找到可用的信息 依我所见这里应该就是一个注入 但是怎么输入都会回显username错误 直到输入admin 尝试admin# Admin'# ...