题意

给你个数p,n = 2^p;

有一棵树有n个节点,告诉你怎么连边;

每个点有个权值,每条边也有个权值,权值需要自行分配,[1,2,3..n...2n-1],总共2n-1个权值;

你需要选一个节点,使得他到所有其他边或者节点的简单路径的异或最大值最小。

思路

显然,给你个p,不直接给你n一定是有潜藏的东西的,分析一下,n = 2^p, 那么n 的结构一定是 1 000000 ,1后面都是0,那可以推测出最终的答案一定是小于等于n的



1. 初始节点可以随便选的,但是它的值一定设为n

2. 处于一个点的连接点与边来说,他们的关系一定是x,x+n,这样他们的异或值一定是n,可以保证答案在0-n之间改变,注意x与x+n的位置设置

3. 如果不这样构造,最高位是1的情况下,一定不优于这种构造

代码

#include<bits/stdc++.h>

using namespace std;
int n, p, st;
vector<pair<int, int>> g[300005];
int ans[300005], w[300005]; void dfs(int x, int fa, int pre) {
for (auto k: g[x]) {
if (k.first == fa)continue;
st++;
if ((st ^ pre) <= n) {
w[k.second] = st;
ans[k.first] = st + n;
} else {
w[k.second] = st + n;
ans[k.first] = st;
}
dfs(k.first, x, pre ^ n);
}
} void run() {
cin >> p;
n = 1 << p;
for (int i = 1; i <= n; i++)g[i].clear();
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
g[x].push_back(make_pair(y, i));
g[y].push_back(make_pair(x, i));
}
st = 0;
ans[1] = n;
dfs(1, 0, n);
cout << 1 << '\n';
for (int i = 1; i <= n; i++)cout << ans[i] << " \n"[i == n];
for (int i = 1; i < n; i++)cout << w[i] << " \n"[i == n - 1];
} int main() { int t;
cin >> t;
while (t--)
run();
return 0;
}

最新文章

  1. 【python】tarfile的路径问题
  2. WindowsPhone App如何扩展能够使用的内存
  3. JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
  4. (三)spark集群DHCP IP变化后的处理
  5. php + apache + mysql环境搭建
  6. Oracle 10g设置IP访问限制
  7. iOS: 学习笔记, Swift运算符定义
  8. Joomla 二次开发 学习笔记
  9. Swift - 纯代码实现页面segue跳转,以及参数传递
  10. Redis安装及简单測试
  11. vue2入门之vue-cli
  12. Loj #2331. 「清华集训 2017」某位歌姬的故事
  13. java上传文件获取跟目录的办法
  14. switch变种玩法
  15. Spring MVC 注解相关
  16. asp.net core MVC 控制器,接收参数,数据绑定
  17. kbmMW随机数与强密码
  18. SV中的数据类型
  19. 【图文教程】win7+VMware8.0+CentOS6.4 NAT上网
  20. python安装pip和使用pip安装Python库类比如pip安装beautifulsoup4

热门文章

  1. [CSharpTips]C#读取SQLite数据库中文乱码
  2. 【NOI P模拟赛】大阶乘(斯特林数)
  3. 快速搭建 SpringCloud Alibaba Nacos 配置中心!
  4. metasploit进行局域网远控
  5. CodeForces - 1701C
  6. SpringMVC 03: 请求和响应的乱码解决 + SpringMVC响应Ajax请求
  7. 在 C# CLR 中学习 C++ 之了解 extern
  8. Sqoop 组件安装与配置
  9. B树-查找
  10. 分布式链路追踪体验-skywalking入门使用