要注意利用一些题目的特殊条件吧。

题目大意

有一颗$n$个点带点权$a_i$的树,$q$次询问树上是否存在长度为$l$的路径。

$n,q,l\le 10^5,0 \le a_i \le 2$


题目分析

做的时候没有用好$a_i\le 2$的条件,以为是道玄学的点分。

将权值按奇偶性分类,那么因为每个点只能是$0,1,2$,所以对树上的每一条路径,每加入一个$1$点,其子路径所能表示的路径都+1,奇偶性就改变了;每加入一个$2$点,其子路径所能表示的路径都+2,奇偶性不变。

这样看来,按奇偶性分成的两类路径各自都是连续的。

那么变为一个子问题:求树上最长的路径。$f_{i,0/1}$表示点$i$包括自身向下的链中、奇偶性为$0/1$的最长链长,这个问题用dp就很容易解决了。

  1. #include<bits/stdc++.h>
  2. const int maxn = ;
  3. const int maxm = ;
  4.  
  5. int n,m,w[maxn],f[maxn][],ans[];
  6. int edgeTot,head[maxn],nxt[maxm],edges[maxm];
  7.  
  8. int read()
  9. {
  10. char ch = getchar();
  11. int num = , fl = ;
  12. for (; !isdigit(ch); ch=getchar())
  13. if (ch=='-') fl = -;
  14. for (; isdigit(ch); ch=getchar())
  15. num = (num<<)+(num<<)+ch-;
  16. return num*fl;
  17. }
  18. void addedge(int u, int v)
  19. {
  20. edges[++edgeTot] = v, nxt[edgeTot] = head[u], head[u] = edgeTot;
  21. edges[++edgeTot] = u, nxt[edgeTot] = head[v], head[v] = edgeTot;
  22. }
  23. void Max(int &x, int y){x = x>y?x:y;}
  24. void dfs(int x, int fa)
  25. {
  26. f[x][w[x]&] = w[x];
  27. for (int i=head[x]; i!=-; i=nxt[i])
  28. {
  29. int v = edges[i];
  30. if (v==fa) continue;
  31. dfs(v, x);
  32. Max(ans[], f[x][]+f[v][]);
  33. Max(ans[], f[x][]+f[v][]);
  34. Max(ans[], f[x][]+f[v][]);
  35. Max(ans[], f[x][]+f[v][]);
  36. Max(f[x][w[x]&], f[v][]+w[x]);
  37. Max(f[x][-(w[x]&)], f[v][]+w[x]);
  38. }
  39. Max(ans[], f[x][]), Max(ans[], f[x][]);
  40. }
  41. int main()
  42. {
  43. memset(head, -, sizeof head);
  44. n = read(), m = read();
  45. for (int i=; i<=n; i++) w[i] = read();
  46. for (int i=; i<n; i++) addedge(read(), read());
  47. dfs(, );
  48. for (int x; m; --m)
  49. {
  50. x = read();
  51. puts(ans[x&]>=x?"YES":"NO");
  52. }
  53. return ;
  54. }

END

【树形dp 思维题】HHHOJ#483. NOIP司马懿的更多相关文章

  1. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  2. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  3. 51nod 1353 树 | 树形DP经典题!

    51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...

  4. P2016 战略游戏——树形DP大水题

    P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...

  5. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  6. CF482D Random Function and Tree 树形DP + 思维 + 神题

    Code: #include<bits/stdc++.h> #define ull unsigned long long #define MOD 1000000007 #define ll ...

  7. cf796c 树形,思维题

    一开始以为是个树形dp,特地去学了..结果是个思维题 /* 树结构,设最大点权值为Max,则答案必在在区间[Max,Max+2] 证明ans <= Max+2 任取一个点作为根节点,那么去掉这个 ...

  8. HDU-4003 Find Metal Mineral 树形DP (好题)

    题意:给出n个点的一棵树,有k个机器人,机器人从根节点rt出发,问访问完整棵树(每个点至少访问一次)的最小代价(即所有机器人路程总和),机器人可以在任何点停下. 解法:这道题还是比较明显的能看出来是树 ...

  9. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

随机推荐

  1. 在vue中使用Normalize初始化样式

    参考链接:https://www.jianshu.com/p/34533b45aac1

  2. 配置nginx直接使用webpack生成的gz压缩文件,而不用nginx自己压缩

    参考链接:https://blog.csdn.net/ywl570717586/article/details/100011721

  3. 通过js判断整型,浮点型,布尔型,字符串型

    <!DOCTYPE html> <html > <head>     <meta charset="UTF-8">     < ...

  4. [loj#539][LibreOJ NOIP Round #1]旅游路线_倍增_dp

    「LibreOJ NOIP Round #1」旅游路线 题目链接:https://loj.ac/problem/539 题解: 这个题就很神奇 首先大力$dp$很好想,因为可以把一维放到状态里以取消后 ...

  5. [转帖] 基于telegraf, influxdb, grafana 建立 esxi 监控

    [系统集成] 基于telegraf, influxdb, grafana 建立 esxi 监控 https://www.cnblogs.com/hahp/p/7677420.html 之前在 nagi ...

  6. 【3.3】mysql中的Federated存储引擎,远程表,相当于sql server的linked server

    MySQL中针对不同的功能需求提供了不同的存储引擎.所谓的存储引擎也就是MySQL下特定接口的具体实现. FEDERATED是其中一个专门针对远程数据库的实现.一般情况下在本地数据库中建表会在数据库目 ...

  7. 方格取数--状压DP or 网络流

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1565 取不相邻的点是权值最大. 这题可以网络流做,暂时先DP一下,网络流明天学一下~~ #define I ...

  8. Python【print函数】

    下面是 print函数的一种用法,用逗号隔开,可在同一行打印不同类型的数据.x = input('请你输入被除数:')y = input('请你输入除数:')z = float(x)/float(y) ...

  9. Vue 表情输入组件,微信face表情组件

    VUE表情包输入组件,先来张成品图看看. 年底了没事干,把以前做过的项目中的组件拿出来再复习一下, 先说说思路吧. 注意: 1. 项目是用vue-cli3.0搭建起来的项目, 参考cli3.0官网地址 ...

  10. Java多线程(一):线程与进程

    1.线程和进程 1.1 进程 进程是操作系统的概念,我们运行的一个TIM.exe就是一个进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位 ...