首页 > 其他分享 >NOIP2022 T1 种花 题解

NOIP2022 T1 种花 题解

时间:2022-12-04 14:23:11浏览次数:43  
标签:题解 rep sum2 sum1 T1 define NOIP2022 MOD SIZE

Part 1 吐槽&退役寄

考场上唯一AC的题目,T3看错题以为可以删去不止1条边,T4输出没换行,寄。

最后喜提100+0+0+0,给我的OI生涯画上了一个不完美的句号。

Part 2 题解

题目让统计CF的数量。

先来考虑较简单的C的情况。

不妨记C左边的一列为C的“一竖”
可以发现:

如果固定C左边的“一竖”的话,那么此时C的“上底”和“下底”所在的行是确定的,如图:


那么怎么统计数量?

不妨记\(r_{i,j}\)表示从\((i,j)\)这个点出发,向右最远能到的土坑的格子的列数

可以发现,两个有着相同的“一竖”的C是不同的,当且仅当上底不同,或者下底不同。

设”一竖“所在的列数为\(i\),上底的行数为\(p1\),下底的行数为\(p2\),于是有乘法原理:\(cnt=(r_{p1,i}-i)(r_{p1,i}-i)\)

于是考虑\(O(n^2)\)预处理数组\(r\),\(O(n^3)\)枚举左边的“一竖”,对于每个一竖暴力统计即可。

看到\(n\leq1000\),考虑优化成\(n^2\)。

记当前枚举的左边的“一竖”的上端点为\((i,j)\),那么以\(i\)为行数的“上底”能造成多少贡献呢?
可以发现:

\(ANS=(r_{i,j}-j)\sum\limits_{i+2\leq k\leq d_{i,j}} (r_{k,j}-j)\)

其中\(d\)数组是从位置\((i,j)\)向下能到达的最下面的土坑位置的行数
于是自然而然地想到了可以用前缀和优化,也就是在\(O(n^2)\)的复杂度下预处理出从某个点最上面的不是土坑的点到这个位置的贡献和。注意,中间可能有土坑,前缀和数组可能是这样的:

于是每枚举到一个C的上底的左顶点时,这个点的贡献可以整理成这样:

\(ANS=(r_{i,j}-j)\sum\limits_{i+2\leq k\leq d_{i,j}} (r_{k,j}-j)=(r_{i,j}-j)(SUM_{d_{i,j},j}-SUM_{i+1,j})\)

至此,完美解决C的情况。

那么F和C有什么练习与区别呢?

仔细观察发现,F是由上面的一个“C”和下面的一个小竖组成的。如果解决的C的情况,F自然也就迎刃而解了,只需要在前缀和中再乘以一个向下有多少长度即可,也就是
\(SUM'_{i,j}=SUM'_{i-1,j}+(r_{i,j}-j)(d_{i,j}-i)\)

于是本题全部解决。

Part 3 小细节

  • 取模的时候要注意,不然有可能爆int

  • 注意乘以题目所给的系数

  • 最重要的一点!!!多测不清空,爆零两行泪

Part 4 考场上的代码

