再解NOIP2022 种花

再解NOIP2022 种花

考场暴力喜提3=。

暴力 Θ ( n 5 ) \Theta(n^5) Θ(n5)

直接按照题意模拟运算可以直接拿到40pts。

#include <iostream>
#include <cstdio>
#include <cstring>
#define rep(i,a,b) for(int i=a;i<=b;++i)using namespace std;int T,id;
int m,n,c,f;
bool mp[1001][1001];
const int mod=998244353;int main()
{// freopen("plant.in","r",stdin);// freopen("plant.out","w",stdout);scanf("%d%d",&T,&id);while(T--){scanf("%d%d%d%d",&n,&m,&c,&f);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf("%1d",&mp[i][j]);}}int vc=0,vf=0;if(c==0) cout<<0<<" ";if(f!=0||c!=0){rep(x1,1,n) rep(x2,x1+2,n){rep(y0,1,m)  rep(y1,y0+1,m) rep(y2,y0+1,m){bool flag=true;for(int i=y0;i<=y1;++i){if(mp[x1][i]==1){flag=false;break;}}if(flag){for(int i=y0;i<=y2;++i){if(mp[x2][i]==1){flag=false;break;}}}if(flag){for(int i=x1;i<=x2;++i){if(mp[i][y0]==1){flag=false;break;}}}if(flag){++vc,vc%=mod;for(int i=x2+1;i<=n;++i){if(mp[i][y0]==0) ++vf,vf%=mod;else break;}} }}if(c!=0) printf("%d ",c*vc);printf("%d\n",vf*f);} else printf("0\n");}return 0;
}

Θ ( n 3 ) \Theta(n^3) Θ(n3) 做法

预处理出数组 d o w n i , j , r i g h t i , j down_{i,j},right_{i,j} downi,j,righti,j 表示 ( i , j ) (i,j) (i,j) 位置向下最多延伸多少,向右最多延伸多少。

预处理的复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2)

然后考虑计算 a n s 1 , a n s 2 ans1,ans2 ans1,ans2 a n s 1 ans1 ans1 是摆成 C C C 的方案数, a n s 2 ans2 ans2 是摆成 F F F 的方案数。

先枚举所在列数,再枚举所在两次行数,剩下的是好计算的,时间复杂度 Θ ( n 3 ) \Theta(n^3) Θ(n3)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <cstring>
#include <ctime>
#define pii pair<int,int>
#define x first
#define y second
#define pb push_backusing namespace std;const int INF=0x3f3f3f3f;inline int read()
{int w=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){w=(w<<1)+(w<<3)+(ch^48);ch=getchar();}return w*f;
}inline void write(int x)
{if(x<0){putchar('-');x=-x;}if(x>9) write(x/10);putchar(x%10+'0');
}const int maxn=1005;
const int mod=998244353;
int T,id;
int n,m,c,f;
int mp[maxn][maxn],down[maxn][maxn],rt[maxn][maxn];
typedef long long ll;
void debug()
{for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cout<<rt[i][j]<<" ";}puts("");}puts("");for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cout<<down[i][j]<<" ";}puts("");}
}int main()
{
#ifndef ONLINE_JUDGE
#define LOCALfreopen("in.txt","r",stdin);
#endifT=read(),id=read();while(T--){ll ans1=0,ans2=0;n=read(),m=read(),c=read(),f=read();for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf("%1d",&mp[i][j]);}}for(int j=1;j<=m;++j){int lst=n;for(int i=n;i>=1;--i){if(mp[i][j]==1){lst=i-1;continue;}down[i][j]=lst;}}for(int i=1;i<=n;++i){int lst=m;for(int j=m;j>=1;--j){if(mp[i][j]==1){lst=j-1;continue;}rt[i][j]=lst;}}for(int j=1;j<=m;++j){for(int i1=1;i1<=n;++i1){for(int i2=i1+2;i2<=n;++i2){if(down[i1][j]<i2) continue;if(mp[i1][j]==1||mp[i2][j]==1) continue;int len1=rt[i1][j]-j,len2=rt[i2][j]-j;if(len1==0||len2==0) continue;int p1;p1=len1*len2;(ans1+=p1)%=mod;int len3=down[i2][j]-i2;int p2=p1*len3%mod;(ans2+=p2)%=mod;
//					printf("%d %d %d %d %d %d # %d %d\n",j,i1,i2,len1,len2,len3,p1,p2);}}}printf("%d %d\n",c*ans1%mod,f*ans2%mod);}
#ifdef LOCALfprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endifreturn 0;
}

