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