luogu

vjudge

题意

一棵树,每个点初始有个点权和颜色(输入会给你)

0 u :询问所有u,v路径上的最大点权,要满足u,v路径上所有点的颜色都相同

1 u :反转u的颜色

2 u w :把u的点权改成w

\(color_i\in [0,1],w_i\in [−10^9,10^9],n,m≤10^5\)

sol

和\(QTree 6\)很像啊。丢个链接就跑

只要额外对每个点维护一个虚子树的最大权值即可。

开一个\(multiset\)写起来比较爽。

然后就做完了

code

我不会说我因为快读打错了debug了一个晚上的

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<set>
  5. using namespace std;
  6. int gi()
  7. {
  8. int x=0,w=1;char ch=getchar();
  9. while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
  10. if (ch=='-') w=0,ch=getchar();
  11. while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  12. return w?x:-x;
  13. }
  14. const int N = 1e5+5;
  15. int n,m,col[N],w[N],fa[N];
  16. vector<int>G[N];
  17. struct LCT{
  18. int fa[N],ch[2][N],mx[N];
  19. multiset<int>S[N];
  20. bool son(int x){return x==ch[1][fa[x]];}
  21. bool isroot(int x)
  22. {
  23. return x!=ch[0][fa[x]]&&x!=ch[1][fa[x]];
  24. }
  25. void pushup(int x)
  26. {
  27. mx[x]=max(max(mx[ch[0][x]],mx[ch[1][x]]),w[x]);
  28. if (!S[x].empty()) mx[x]=max(mx[x],*S[x].rbegin());
  29. }
  30. void rotate(int x)
  31. {
  32. int y=fa[x],z=fa[y],c=son(x);
  33. ch[c][y]=ch[c^1][x];if (ch[c][y]) fa[ch[c][y]]=y;
  34. fa[x]=z;if (!isroot(y)) ch[son(y)][z]=x;
  35. ch[c^1][x]=y;fa[y]=x;pushup(y);
  36. }
  37. void splay(int x)
  38. {
  39. for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
  40. if (!isroot(y)) son(x)^son(y)?rotate(x):rotate(y);
  41. pushup(x);
  42. }
  43. void access(int x)
  44. {
  45. for (int y=0;x;y=x,x=fa[x])
  46. {
  47. splay(x);if (ch[1][x]) S[x].insert(mx[ch[1][x]]);
  48. ch[1][x]=y;if (ch[1][x]) S[x].erase(mx[ch[1][x]]);
  49. pushup(x);
  50. }
  51. }
  52. int findroot(int x)
  53. {
  54. access(x);splay(x);
  55. while (ch[0][x]) x=ch[0][x];
  56. splay(x);return x;
  57. }
  58. void link(int x,int y)
  59. {
  60. if (!y) return;
  61. access(y);splay(y);splay(x);
  62. fa[x]=y;S[y].insert(mx[x]);pushup(y);
  63. }
  64. void cut(int x,int y)
  65. {
  66. if (!y) return;
  67. access(x);splay(x);
  68. ch[0][x]=fa[ch[0][x]]=0;pushup(x);
  69. }
  70. }T[2];
  71. void dfs(int u,int f)
  72. {
  73. for (int i=0,sz=G[u].size();i<sz;++i)
  74. {
  75. int v=G[u][i];if (v==f) continue;
  76. T[col[v]].link(v,u);fa[v]=u;
  77. dfs(v,u);
  78. }
  79. }
  80. int main()
  81. {
  82. n=gi();
  83. for (int i=1;i<n;++i)
  84. {
  85. int u=gi(),v=gi();
  86. G[u].push_back(v);G[v].push_back(u);
  87. }
  88. for (int i=1;i<=n;++i) col[i]=gi();
  89. for (int i=1;i<=n;++i) w[i]=gi();
  90. T[0].mx[0]=T[1].mx[0]=-2147483647;
  91. dfs(1,0);m=gi();
  92. while (m--)
  93. {
  94. int opt=gi(),u=gi();
  95. if (!opt){
  96. T[col[u]].access(u);int ff=T[col[u]].findroot(u);
  97. if (col[ff]==col[u]) printf("%d\n",T[col[u]].mx[ff]);
  98. else printf("%d\n",T[col[u]].mx[T[col[u]].ch[1][T[col[u]].findroot(u)]]);
  99. }
  100. else if (opt==1) T[col[u]].cut(u,fa[u]),col[u]^=1,T[col[u]].link(u,fa[u]);
  101. else{
  102. T[col[u]].access(u);T[col[u]].splay(u);
  103. w[u]=gi();T[col[u]].pushup(u);
  104. }
  105. }
  106. return 0;
  107. }

