[ABC345D] Tiling 位运算の极致运用
[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 位运算の极致运用的更多相关文章
- Java二进制和位运算,这一万字准能喂饱你
基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...
- HashMap位运算你可知一二
前置位运算知识 我们平时在写代码过程中用的位运算操作比较少,因为我们更关注于可读性而不是性能,如果为了性能而使用较多的位运算,我想我们的同事会疯掉.但在框架里位运算却非常常见,因为框架的性能是我们关注 ...
- Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range
在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...
- 简简单单学会C#位运算
一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...
- SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解
本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表 位运算 SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...
- js中的位运算
按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...
- Java中的位运算
昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~ 按位非(NOT)(一元运算) ...
- C#位运算讲解与示例
首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...
- C#枚举中的位运算权限分配浅谈
常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第 ...
- Java位运算经典实例
一 源码.反码.补码 正数的源码.反码.补码相同,例如5: 5的源码:101 5的反码:101 5的补码:101 负数的源码.反码.补 ...
随机推荐
- java使用Ffmpeg合成音频和视频
1.Maven依赖 <!-- 需要注意,javacv主要是一组API为主,还需要加入对应的实现 --> <dependency> <groupId>org.byte ...
- KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比
案例说明: 相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点. 适用版本: Kingbase ...
- #线段树,矩阵乘法#洛谷 7453 [THUSCH2017] 大魔法师
题目 分析 首先考虑如果修改操作都是单点修改怎么做, 以第一种修改为例那么就是 \[\left[\begin{matrix}A\\B\\C\\1\end{matrix}\right] \times \ ...
- JS从图片base64数据中获取图片的宽高
// js从base64数据中获取宽高 var image = new Image(); image.src = "data:image/png;base64," + base64 ...
- django项目部署到centos
服务器是使用的阿里云的centos 7.6 项目使用的是 Python3.9.5 + Django 3.2.4 目标:将django项目部署到centos上,centos + Python + dja ...
- spark 计算前后两条记录之间的差(diff),时间差等
有时候会遇到这样的场景:有一个datafram,我们需要计算同一组对象中,前后两条记录之间的差值,此处并不仅限于时间,还可以是其他的数据类型 需要用到两个工具:spark窗口函数Window对对象分组 ...
- MMDeploy部署实战系列【第五章】:Windows下Release x64编译mmdeploy(C++),对TensorRT模型进行推理
MMDeploy部署实战系列[第五章]:Windows下Release x64编译mmdeploy(C++),对TensorRT模型进行推理 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善 ...
- TypeScript 中类的理解?应用场景?
一.是什么 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础 ❝ 类是一种用户定义的引用数据类型,也称类类型 ❞ 传统的面向对象语 ...
- Jenkins实战系列(一)——Jenkins简介
Jenkins是一个开源的自动化构建工具,可以帮助开发人员自动构建.测试和部署软件.它支持多种编程语言.版本控制系统和构建工具,如Java.Git.Maven等.Jenkins的核心功能是通过一系列插 ...
- 力扣704(java&python)-二分查找(简单)
题目: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: ...