题目大意:给定一棵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. ansible roles实践——安装httpd

    1. vim  httpd.yml 2.执行

  2. SharePoint Online 为Modern Page添加脚本

    前言 众所周知,如果我们想向SharePoint 页面添加脚本,最方便的便是经典页面,添加方式主要有内容编辑器Web部件或者直接使用SharePoint Designer. 但是,如果页面是Moder ...

  3. shiro-springboot整合,平行依赖

    最近在弄shiro,把shiro单独提出来,弄成一个子项目,这样可以降低项目的冗余,但是把shiro打成jar包后,另一个项目添加其依赖后,在IDE项目中正常的运行,打成jar包后运行,则不断的报错 ...

  4. Android 关于Intent的一些简略总结

    感谢大佬:https://www.jianshu.com/p/19147a69e970 Intent 常用构造方法: | 方法 | 描述 | |Intent() | 构造一个空 Intent | | ...

  5. homestead 入坑安装

    1.在使用 Homestead 之前,需要先安装 Virtual Box.VMWare.Parallels 或 Hyper-V (四选一,我们通常选择 VirtualBox,因为只有它是免费的)以及  ...

  6. 什么是Autolayout

    Autolayout是一种"自动布局"技术,专门用来布局UI界面的 Autolayout自iOS 6开始引入,由于Xcode 4的不给力,当时并没有得到很大推广 自iOS 7(Xc ...

  7. Linux-标准输入标准输出

    标准输入(代码为0) 标准输出(代码为1) 标准错误输出(代码为2) 将标准输出重定向到一个文件 find /etc -name fileA >list 等同于 find /etc -name ...

  8. Collections与Arrays

    集合框架中的工具类:特点:该工具类中的方法都是静态的. Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key) ...

  9. java中最简单的计算执行时长的方式

    日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.u ...

  10. 帆软报表(finereport)JS实现点击参数面板按钮显示或隐藏数据

    当报表中列出数据太多时,想通过显示按钮隐藏明细数据只显示统计数据.如下图示例,那么该如何实现呢?本文以FineReport为例,来讲述JS如何实现点击参数面板按钮显示或隐藏数据. 打开报表 在参数面板 ...