QTREE6 - Query on a tree VI

题目描述

给你一棵\(n\)个点的树,编号\(1\)~\(n\)。每个点可以是黑色,可以是白色。初始时所有点都是黑色。下面有两种操作请你操作给我们看:

  1. 0 u:询问有多少个节点v满足路径uv上所有节点(包括)都拥有相同的颜色
  2. 1 u:翻转u的颜色

输入格式

一行一个整数\(n\)

接下来\(n-1\)行,每行两个整数表示一条边

接下来一行一个整数\(m\)表示操作次数

接下来\(m\)行,每行两个整数分别表示操作类型和被操作节点

输出格式

对每个询问操作输出相应的结果


暴力分两棵树LCT维护会菊花树卡。

考虑把点权放到边上,这样的好处是当维护联通性时,只会改一条边。

把树搞成两颗,分别用LCT维护,一个点在激活在对应颜色的树的头顶边。

我们要资瓷询问子树信息,维护方法可以先做“大融合”

然后发现为了维护树的形态,我们不可以进行换根。

那么就要根据修改的形式自己yy\(link,cat,qurey\)那些东西了。


Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. const int N=502;
  4. int head[N],to[N<<1],Next[N<<1],cnt;
  5. void add(int u,int v)
  6. {
  7. to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
  8. }
  9. int dp[N][2];
  10. int max(int x,int y){return x>y?x:y;}
  11. void dfs(int now,int fa,int da,int db)
  12. {
  13. int s1=0,s2=-N,ison=0;
  14. for(int v,i=head[now];i;i=Next[i])
  15. if((v=to[i])!=fa)
  16. {
  17. dfs(v,now,da,db);
  18. s1+=max(dp[v][0],dp[v][1]);
  19. ison=1;
  20. }
  21. for(int v,i=head[now];i;i=Next[i])
  22. if((v=to[i])!=fa)
  23. s2=max(s2,s1-max(dp[v][0],dp[v][1])+dp[v][0]);
  24. dp[now][0]=s1,dp[now][1]=s2+ison;
  25. if(now==da||now==db) dp[now][1]=dp[now][0],dp[now][0]=-N;
  26. }
  27. int cal(int a,int b)
  28. {
  29. memset(dp,0,sizeof(dp));
  30. dfs(1,0,a,b);
  31. return max(dp[1][0],dp[1][1])+(a>0);
  32. }
  33. int n;
  34. int main()
  35. {
  36. scanf("%d",&n);
  37. for(int u,v,i=1;i<n;i++)
  38. {
  39. scanf("%d%d",&u,&v);
  40. add(u,v),add(v,u);
  41. }
  42. int a=cal(0,0),ans=0;
  43. for(int i=1;i<=n;i++)
  44. for(int j=i+1;j<=n;j++)
  45. {
  46. int d=cal(i,j);
  47. if(d==a+1)
  48. ++ans;
  49. }
  50. printf("%d\n",ans);
  51. return 0;
  52. }

2018.12.8

QTREE6 - Query on a tree VI 解题报告的更多相关文章

  1. SP16549 QTREE6 - Query on a tree VI LCT维护颜色联通块

    \(\color{#0066ff}{ 题目描述 }\) 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v ...

  2. [QTree6]Query on a tree VI

    Description: 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括 ...

  3. 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)

    洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...

  4. SPOJ 16549 - QTREE6 - Query on a tree VI 「一种维护树上颜色连通块的操作」

    题意 有操作 $0$ $u$:询问有多少个节点 $v$ 满足路径 $u$ 到 $v$ 上所有节点(包括)都拥有相同的颜色$1$ $u$:翻转 $u$ 的颜色 题解 直接用一个 $LCT$ 去暴力删边连 ...

  5. SP16549 QTREE6 - Query on a tree VI(LCT)

    题意翻译 题目描述 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥 ...

  6. SPOJ QTREE6 Query on a tree VI 树链剖分

    题意: 给出一棵含有\(n(1 \leq n \leq 10^5)\)个节点的树,每个顶点只有两种颜色:黑色和白色. 一开始所有的点都是黑色,下面有两种共\(m(1 \leq n \leq 10^5) ...

  7. bzoj3637 CodeChef SPOJ - QTREE6 Query on a tree VI 题解

    题意: 一棵n个节点的树,节点有黑白两种颜色,初始均为白色.两种操作:1.更改一个节点的颜色;2.询问一个节点所处的颜色相同的联通块的大小. 思路: 1.每个节点记录仅考虑其子树时,假设其为黑色时所处 ...

  8. bzoj 3637: Query on a tree VI 树链剖分 && AC600

    3637: Query on a tree VI Time Limit: 8 Sec  Memory Limit: 1024 MBSubmit: 206  Solved: 38[Submit][Sta ...

  9. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

随机推荐

  1. com.genuitec.runtime.generic.jee60 is not defined 导入项目的异常

    系统加载工程后,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined,在发布工程的同事电脑上正常 新导入的工程,出问题很 ...

  2. Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战

    想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码. 想要阅读Android的源 ...

  3. 算法笔记(c++)--完全背包问题

    算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1  价值为1,2,3,4,5  背包容量为10 # ...

  4. leetcode个人题解——#48 rotage image

    思路:本题要求不能利用额外的二维数组实现旋转,所以重点在于弄清矩阵旋转的数学方法. 我的方法是,首先按照副对角线进行对称,然后按照水平中轴线进行对称即可. class Solution { publi ...

  5. POWERDESIGNER生成的代码有引号

    昨天在用powerdesigner画的一个导入ORACLE中.发现都带了双引号, 当时没在意,以为是分隔符.那想后要在ORACLE查询表是一定要输入双引号才能查询.. 后来才知道而这在oracle 中 ...

  6. Python如何对折线进行平滑曲线处理?

    在用python绘图的时候,经常由于数据的原因导致画出来的图折线分界过于明显,因此需要对原数据绘制的折线进行平滑处理,本文介绍利用插值法进行平滑曲线处理: 实现所需的库 numpy.scipy.mat ...

  7. [笔记] FreeBSD使用小技巧

    非交互式添加用户 sed直接修改文件 sed -i '' 's/a/b/' file sed添加一行 sed '1a\ newline' file sed '1s/.*/&\'$'\nnewl ...

  8. hbase优化操作与建议

    一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...

  9. BVT、EVT、DVT、PVT产品开发几个阶段

      EVT EVT(Engineering Verification Test) 工程验证 产品开发初期的设计验证.设计者实现样品时做初期的测试验证,包括 功能和安规测试,一般由 RD(Researc ...

  10. redis 常用命令 结合php

    这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型.list类型和set类型的数据,需要的朋友可以参考下     redis的操作很多的,以 ...