1 条题解
-
0
自动搬运
来自洛谷,原作者为

BJpers2
**搬运于
2025-08-24 21:39:15,当前版本为作者最后更新于2018-06-27 08:43:35,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
先考虑最后折成的小正方形,它有n* m层,假设我们把它立起来,并从正面看这个小正方形,它的左右两侧的前后连接即为每一行上一格格的连接,上下两侧的前后连接即为每一列上一格格的连接。
那么只需分别再现出行和列究竟是哪些格子被连起来,再看是否有交点(即重合)即可。
先考虑行
看样例第三组:
2 1 6 3 4 5我们发现,显然,在矩阵中相邻的一定被连在一起,问题在于最终它们究竟是左侧相连,还是在右侧相连(在之前说的小正方形中)。
不妨设第1行的第1个与第2个是最后在左边相连的。
那么不管你怎么折,第2行的第1个与第2个也总是最后在左边相连的。
类似地,所有行的第1个与第2个都是最后在左边相连。
又发现,不管你怎么折,第1行的第2个与第3个总是最后在右边相连的。于是同上理所有行的2,3号之间最后全在右边相连。
这样可以推出,任意行的i,i+1号最后在i&1这一侧相连(左1右0)
那么,我们就能把所有的链接情况用一个表来记录,然后看会不会有交叉。如样例:
1 1 3 3 //左边 1 2 3 4 5 6 2 4 4 2//右边数字相同表示连在一起。列与行是一样的。 只上部分代码:(即行的处理)
```cpp t=co=0,yes=1; FOR(j,1,m-1)FOR(i,1,n) s[j&1][a[i][j]]=s[j&1][a[i][j+1]]=++co; FOR(k,0,1){ FOR(p,1,pro)if(s[k][p]){ st[++t]=s[k][p]; if(t>1) if(st[t]==st[t-1]) t-=2; }if(t) yes=0; }
- 1
信息
- ID
- 1614
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者