其他分享
首页 > 其他分享> > 2021.7.10 校内模拟赛游记

2021.7.10 校内模拟赛游记

作者:互联网

严重事故征候 over and over again

这次 事故征候 模拟赛,暴露出我 安全意识淡薄,形式主义突出 省略标准程序的老问题。
T2 挂成 \(0\) 分了。

A

给定序列 \(a\), 问能否通过 \(a_i \to a_{i-1} + a_{i+1} - a_i\) 的操作变成 \(b\)。

看到 A 题吓死了,开始想了 30min+ 没有思路,先跳过了。

然后写完 T2, 看过 3、4 后又来想,恍然大悟了。
首先如果把三个数都减去 \(x\), 那么最后结果减少了俩加上了一个,所以结果也被减去了 \(x\),并不会对数的相对大小造成什么影响,那么就简化问题,吧 \(x, y, z\) 三个数变成 \(0, y-x, z-x\), 当作 \(0, x, y\) 来处理,进行一次操作后,发现数列变成了 \(0, y-x, y\), 惊喜地发现,差交换了位置!

众所周知,排列两两交换能达到任何排列,而换不出其它数来,所以只要比较差的多重集是否相同就可以了。

B

这就是出事的题。

构造排列满足输入的相邻两数的大小关系,同时让 LIS 尽可能 大/小

很快就想到了一个可行的构造,虽然有点复杂,但至少是对的,写完调了一会儿就放着了。

所谓的检查单完全只是扫了两眼代码,测试部分也只检查了是否是一个排列,而没有检查相对大小的关系,然后就成功挂分了。

可笑的是,代码的末尾还写着

// 0137Z - CCP
// 0142Z - CKC

其实连检查单都没有默出来就打上了 CKC 的标记。

今后必须要严格执行检查单,并且强制要求在代码末尾默写检查单且两个标记不得使用缩写,强制要求写完全称。

C

有箱子的网格图里从左上到右下,可以推箱子但不能推出去,求路径数。

想到了 dp 要一块转移,可是恍然发现这样会有重复。
然后就以为这是个错误的思路,直接弃掉,想了会儿容斥未果就写了个暴力交了。

有重复就想办法解决啊!!!
其实只要强制规定当前格转向,然后一块的转移用前缀和优化就可以了。

代码里保留了原来的代码。

void TYT() {
	for (int i = 1; i <= n; i++) std::cin >> (map[i] + 1);
	for (int i = n; i >= 1; i--)
		for (int j = m; j >= 1; j--)
			r[i][j] = r[i][j+1] + (map[i][j] == 'R'),
			d[i][j] = d[i+1][j] + (map[i][j] == 'R');
	f[n][m][0] = f[n][m][1] = sum[n][m][0] = sum[n][m][1] = 1;
	for (int i = n; i >= 1; i--)
		for (int j = m; j >= 1; j--) {
			if (i == n && j == m) continue;
			f[i][j][0] = (sum[i][j+1][1] - sum[i][m-r[i][j+1]+1][1] + P) % P;
			f[i][j][1] = (sum[i+1][j][0] - sum[n-d[i+1][j]+1][j][0] + P) % P;
			sum[i][j][0] = (sum[i+1][j][0] + f[i][j][0]) % P;
			sum[i][j][1] = (sum[i][j+1][1] + f[i][j][1]) % P;
		}
	std::cout << (f[1][1][1] + f[1][1][0]) % P;
}

D

我居然没有想到那么显然的链上部分分的倍增?!

想了半天未果,连暴力都没有想出来。成功 \(0\) 分。

题解在这里写了,不重复发了。

标签:10,校内,2021.7,map,int,sum,--,检查单,代码
来源: https://www.cnblogs.com/Acfboy/p/20210710_.html