可以拿到 69 分。

满分做法

观察到上面的计算中出现了不必要的计算,因为求出 d o w n , r i g h t down,right down,right 后,每一个点向下向右最多延伸多少就确定了,关于它的所有信息也都可以很快预处理出来。

于是先固定 j , i 1 j,i1 j,i1,考虑如何计算 C C C 的数量。

很显然,有上述已知条件,答案就是

( r i g h t i , j − j ) × ∑ k = i 1 + 2 n r i g h t k , j − j (right_{i,j}-j) \times \sum_{k=i_1+2}^{n} right_{k,j}-j (righti,jj)×k=i1+2nrightk,jj
而式子右边的部分可以用前缀和预处理出来。

即令 p r e i , j pre_{i,j} prei,j 为位置 ( i + 1 , j ) (i+1,j) (i+1,j) 下面(不包括 ( i + 1 , j ) (i+1,j) (i+1,j))的所有位置最多向右延伸多少的和。复杂度 Θ ( n 2 ) \Theta(n^2) Θ(n2)

收到计算 C C C 的启发,因为 F F F 就比 C C C 多一个尾巴,于是计算 F F F 也可以采用相同的方式。

对于每个点对前缀和数组的贡献,要乘上 d o w n i , j − i down_{i,j}-i downi,ji,其余的都是相同的。

预处理前缀和复杂度 Θ ( n 2 ) \Theta(n^2) Θ(n2),计算答案 Θ ( n 2 ) \Theta(n^2) Θ(n2),可以通过。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <cstring>
#include <ctime>
#define pii pair<int,int>
#define x first
#define y second
#define pb push_backusing namespace std;const int INF=0x3f3f3f3f;inline int read()
{int w=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){w=(w<<1)+(w<<3)+(ch^48);ch=getchar();}return w*f;
}inline void write(int x)
{if(x<0){putchar('-');x=-x;}if(x>9) write(x/10);putchar(x%10+'0');
}const int maxn=1005;
const int mod=998244353;
typedef long long ll;
int T,id;
int n,m,c,f;
int mp[maxn][maxn],down[maxn][maxn],rt[maxn][maxn];
ll pre[maxn][maxn],val[maxn][maxn],pre2[maxn][maxn],val2[maxn][maxn];void debug()
{for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cout<<rt[i][j]<<" ";}puts("");}puts("");for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cout<<down[i][j]<<" ";}puts("");}
}
void debug2()
{for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cout<<val[i][j]<<" ";}puts("");}puts("");for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){cout<<pre[i][j]<<" ";}puts("");}
}
//pre[i][j] 位置(i,j)下面的所有位置向右能延伸多少的前缀和 void init()
{memset(pre,0,sizeof pre);memset(val,0,sizeof val);memset(pre2,0,sizeof pre2);memset(val2,0,sizeof val2);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(mp[i][j]==1) continue;val[i][j]=rt[i][j]-j;val2[i][j]=(rt[i][j]-j)*(down[i][j]-i)%mod;}}for(int j=1;j<=m;++j){for(int i=n-1;i>=1;--i){if(mp[i][j]==1) continue;pre[i][j]=pre[i+1][j]+val[i+1][j];}}for(int j=1;j<=m;++j){for(int i=n-1;i>=1;--i){if(mp[i][j]==1) continue;pre2[i][j]=pre2[i+1][j]+val2[i+1][j];}}
}int main()
{
#ifndef ONLINE_JUDGE
#define LOCALfreopen("in.txt","r",stdin);
#endifT=read(),id=read();while(T--){ll ans1=0,ans2=0;n=read(),m=read(),c=read(),f=read();for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf("%1d",&mp[i][j]);}}for(int j=1;j<=m;++j){int lst=n;for(int i=n;i>=1;--i){if(mp[i][j]==1){lst=i-1;continue;}down[i][j]=lst;}}for(int i=1;i<=n;++i){int lst=m;for(int j=m;j>=1;--j){if(mp[i][j]==1){lst=j-1;continue;}rt[i][j]=lst;}}init();for(int j=1;j<=m;++j){for(int i=1;i<=n;++i){if(mp[i][j]==1) continue;ll p=val[i][j]*pre[i+1][j]%mod;(ans1+=p)%=mod;(ans2+=val[i][j]*pre2[i+1][j]%mod)%=mod;}}printf("%lld %lld\n",c*ans1%mod,f*ans2%mod);}
#ifdef LOCALfprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endifreturn 0;
}

