[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. Elasticsearch内核解析 - 数据模型篇【转载】

    原文链接 Elasticsearch是一个实时的分布式搜索和分析引擎,它可以帮助我们用很快的速度去处理大规模数据,可以用于全文检索.结构化检索.推荐.分析以及统计聚合等多种场景. Elasticsea ...

  2. KingbaseESV8R6等待事件之LWLock buffer_mapping

    等待事件含义 当会话将数据块与共享缓冲池中的缓冲区关联时,会发生此等待事件. 类似Oracle cbc闩锁的是一种Kingbase的轻量级锁lwlock,这个锁的名字在不同数据库版本中可能有所不同,我 ...

  3. 2024最新最全Java和Go面经,面试了30多场,终于上岸了!

    ​> 本文来自我们技术交流群群友的投稿,未经授权,禁止转载. 原文链接:太难了,Java和Go,面试了30多场,终于上岸了! 先听一下TA的故事 2023年10月份我就做好了离职跳槽的准备,做了 ...

  4. 第十三届蓝桥杯大赛软件赛省赛【Java 大学B 组】试题B: 山

    1 public class HelloWorld { 2 public static void main(String args[]) { 3 long count=0; 4 String temp ...

  5. jQuery AJAX 常见属性

    1 jQuery.ajax(...) 2 部分参数: 3 url:请求地址 4 type:请求方式,GET.POST(1.9.0之后用method) 5 headers:请求头 6 data:要发送的 ...

  6. C++一些例子

    虚析构 #include<iostream> class Base { public: Base() { std::cout << "base 构造" &l ...

  7. 新前言with留言板

    旧博客也是会用的,但是现在只用博客园写博客,平时csdn的东西也会凑凑热闹 欢迎各位julao来留言板留言 /* ID:lemondi1 LANG:C++ TASK:test */ #include ...

  8. Codeforces Round #751 (Div. 1)

    CF1601A Array Elimination 洛谷传送门 CF1601A 分析 可以发现每一位可以拆开,也就是每一位的一的个数一定是 \(k\) 的倍数, 直接求 \(\gcd\) 出来,它的约 ...

  9. #dp,矩阵乘法#洛谷 5371 [SNOI2019]纸牌

    题目 一副纸牌有 \(n\) 种,每种有 \(m\) 张, 现在有 \(k\) 个限制条件形如第 \(k_i\) 种牌至少选 \(a_i\) 张, 一个三元组合法当且仅当其为 \((i,i+1,i+2 ...

  10. Openstack之工作流程

    组件 OpenStack的核心部件即包括Nova(用于计算).Keystone(用于身份服务).Neutron(用于网络和地址管理).Cinder(块存储).Swift(对象存储).Glance(镜像 ...