大型补档计划

题目链接

神仙题。考虑转为图论模型。

若以 \(2 ^ k\) 个点,相互转化,很容易看出要求一个哈密尔顿环,显然对于 \(1000\) 规模的数据求不出来。

对于图论中环的算法,并且能满足数据规模的算法只有欧拉回路了,考虑点边换一下。

若以 \(2 ^{k - 1}\) 为点,可以相互平移一个距离转换的连一条边,显然有 \(2 ^ k\) 个互不相同的边,而且符合欧拉图的性质(每个点都有两个入度、两个出度),这样跑欧拉回路算法就行了。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1 << 10, M = (1 << 11) + 5;
int K, ans[N], s[M], tot, S1, S2, id[M];
int head[N], numE = 0;
struct E{
int next, v, w;
} e[M];
void add(int u, int v, int w) {
e[++numE] = (E) { head[u], v, w };
head[u] = numE;
}
void euler() {
int top = 0; s[++top] = 0;
while (top) {
if (id[top] != -1) {
ans[++tot] = id[top];
id[top] = -1;
}
int u = s[top], i = head[u];
if (i) {
id[top] = e[i].w;
s[++top] = e[i].v;
head[u] = e[i].next;
} else top--;
}
for (int i = 1; i <= K - 1; i++) putchar('0');
for (int i = tot; i > K - 1; i--) printf("%d", ans[i]);
}
int main() {
memset(id, -1, sizeof id);
scanf("%d", &K);
S1 = (1 << (K - 1)) - 1, S2 = (1 << K) - 1;
printf("%d ", 1 << K);
for (int i = 0; i <= S1; i++) {
add(i, (i << 1 | 1) & S1, 1);
add(i, (i << 1) & S1, 0);
}
euler();
return 0;
}

最新文章

  1. POJ 2125 Destroying the Graph 二分图最小点权覆盖
  2. SqlServer代理执行[分发清除: distribution] 无法删除快照文件
  3. HoloLens开发手记 - Unity之Keyboard input 键盘输入
  4. mongo 日记
  5. c#之委托和事件的区别
  6. 提交jar作业到spark上运行
  7. (转载)OSI七层参考模型和TCP/IP四层参考模型
  8. Flink资料(5) -- Job和调度
  9. configure mount nfs
  10. if __name__ == &#39;__main__&#39; 如何正确理解
  11. ●洛谷P2934 [USACO09JAN]安全出行Safe Travel
  12. linux 磁盘io监控
  13. Python复习笔记(十一)TCP/IP协议
  14. Faster R-CNN:详解目标检测的实现过程
  15. python之继承与派生
  16. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
  17. 【react】关于react框架使用的一些细节要点的思考
  18. vue 项目其他规范
  19. verilog语法实例学习(3)
  20. Spring中bean作用域属性scope

热门文章

  1. 异步FIFO学习笔记
  2. Spring源码之Bean生命周期
  3. Redis在springboot项目的使用
  4. Redis订阅
  5. LTMU论文解析
  6. Hibernate初识
  7. Docker学习第一天(Docker入门&amp;&amp;Docker镜像管理)
  8. 来看看面试必问的HashMap,一次彻底帮你搞定HashMap源码
  9. 下载器Folx专业版有没有iTunes整合功能
  10. Ubuntu无法telnet