P9017 [USACO23JAN] Lights Off G
前言#
困了一下午, 仅仅只搞懂了个大概, 我们赶紧把这些题补了, 冷静一点
思路#
观察大样例可以发现, 答案好像都不大
容易证明的是先用最多
那么我们考虑以这个为突破口, 枚举操作次数解决问题
那么考虑对于一种操作次数
首先你需要知道操作的小转化 : 对于每个
稍微观察一下第
那么对于
这个时候问题就更加符合中国宝宝的体质, 每次操作次数
这个时候看似没法处理了, 但是你发现即使是多组测试数据, 但是
考虑令
容易发现每次其实就是从
我们可以容易的列出柿子
即可
感觉有点混乱, 我们再理一遍思路
首先你观察操作, 发现
观察大样例发现答案很小, 我们考虑证明出答案
假设操作次数为
稍微观察一下第
那么对于
这个时候问题就更加符合中国宝宝的体质, 每次操作次数
然后我们考虑全局预处理
结束
复习#
考虑复习
- 定义操作 (约束) 和开销 / 收益, 要求最值化开销 / 收益
- 先排除无效元素
- 将约束条件数学化
- 模拟操作情况, 贪心处理最好开销 (将简单情况先处理, 然后在基础上处理最值 / 简化操作)
- 考虑操作对答案的影响 (推式子) , 据此对操作进行处理
- 推导每个元素对答案的贡献
拆贡献 - 推导动态规划
- 推导每个元素对答案的贡献
- 判断是否存在操作满足约束
- 模拟, 对于重复情况去重
- 要求一个数列的多个部分
前缀, 子串 的成本- 贪心找到最优操作的构造方法, 加上优化 / 找共同点
- 找到所有情况统一的构造方案
- 然后逐操作贪心
给定长为
一次操作定义为
- 对
的一位异或 - 把
异或上 - 将
循环右移一位
求最少多少次操作使得
肯定要先模拟操作
不难发现每次都把
例如
也就是说, 问题简化为
- 对
的一位异或 - 把
异或上 - 将
循环右移一位
求
不难发现对于每一个
发现
但是其异或和怎么变换?
不妨设操作次数为
加上每次操作的翻转
那么你发现, 问题简化为判定类
对于操作次数
其中
进一步简化为
求最小的可行
发现
令
直接模拟不太好做, 巧妙地一点是只要一个
所以每次加上一个长为
至于多测, 简单地值域处理一般化即可
实现#
难点不在实现
#include <bits/stdc++.h>
const int MAXVAL = 2e6 + 10;
int t, n;
int p[MAXVAL]; // 同族元素
int f[45][MAXVAL]; // 递推数组
std::string a, b;
/*旋转操作*/
int rotate(int x) {
return ((x & 1) << n - 1) | (x >> 1);
}
signed main()
{
scanf("%d %d", &t, &n);
memset(p, -1, sizeof p);
for (int i = 0; i < (1 << n); i++) {
int x = i;
while (!(~p[x])) p[x] = i, x = rotate(x);
}
f[0][0] = 1;
for (int i = 1, s = 0; i <= 2 * n; i++) {
s ^= (1 << ((i - 1) % n));
for (int j = 0; j < (1 << n); j++) f[i][p[j]] |= f[i - 1][p[j ^ s]];
}
while (t--)
{
std::cin >> a >> b;
int A = 0, B = 0;
for (int i = 0; i < n; i++) A |= ((a[i] - '0') << (n - i - 1)), B |= ((b[i] - '0') << (n - i - 1));
if (A == 0) { puts("0"); continue; }
for (int i = 1; ; i++) {
A ^= B, B = rotate(B);
if (f[i][p[A]]) { printf("%d\n", i); break; }
}
}
return 0;
}
总结#
对于
善于利用运算律简化问题
当观察到答案较小时, 考虑
- 分讨答案
- 枚举答案检查
玩样例可以找到一些有用的性质
如果多组测试数据有相通之处, 也许你可以全局的处理?
感觉这个题到紫了, 很难
枚举确定长度串的小
模拟操作情况, 贪心处理最好开销 (将简单情况先处理, 然后在基础上处理最值 / 简化操作)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】