题目大意:给定一棵N个顶点的树,顶点为1~N,对于一个序列A1,A2,…,An,若Ai | Aj == 2^60-1,则会连一条边(i,j)。要求求出一个序列,可以唯一确定所给定的树。

思路:考虑到树是一个二分图,可以考虑将二分图左侧顶点对应的值的二进制位后两位设置为01,而右部分对应设置为10,这样可以使得二分图同侧不会出现连边。接下来不妨把左侧顶点的其余二进制位都设为1,之后对于左侧的每个顶点,各从前面若干个1中选择一个不同的设为0,之后对于树中每个从左侧连接到右侧顶点的边,只要把右侧顶点二进制位中对应左侧顶点二进制位中0的那一位设置成1,就可以构造出答案了。

因为二分图中必然有一侧顶点数小于等于N/2,而选择顶点较少的一侧作为左侧,最多仅用到52位所以这个构造可行。

代码:

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
//#define int LL
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const int maxn = 110;
const double eps = 1e-6;
const LL MOD = 998244353; vector<int>G[maxn];
int V;
vector<int>B[2];
LL ans[maxn];
LL key[maxn];
bool used[maxn]; void add_edge(int from, int to)
{
G[from].push_back(to);
G[to].push_back(from);
} void dfs(int v, int pcol)
{
used[v] = true;
B[pcol ^ 1].push_back(v);
for (int i = 0; i < G[v].size(); i++)
{
int u = G[v][i];
if (!used[u])
dfs(u, pcol ^ 1);
}
} void solve()
{
LL mx = 1LL;
for (int i = 1; i <= 60; i++)
mx <<= 1;
mx -= 1;
dfs(1, 1);
LL base = 4LL;
if (B[1].size() < B[0].size())
swap(B[1], B[0]);
for (auto v : B[0])
{
ans[v] = mx;
ans[v] ^= base;
key[v] = base;
ans[v] -= 2LL;
base <<= 1;
}
for (auto v : B[1])
ans[v] |= 2LL;
for (auto v : B[0])
{
for (int i = 0; i < G[v].size(); i++)
{
int u = G[v][i];
ans[u] |= key[v];
}
}
for (int i = 1; i <= V; i++)
cout << ans[i] << ' ';
cout << endl;
} int main()
{
IOS;
int u, v;
cin >> V;
for (int i = 1; i < V; i++)
{
cin >> u >> v;
add_edge(u, v);
}
solve(); return 0;
}

2020ICPC济南站 J.Tree Constructer的更多相关文章

  1. @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...

  2. HDU3333 Turing Tree(线段树)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=3333 Description After inventing Turing Tree, 3x ...

  3. POJ3321 Apple Tree(DFS序)

    题目,是对一颗树,单点修改.子树查询.典型的dfs序入门题. DFS序可以将一颗树与子树们表示为一个连续的区间,然后用线段树来维护:感觉算是树链剖分的一种吧,和轻重链剖分不同的是这是对子树进行剖分的. ...

  4. Color a Tree[HDU1055]

    Color a Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. Codeforces 840D Expected diameter of a tree 分块思想

    Expected diameter of a tree 我们先两次dfs计算出每个点能到达最远点的距离. 暴力计算两棵树x, y连边直径的期望很好求, 我们假设SZ(x) < SZ(y) 我们枚 ...

  6. 平衡树 替罪羊树(Scapegoat Tree)

    替罪羊树(Scapegoat Tree) 入门模板题 洛谷oj P3369 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xx数 删除xx数(若有多个相同 ...

  7. Problem: Query on the tree(二分+划分树)

    题目链接: Problem: Query on the tree Time limit: 1s     Mem limit: 64 MB      Problem Description There ...

  8. Huffman Tree -- Huffman编码

    #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct HuffmanT ...

  9. 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?

    开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...

随机推荐

  1. 谷歌浏览器和火狐浏览器如何查看HTTP协议

    谷歌浏览器和火狐浏览器如何查看HTTP协议 谷歌浏览器查看HTTP协议 火狐浏览器查看HTTP协议

  2. Tomcat-如何在IDEA启动部署web模板

    IDEA部署工程到Tomcat上运行 1,建议修改web工程对应的Tomcat运行实例名称 2,将需要部署的web工程添加到Tomcat运行实例中,添加或删除 Application context: ...

  3. ansible roles实践——安装java

    [root@master] /etc/ansible$ cat roles/java/tasks/main.yml ---- name: unzip jdk unarchive: src=jdk-8u ...

  4. ElasticSearch+Kibana+Packetbeat

    一.介绍 Packetbeat 是一个实时网络数据包分析工具,通过嗅探应用服务器之间的网络通讯,来解码应用层协议类型如HTTP.MySQL.redis等等,关联请求与响应,并记录每个事务有意义的字段. ...

  5. Mac iterm2 配色以及终端大小写敏感解决方案

    iterm2是mac下非常好用的一款终端.但默认的配色实在不好用,经过一翻搜索终于找到了比较满意的,以下贴出博主的解决方案 配色 首先修改 ~/.bash_profile 加入一下代码 #enable ...

  6. MariaDB Spider 数据库分库分表实践

    分库分表 一般来说,数据库分库分表,有以下做法: 按哈希分片:根据一条数据的标识计算哈希值,将其分配到特定的数据库引擎中: 按范围分片:根据一条数据的标识(一般是值),将其分配到特定的数据库引擎中: ...

  7. Spring系列13:bean的生命周期

    本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: ...

  8. 微服务 架构 php+go

    p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 162, 255, 1) } 微服务  架构  php+ ...

  9. NoSuchMethodError错误

    发生原因: 一个项目中包含有相同名字,但内容不同的包 解决办法:删除其中暂时不用的包 后记:如果不知道哪一个包是多余的,直接用IDE查找:找到该类,然后将该包进行反编译,再次导入该项目,再找到该类,出 ...

  10. 关于在 Linux 下多个不相干的进程互斥访问同一片共享内存的问题

    转载请注明来源:https://www.cnblogs.com/hookjc/ 这里的"不相干",定义为: 这几个进程没有父子关系,也没有 Server/Client 关系 这一片 ...