[ABC345D] Tiling

原题解地址:Editorial by Kiri8128

神写法。

将 \(H \times W\) 的网格展开为 \(H \times (W + 1)\) 的序列, 每行多出来的一格表示换行。

W += 1;

令 \(F(a, b)\) 表示长为 \(a\),宽为 \(b\) 的矩形填满网格左上角的状态,直接给出公式,可以模拟检验正确性。

i128 F(int a, int b) {
return (((i128)1 << a * W) - 1) / ((1 << W) - 1) * ((1 << b) - 1);
}

搜索过程:

  • 枚举每个矩形出现顺序。
  • 初状态 \(s = F(H, W - 1)\)。
  • 二进制枚举每个矩形是否旋转。
  • 设 \(x\) 为矩形的值,如果 \(x \ \& \ s = x\),那么 \(x\) 能填入,否则结束循环。
  • 当一个矩形能够填入时,更新左上角,用 \(lowbit\) 去掉 \(s\) 末尾的 \(0\)。
  • \(s = 0\) 即找到一组合法解。

写法较于一些冗长的搜索显得极为优雅。

注意 next_permutation 是按字典序判的,因此先排序。

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
#define pb emplace_back
using namespace std;
using i128 = __int128; int N, H, W; i128 F(int a, int b) {
return (((i128)1 << a * W) - 1) / ((1 << W) - 1) * ((1 << b) - 1);
} int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> N >> H >> W;
W += 1;
vector<pair<i128, i128>> a;
rep(i, 1, N) {
int x, y; cin >> x >> y;
a.pb(F(x, y), F(y, x));
}
i128 S = F(H, W - 1);
ranges::sort(a);
do {
for(int i = 0; i < 1 << N; ++ i) {
i128 s = S;
for(int j = 0; j < N; ++ j) {
i128 x = (i >> j & 1) ? a[j].first : a[j].second;
if((x & s) != x) break;
if((s ^= x) == 0) {
cout << "Yes";
exit(0);
}
s /= s & -s;
}
}
} while(ranges::next_permutation(a).found);
cout << "No";
return 0;
}

[ABC345D] Tiling 位运算の极致运用的更多相关文章

  1. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

  2. HashMap位运算你可知一二

    前置位运算知识 我们平时在写代码过程中用的位运算操作比较少,因为我们更关注于可读性而不是性能,如果为了性能而使用较多的位运算,我想我们的同事会疯掉.但在框架里位运算却非常常见,因为框架的性能是我们关注 ...

  3. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  4. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

  5. SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解

    本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表   位运算   SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...

  6. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  7. Java中的位运算

    昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~  按位非(NOT)(一元运算) ...

  8. C#位运算讲解与示例

    首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...

  9. C#枚举中的位运算权限分配浅谈

    常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第 ...

  10. Java位运算经典实例

    一 源码.反码.补码 正数的源码.反码.补码相同,例如5:            5的源码:101            5的反码:101            5的补码:101 负数的源码.反码.补 ...

随机推荐

  1. 任何样式,javascript都可以操作,让你所向披靡

    前言 习惯了在 css 文件里面编写样式,其实JavaScript 的 CSS对象模型也提供了强大的样式操作能力, 那就随文章一起看看,有多少能力是你不知道的吧. 样式来源 客从八方来, 样式呢, 样 ...

  2. 如何使用文件传输协议ftp,教你使用文件传输协议命令行

    FTP是文件传输协议的缩写.顾名思义,FTP用于在网络上的计算机之间传输文件.您可以使用文件传输协议在计算机帐户之间交换文件,在帐户和台式计算机之间传输文件或访问在线软件档案.但是请记住,许多文件传输 ...

  3. DNS的各种记录类型的应用解析

    可能很多人平时工作中不会遇到DNS配置相关的问题, 但如果偶尔遇到不同类型DNS记录的配置, 在没有搞清楚它们都是干啥的情况下, 会眼花缭乱, 还记得很多年前实验室配置DNS不太对导致只能访问www. ...

  4. lodash已死?radash最全使用介绍(附源码详细说明)—— Array方法篇(1)

    相信很多前端同学甚至非前端都或多或少使用过lodash库,我们都知道lodash是一个非常丰富的前端工具库,比如最常用的防抖和节流,使用lodash都能很快实现,在github上更是有着58.7k的s ...

  5. std::thread 二:互斥量(lock() & unlock())

    mutex  互斥量的作用是保护共享数据 *:有 lock()  就一定要有  unlock() #include <iostream> #include <thread> # ...

  6. Python smtp发送邮件怎么设置抄送人

    设置抄送人,非常简单,只需要添加一条信息就可以了,例: cc_list = ['xx@xxx.cn', 'xx@xxx.cn'] msg['Cc'] = ','.join(cc_list) smtp. ...

  7. openGauss2.1.0新特性-账本数据库实验

    openGauss2.1.0 新特性-账本数据库实验 账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表.当用户创建防篡改用户表时,系统将自动为该表添加一个 hash 列 ...

  8. 视频播放测试地址(MP4、M3U8 格式)

    最近在开发视频播放相关的业务功能,开发测试时,需要涉及到 MP4.M3U8 等视频格式. 我每次找测试视频地址时,都要找很久,现在把我在网上收集到的 MP4.M3U8 格式视频地址放在这里,希望帮助到 ...

  9. 电脑开机时报错No Bootable Device找不到索引的解决方法

      本文介绍笔记本电脑出现No Bootable Device错误提示,且无法开机的多种解决办法. 1 问题产生   最近,笔记本电脑正在正常使用时,突然蓝屏,出现你的设备遇到问题,需要重启.的提示: ...

  10. 重新整理 mysql 基础篇—————表锁和全局锁[六]

    前言 锁从大的方面可以分为: 1.全局锁 2.表锁 3.行锁 正文 全局锁 全局锁就是对整个数据加上读锁. 在mysql 中,加入全局锁的命令就是: Flush tables with read lo ...