题目:https://vjudge.net/contest/411616#problem/K
题意:给出一个n个点,n-1条边的树,给定k个点的点权,判断是否有一种方法,将剩下n-k点填上点权,使得任意相邻的两个点点权之差为1,如果存在啧输出任意一种方案。
思路:
- 首先,差1可以得出相邻两点的奇偶性不同,因此我们只要根据这个条件判断合法性,并求出每个点的合法区间,就可以任意构造一组解。
- 构造合法区间可以考虑树形dp求解,对于每个点来说,它的合法区间就是本身和所有儿子结点的交集,求出所有合法区间,就可以任意跑出一组解了。
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
typedef unsigned long long ull;
vector<int>G[100010];
int l[100010],r[100010],vis[100010],val[100010],rt,ans[100010];
bool dfs1(int x,int fa,int tmp)
{
if(vis[x]&&tmp!=(val