题目链接:点击查看

题目大意:给出一棵树,初始时每条边都没有权值,要求给 n - 1 条边赋值,需要满足任意两个叶子结点之间路径上的权值异或和为 0 ,设边权的种类为 k ,求 k 的最小值和最大值

题目分析:一开始以为是一个构造题,然后又想偏了,其实题目已经给提示了,那就是说边权的值可能会很大很大,这就提示我们说,如果满足某种条件的话,那么肯定是可以找出一种赋值对应答案的,这个题最终也只需要输出边权种类的两个最值,而不需要输出具体的赋值情况

回到这个题目上来,其实最小值不难想,什么情况可以使得所有的边权都使用同一个数呢?根据两个相同的数异或等于 0 这个小结论,不难得出只有任意两个叶子结点之间简单路径上边的个数为偶数时才是可行的,换句话说,跑一下树的深度,所有叶子结点的奇偶性如果相同,那就说明满足条件,最小值就是 1 ,否则就是 3 ,这里的 3 又该如何理解呢,既然存在两个叶子结点之间的简单路径是奇数条,可以拿出三条边,赋值使其异或和为 0 ,剩下的边肯定是偶数条了,再用上面的方法处理就好了,这样最小值非一即三,跑一次dfs得到数的深度就能判断了

关于最大值,猜结论的话答案就是:初始时 ans = n - 1 ,对于每个节点而言,与其相连的叶子结点设有 cnt 个,则对答案的贡献为 ans -= max( 0 , cnt - 1 )

为什么可以这样想呢?因为如果想让异或和为 0 的话,只有两个数的话,当且仅当这两个数相同时异或和才为 0 ,但是如果是三个及以上的数的话,就总是存在着一种赋值使得这些数都不相同且异或和为零,所以我们只需要找出有多少对叶子结点之间的距离小于等于 2 ,那就说明这些叶子结点的赋值必须一样才能满足异或和为 0 ,而其余没有涉及到的边肯定是可以找到一种赋值满足边权皆不相同且异或和为 0 这个条件的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;vector<int>node[N];bool flag;int deep[N];void dfs(int u,int fa,int dep)
{deep[u]=dep;if(node[u].size()==1&&(deep[u]&1))flag=true;for(auto v:node[u]){if(v==fa)continue;dfs(v,u,dep+1);}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}int root;for(int i=1;i<=n;i++)if(node[i].size()==1){root=i;break;}flag=false;dfs(root,-1,0);int mmin=flag?3:1;int mmax=n-1;for(int u=1;u<=n;u++){int cnt=0;for(auto v:node[u])if(node[v].size()==1)cnt++;mmax-=max(0,cnt-1);}printf("%d %d\n",mmin,mmax);return 0;
}

CodeForces - 1339D Edge Weight Assignment(思维)相关推荐

  1. Codeforces Round #633 B. Edge Weight Assignment 结论题 + dp

    传送门 文章目录 题意: 思路: 题意: 思路: 首先考虑最小值,如果从一个叶子结点出发到任意叶子的距离都为偶数,那么只需要一个值就可以满足条件.如果有奇数的,考虑111 ^ 222 ^ 3=03=0 ...

  2. D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))

    D. Best Edge Weight 给定一个有nnn个点mmm条边的无向连通图,有mmm次询问,每次询问第iii条边的权值最大为多少,这张图的所有最小生成树的方案中,一定包含第iii条边. 先跑一 ...

  3. Codeforces 827D Best Edge Weight 倍增 + 并查集 || 倍增 + 压倍增标记 (看题解)

    Best Edge Weight 我们先找出一棵最小生成树, 对于非树边来说, 答案就是两点路径上的最大值 - 1, 这个直接倍增就能处理. 对于树边来说, 就是非树边的路径经过这条边的最小值 - 1 ...

  4. Codeforces 1077B Disturbed People(思维题)

    Codeforces 1077B Disturbed People(思维题) There is a house with nn flats situated on the main street of ...

  5. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  6. Codeforces 846 A Curriculum Vitae 思维 暴力

    题目链接: http://codeforces.com/contest/846/problem/A 题目描述: 给你一个串, 你可以做删除操作, 要求结果串0不能在1的右边, 问最多可以剩几个数字 解 ...

  7. Codeforces 861 B Which floor? 思维

    题目链接: http://codeforces.com/contest/861/problem/B 题目描述: 每个楼梯上有相同数量的数, 都是从1开始, 给你m个不矛盾的信息, 问你能不能判断n在第 ...

  8. CodeForces - 1494E A-Z Graph(构造+思维)

    题目链接:https://vjudge.net/problem/CodeForces-1494E 题目大意:给出一个初始时只有 nnn 个点的有向带权图,需要执行 mmm 次操作,每次操作分为下列三种 ...

  9. CodeForces - 1504C Balance the Bits(思维+构造)

    题目链接:https://vjudge.net/problem/CodeForces-1504C 题目大意:给出一个长度为 nnn 的 010101 串,现在要求构造出两个长度为 nnn 的合法括号序 ...

最新文章

  1. 关于手机系统信息的总结
  2. pda找不到服务器,PDA连不上服务器常见问题分析.doc
  3. 植树节快乐|用小学数学到高数的知识思考种树,你能种到哪一步?
  4. sqlserver多表联查分页
  5. 【lua学习】7.环境
  6. Linux多线程开发-线程同步-条件变量pthread_cond_t
  7. python-study-17
  8. python api加快交易速度_使用Python3的pipedriveapi将交易输出限制为1000个交易
  9. MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
  10. ASP.NET性能监控和优化入门
  11. Nginx环境搭建Discuz论坛
  12. 【企鹅电竞直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)
  13. dell r710重装系统_dell服务器安装系统指南
  14. php iconv translit,php iconv translit for removing accents: not working as excepted?
  15. 如何在UEFI模式下安装Linux,详解 UEFI 模式下安装 Linux
  16. 血与荣耀(第七章-战鼓)
  17. iOS_21团购_拼音搜索
  18. 我的心只悲伤七次-纪伯伦
  19. Android Studio链接夜神模拟器
  20. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

热门文章

  1. mysql有3个共同好友_共同好友mysql
  2. ConcurrentHashMap的源码分析-put方法第二阶段
  3. TCP/IP的二层负载
  4. 命令提示符_基本介绍
  5. 添加拦截器解析用户信息
  6. 内存溢出与内存泄漏区别
  7. 原型共享数据 原型简单语法 原型中方法是可以相互访问 实例对象属性方法层层搜索
  8. php的验证码要gd库,怎么在PHP中使用GD库实现一个验证码功能
  9. html 列表循环_python web开发:内置标签与过滤器/循环/条件判断
  10. 俄罗斯“指尖旋风”席卷南京