细节

  1. 多测不清空,暴零两行泪。
  2. 不开 long long 见祖宗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12823.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软件架构与模式分析

软件架构模式分析 软件架构模式和架构风格是两个相关但不同的概念。 软件架构模式&#xff08;Software Architecture Patterns&#xff09;是一种在软件工程领域广泛应用的规范化、可复用的架构设计方案。它是通过抽象和提炼出解决特定问题所需的结构、组件、关系和规则等&am…

npm完整发包流程(亲测可验证)

1. 准备工作 &#xff08;1&#xff09; 在npm官网上注册一个账号 &#xff08;2&#xff09; 注册成功之后&#xff0c;npm会发送一封邮件给你&#xff0c;点击邮件里面的链接&#xff0c;做确认关联操作&#xff08;必需&#xff09; 2. 创建自己的npm包 &#xff08;…

无插件直播流媒体音视频播放器EasyPlayer.js播放器多分屏超过6路不能播放如何解决

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

从零开始使用YOLOv11——Yolo检测detect数据集自建格式转换为模型训练格式:20w+图片1w+类别代码测试成功

在之前的文章中记录了YOLO环境的配置安装和基本命令的一些使用&#xff0c;上一篇博文的地址快速链接&#xff1a;从零开始使用YOLOv8——环境配置与极简指令&#xff08;CLI&#xff09;操作&#xff1a;1篇文章解决—直接使用&#xff1a;模型部署 and 自建数据集&#xff1a…

【HAProxy06】企业级反向代理HAProxy调度算法之其他算法

HAProxy 调度算法 HAProxy通过固定参数 balance 指明对后端服务器的调度算法&#xff0c;该参数可以配置在listen或backend选项中。 HAProxy的调度算法分为静态和动态调度算法&#xff0c;但是有些算法可以根据不同的参数实现静态和动态算法 相互转换。 官方文档&#xff1…

Leetcode 检测相邻递增子数组

3349. 检测相邻递增子数组 I 给你一个由 n 个整数组成的数组 nums &#xff0c;请你找出 k 的 最大值&#xff0c;使得存在 两个 相邻 且长度为 k 的 严格递增 子数组 。具体来说&#xff0c;需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组&#xff0c;并满…

【STL栈和队列】:高效数据结构的应用秘籍

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;为我们提供了多种容器&#xff0c;其中 stack&#xff08;栈&#xff09;和 queue&#xff08;队列&#xff09;是非常常用的两种容器。 根据之前C语言实现的栈和队列&#xff0c;&#xff08;如有遗忘&#xff0c;…

香江电器从A股到港股7年漫长上市路,收入后退停滞不前