#include<bits/stdc++.h>
#define ll long long
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define req(i, a, b) for(int i = a; i >= b; i--)
#define MOD 998244353
#define mp make_pair
#define fir first
#define sec second
#define SIZE 1005
using namespace std;
int T, id;
char a[SIZE][SIZE];
ll r[SIZE][SIZE], d[SIZE][SIZE];
ll sum1[SIZE][SIZE], sum2[SIZE][SIZE];
int main(){

	scanf("%d%d",&T, &id);
	while(T--){
		int n, m, c, f;
		scanf("%d%d%d%d",&n, &m, &c, &f);
		rep(i, 0, n + 1) rep(j, 0, m + 1) r[i][j] = d[i][j] = sum1[i][j] = sum2[i][j] = 0; 
		rep(i, 1, n){
			rep(j, 1, m) cin >> a[i][j];
		}
		rep(i, 1, n){
			req(j, m, 1){
				if(a[i][j] == '1'){
					r[i][j] = 0;
					continue;
				}
				if(r[i][j + 1] == 0) r[i][j] = j;
				else r[i][j] = r[i][j + 1];			
			}
		}
		rep(j, 1, m){
			req(i, n, 1){
				if(a[i][j] == '1'){
					d[i][j] = 0;
					continue;
				}
				if(d[i + 1][j] == 0) d[i][j] = i;
				else d[i][j] = d[i + 1][j];
			}
		}
		
		rep(j, 1, m){
			rep(i, 1, n){
				if(a[i][j] == '1') sum1[j][i] = sum2[j][i] = 0;
				else {
					sum1[j][i] = (sum1[j][i - 1] + r[i][j] - j) % MOD;	
					sum2[j][i] = (sum2[j][i - 1] + (r[i][j] - j) * (d[i][j] - i) % MOD) % MOD;
				}
			}
		}

		ll ans1 = 0, ans2 = 0;
		rep(i, 1, n){
			rep(j, 1, m - 1){
				if(i + 2 > d[i][j]) continue;
				if(a[i][j] != '1') ans1 = (ans1 + (sum1[j][d[i][j]] - sum1[j][i + 1]) * (r[i][j] - j) % MOD) % MOD;
				if(a[i][j] != '1') ans2 = (ans2 + (sum2[j][d[i][j]] - sum2[j][i + 1]) * (r[i][j] - j) % MOD) % MOD;
			}
		}
		printf("%lld %lld\n",ans1 * c, ans2 * f);
	}
	return 0;
}

Part 5 祝愿

希望各位能在OI的道路上越走越远,不留遗憾!——已经AFO的蒟蒻。

标签:题解,rep,sum2,sum1,T1,define,NOIP2022,MOD,SIZE
From: https://www.cnblogs.com/defense/p/16949799.html

相关文章

  • P8865 [NOIP2022] 种花
    P8865NOIP2022种花-洛谷|计算机科学教育新生态(luogu.com.cn)。记\(a(x,y)\)代表原文的\(a_{x,y}\)。考虑对每个点统计:左上角在该点的\(\texttt{C-}\),\(\te......
  • P8866 [NOIP2022] 喵了个喵
    P8866NOIP2022喵了个喵-洛谷|计算机科学教育新生态(luogu.com.cn)。本题解中我们将图案为\(x\)的卡牌看做数字\(x\),将本题对于卡牌的操作看做对数字的操作。观......
  • CF1709 题解
    比赛链接:https://codeforces.com/contest/1709题解:AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cassert>#include<cstring>#include<......
  • 【CV项目实现】交通标志数据集TT100K简介
    前言论文是​​清华-腾讯联合实验室​​提出的,公开了Tsinghua‐Tencent100K数据集,创建了一个大型交通标志基准。该数据集提供了100000张分辨率为2048像素×2048像素、包含......
  • AtCoder Beginner Contest 280 题解
    A-PawnonaGrid看样例猜题意(要求的是#的数量,直接判断。//If,oneday,Ifinallymanagetomakemydreamsareality...//Iwonder,willyoustillbethere......
  • YACS 2022年11月月赛 乙组 T3 菜单设计 题解
    题目链接上完编程课回来的深夜,更一篇吧。这一题一看数据范围$:18$,阶乘暴力打不了,就是状压。其实我还是比较喜欢状压的,不过这几个月怎么这么多状压?首先:设计状态不难发......
  • 树上染色-题解(贪心+DP+二分)
    树的上色题意简述树上有两个黑点,在每个单位时间内,每个黑点可以把自己相邻的一个白点变为黑色,求把整棵树所有点变为黑色的最短时间。\(n\)个点,两个黑点分别为\(x,y\)。......
  • 2022合肥学院acm程序设计大赛-热身赛题解 (1)
    A.codeforces直接读入输入即可#include<bits/stdc++.h>intmain(){strings;cin>>s;cout<<"https://codeforces.com/profile/"<<s;return0;}......
  • 合肥学院校赛热身赛题解
    A.codeforces直接读入输入即可#include<bits/stdc++.h>intmain(){strings;cin>>s;cout<<"https://codeforces.com/profile/"<<s;return0;}......
  • [SCOI2014]方伯伯的玉米田题解
    [SCOI2014]方伯伯的玉米田题目描述方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有\(N\)株,它们的高度参差不齐。方伯伯认为单调不下降序......