[SP16580]QTREE7的更多相关文章

  1. 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)

    洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...

  2. SP16580 QTREE7 - Query on a tree VII(LCT)

    题意翻译 一棵树,每个点初始有个点权和颜色(输入会给你) 0 u:询问所有u,v路径上的最大点权,要满足u,v路径上所有点颜色相同 1 u:反转u的颜色 2 u w:把u的点权改成w 题解 Qtree ...

  3. SP16580 QTREE7 - Query on a tree VII

    Description 一棵树,每个点初始有个点权和颜色(0/1) 0 u :询问所有u,v 路径上的最大点权,要满足u,v 路径上所有点的颜色都相同 1 u :反转u 的颜色 2 u w :把u 的 ...

  4. LCT总结——应用篇(附题单)(LCT)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...

  5. 一些$LCT$的瓜皮题目

    一些瓜皮 放几个比较优(she)秀(pi)的\(LCT\)题. 老惯例,每一题代码因为一些未知原因消失了(如果要的话私我好了,虽然会咕咕咕). 嘴巴\(AC\)真香! [SP16580] QTREE7 ...

  6. LCT题单(自己的做题情况反馈)(转自Flash)

    LCT题单(自己的做题情况反馈)(转自Flash) 随时进Flash Hu的LCT看一发 也可以看一下我自己的风格的板子 开始 维护链信息(LCT上的平衡树操作) [X] 洛谷P3690 [模板]Li ...

  7. 【SPOJ】QTREE7(Link-Cut Tree)

    [SPOJ]QTREE7(Link-Cut Tree) 题面 洛谷 Vjudge 题解 和QTREE6的本质是一样的:维护同色联通块 那么,QTREE6同理,对于两种颜色分别维护一棵\(LCT\) 每 ...

  8. SPOJ QTREE7

    题意 一棵树,每个点初始有个点权和颜色 \(0 \ u\) :询问所有\(u,v\) 路径上的最大点权,要满足\(u,v\) 路径上所有点的颜色都相同 $1  u \(:反转\)u$ 的颜色 \(2 ...

  9. 【转载】LCT题单

    本篇博客的题单转载自FlashHu大佬的博客:LCT总结--应用篇(附题单)(LCT). 关于\(LCT\)可以查看这篇博客:\(LCT\)入门. 这里面有些题解的链接是空链接,尚未补全. 维护链信息 ...

随机推荐

  1. Loadrunner脚本篇——从文件中读取内容并参数化

    直接代码展示: char* testfn() { int count, total = 0; char * buffer = NULL; int filelenth = 0; long file_st ...

  2. c# 内部类使用接口IComparer实现排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Service degrade

    服务降级:主要是针对非正常情况下的应急服务措施;比如电商平台,在针对618.双11等高峰情形下采用部分服务不出现或者延时出现的情形. 为什么是非正常情况下呢,比如我要出差,如果经常出差的话,要带的衣服 ...

  4. 每天一个Linux命令(43)at命令

        at命令用于在指定时间执行命令.at允许使用一套相当复杂的指定时间的方法.可以用相对时间法指定,也可以用绝对时间法指定.     (1)用法:     用法:  at  [选项参数]  [时间 ...

  5. github资源下载速度慢的解决办法

    xx-net:https://github.com/XX-net/XX-Net

  6. OpenCV图片拼接的两种方法

    https://my.oschina.net/xiaot99/blog/226589 一.原图 1.jpg                                        2.jpg   ...

  7. imx6q Xorg下Qt应用开机自启动及添加桌面快捷启动图标的方法

    启动scene3d例子: root@imx6qsabresd:/etc/X11/Xsession.d# ls -altotal 36drwxr-xr-x 2 root root 4096 Mar 12 ...

  8. 爬虫实例之使用requests和Beautifusoup爬取糗百热门用户信息

    这次主要用requests库和Beautifusoup库来实现对糗百的热门帖子的用户信息的收集,由于糗百的反爬虫不是很严格,也不需要先登录才能获取数据,所以较简单. 思路,先请求首页的热门帖子获得用户 ...

  9. centos_mysql5.6.21_rpm安装

    1.查看操作系统相关信息.[root@linuxidc ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@l ...

  10. Tomcat虚拟目录的配置

    Tomcat可以作为应用服务器部署Java应用,同时可以创建虚拟目录存放图片,相当于一个图片服务器使用1. 创建目录 /usr/images/2. 编辑TOMCAT_HOME/conf/server. ...