《港湾商业观察》施子夫 9月29日&#xff0c;湖北香江电器股份有限公司&#xff08;以下简称&#xff0c;香江电器&#xff09;递表港交所引起外界关注&#xff0c;公司的独家保荐机构为国金证券。 回顾香江电器的IPO之旅&#xff0c;可以说是颇为坎坷&#xff0c;多次尝试A股…

从python源码到可自动更新软件

相关阅读 标题链接如何打包python程序为exebczl【auto-py-to-exe 可视化打包python到exe】51CTO ZATA 1. python源码 打包时需要特别注意的源码编写规范 除了基本的 Python 编码规范之外,在准备程序进行打包时,还需要特别注意以下几点: 1.1 依赖管理 确保 requirements.t…

2024智能视觉与数据建模国际学术会议(ICIVD 2024)

重要信息 主会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地点&#xff1a;中国南昌 大会简介 2024智能视觉与数据建模国际学术会议&#xff08;ICIVD 2024&#xff09;作为第四届计算机图形学、人工智能与数据处理国际学术会议&#xff…

Linux磁盘分区

文章目录 磁盘分区 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击 ⏰️创作时间&#xff1a;2024年11月12日13点20分 磁盘分区 MBR 主启动记录分区方案指定了运行BIOS固件的系统上应如何对磁盘进行分区&#xff0c;存在与驱动开…

2. Spring Cloud 微服务基础环境搭建

2. Spring Cloud 微服务基础环境搭建 文章目录 2. Spring Cloud 微服务基础环境搭建前言1. 微服务需求解析2. 具体搭建微服务步骤&#xff1a;2.1 创建父工程 &#xff0c;用于聚合其它微服务模块2.1.1 需求说明/图解2.1.2 具体实现步骤2.1.3 注意事项和具体细节 2.2 创建会员中…

微信朋友圈营销

朋友圈营销4567法则

【赵渝强老师】MySQL InnoDB的表空间

InnoDB存储引擎目前是MySQL默认的存储引擎&#xff0c;它主要由三部分组成&#xff0c;分别是&#xff1a;存储结构、内存结构和线程结构。InnoDB的存储结构又可以分为逻辑存储结构和物理存储结构。InnoDB存储引擎的逻辑存储结构和Oracle大致相同&#xff0c;所有数据都被逻辑地…

docker安装redis

1、拉取镜像 docker pull redis:latest运行之前需要再/data/redis创建redis.conf配置文件 内容如下 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepalive 300daemonize no…

vue项目多入口文件。vue.config.js如何修改配置

我们知道vue项目是单入口。指定一个入口文件去加载他所有的依赖。如果我们希望他有多个入口文件怎么办呢&#xff1f; 我们可以在public下面新建一个html的文件 然后src下新增一个文件夹&#xff0c;用来放APP.vue和 main.js。 然后修改vue.config.js。把他的pages改成2个入…

NCC前端调用查询弹框

系统自带的查询模板 弹框 调启使用默认的 查询模板 是在 单据模板的 列表模板中&#xff0c;有个查询区域 &#xff0c;查询区域就是查询模板内容如果在列表页做客开 新增按钮 调启查询模板 无问题&#xff0c;但是目前需求是需要再卡片页面下调启系统标准的调启模板代码 //调…

SpringBoot中的注解详解(二)

四、Param() &#xff08;mapper包 Dao层&#xff09; Param()&#xff1a; 功能&#xff1a; 用于在Mapper接口的方法参数上标记参数名称&#xff0c;以便在SQL语句中引用这些参数。 参数命名&#xff1a;在Mapper接口的方法参数上使用Param注解&#xff0c;可以为参数指定一…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

新版flask pin码计算

Python debug pin码计算 需开启debug from flask import Flask app Flask(__name__) app.route("/") def index():return "Hello World" app.run(debugTrue) /console路由填入上方控制台的 PIN 码即可执行 Python 命令 Flask 的 PIN 码计算仅与 werkze…