树上连通块

不用具体距离,只询问连通块大小或者最大权值

可以类比Qtree5的方法,但是记录东西很多,例如子树有无0/1颜色等

一个trick,两个LCT分离颜色

每个颜色在边上。

仅保留连通块顶部不是相同颜色,使得断边不会被菊花图卡掉

所以内部颜色不用考虑了,专心维护子树值。

查询时候findrt,splay,右儿子即可。

Qtree6

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=+;
int n,m;
int f[N];
int co[N];
struct LCT{
#define ls ch[x][0]
#define rs ch[x][1]
int fa[N],ch[N][];
int sz[N],si[N];
bool nrt(int x){
return ch[fa[x]][]==x||ch[fa[x]][]==x;
}
void pushup(int x){
if(x)
sz[x]=si[x]+sz[ls]+sz[rs]+;
}
void rotate(int x){
int y=fa[x],d=ch[y][]==x;
fa[ch[y][d]=ch[x][!d]]=y;
if(nrt(y)) ch[fa[x]=fa[y]][ch[fa[y]][]==y]=x;
else fa[x]=fa[y];
fa[ch[x][!d]=y]=x;
pushup(y);
}
void splay(int x){
while(nrt(x)){
int y=fa[x],z=fa[y];
if(nrt(y)){
rotate((ch[y][]==x)==(ch[z][]==y)?y:x);
}
rotate(x);
}
pushup(x);
}
void access(int x){
for(reg y=;x;y=x,x=fa[x]){
//cout<<" xx "<<x<<endl;
splay(x);si[x]-=sz[y];si[x]+=sz[ch[x][]];
ch[x][]=y;
pushup(x);
}
}
int findrt(int x){
access(x);splay(x);
while(ch[x][]) x=ch[x][];
splay(x);
return x;
}
void link(int x){
//cout<<" link "<<x<<endl;
splay(x);
int y=fa[x]=f[x];
access(y);splay(y);
si[y]+=sz[x];
pushup(y);
}
void cut(int x){
// cout<<" cut "<<x<<endl;
access(x);splay(x);
// cout<<ls<<" "<<ch[x][0]<<endl;
ls=fa[ls]=;
pushup(x);
}
int query(int x){
int lp=findrt(x);
// cout<<" lp "<<lp<<" "<<sz[lp]<<" "<<si[lp]<<endl;
return sz[lp]-si[lp]-;
}
}lct[];
vector<int>to[N];
void dfs(int x){
for(reg i=;i<(int)to[x].size();++i){
if(to[x][i]!=f[x]){
f[to[x][i]]=x;dfs(to[x][i]);
lct[].link(to[x][i]);
}
}
}
int main(){
rd(n);
int x,y;
for(reg i=;i<n;++i)rd(x),rd(y),to[x].push_back(y),to[y].push_back(x);
for(reg i=;i<=n+;++i) lct[].sz[i]=,lct[].sz[i]=,co[i]=;
to[n+].push_back();
dfs(n+);
int op;
rd(m);
while(m--){
rd(op);rd(x);
if(!op){
printf("%d\n",lct[co[x]].query(x));
}else{
lct[co[x]].cut(x);
// cout<<" after co[x] cut "<<endl;
lct[co[x]^].link(x);
co[x]^=;
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/15 10:57:40
*/

Qtree7

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=1e5+;
const int inf=0x3f3f3f3f;
int n,m;
int fa[N];
struct LCT{
struct node{
int ch[],fa;
int val;
int ans;
priority_queue<int>q,d;
void dele(int c){
d.push(c);
}
void ins(int c){
q.push(c);
}
int top(){
while(!q.empty()&&!d.empty()&&q.top()==d.top()) q.pop(),d.pop();
if(!q.empty()) return q.top();
return -inf;
}
}t[N];
bool nrt(int x){
return t[t[x].fa].ch[]==x||t[t[x].fa].ch[]==x;
}
void pushup(int x){
t[x].ans=max(t[x].val,max(t[x].top(),max(t[t[x].ch[]].ans,t[t[x].ch[]].ans)));
}
void rotate(int x){
int y=t[x].fa,d=t[y].ch[]==x;
t[t[y].ch[d]=t[x].ch[!d]].fa=y;
if(nrt(y)) t[t[x].fa=t[y].fa].ch[t[t[y].fa].ch[]==y]=x;
else t[x].fa=t[y].fa;
t[t[x].ch[!d]=y].fa=x;
pushup(y);
}
void splay(int x){
while(nrt(x)){
int y=t[x].fa,z=t[y].fa;
if(nrt(y)){
rotate((t[y].ch[]==x)==(t[z].ch[]==y)?y:x);
}rotate(x);
}
pushup(x);
}
void access(int x){
for(reg y=;x;y=x,x=t[x].fa){
splay(x);t[x].dele(t[y].ans);
t[x].ins(t[t[x].ch[]].ans);
t[x].ch[]=y;
pushup(x);
}
}
int findrt(int x){
access(x);splay(x);
while(t[x].ch[]) x=t[x].ch[];
splay(x);
return x;
}
void link(int x){
// cout<<" link "<<x<<" t.fa "<<t[x].fa<<" fa "<<fa[x]<<" ans "<<t[x].ans<<" val "<<t[x].val<<endl;
splay(x);
int y=t[x].fa=fa[x];
access(y);splay(y);
t[y].ins(t[x].ans);
pushup(y);
}
void cut(int x){
access(x);splay(x);
t[x].ch[]=t[t[x].ch[]].fa=;
pushup(x);
}
void chan(int x,int c){//chan val
access(x);splay(x);
t[x].val=c;
pushup(x);
}
int query(int x){
int lp=findrt(x);
return t[t[lp].ch[]].ans;
}
}lct[];
vector<int>to[N];
int co[N],wei[N];
void dfs(int x){
//cout<<x<<endl;
for(reg i=;i<(int)to[x].size();++i){
int y=to[x][i];
if(y==fa[x]) continue;
fa[y]=x;
dfs(y);
lct[co[y]].link(y);
}
}
int main(){ rd(n);
lct[].t[].ans=lct[].t[].val=-inf;
lct[].t[].ans=lct[].t[].val=-inf;
lct[].t[n+].ans=lct[].t[n+].val=-inf;
lct[].t[n+].ans=lct[].t[n+].val=-inf;
int x,y;
for(reg i=;i<n;++i){
rd(x);rd(y);
to[x].push_back(y);to[y].push_back(x);
}
to[n+].push_back();
for(reg i=;i<=n;++i){
rd(co[i]);
}
for(reg i=;i<=n;++i){
rd(wei[i]);
// cout<<" i "<<i<<" "<<wei[i]<<endl;
lct[].t[i].val=lct[].t[i].ans=wei[i];
lct[].t[i].val=lct[].t[i].ans=wei[i];
}
wei[n+]=-inf;
dfs(n+); rd(m);int op;
while(m--){
rd(op);rd(x);
if(op==){
printf("%d\n",lct[co[x]].query(x));
}else if(op==){
lct[co[x]].cut(x);lct[co[x]^].link(x);
co[x]^=;
}else{
rd(y);
lct[].chan(x,y);
lct[].chan(x,y);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/15 14:12:29
*/

QTREE6&&7 - Query on a tree VI &&VII的更多相关文章

  1. QTREE6 - Query on a tree VI 解题报告

    QTREE6 - Query on a tree VI 题目描述 给你一棵\(n\)个点的树,编号\(1\)~\(n\).每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我 ...

  2. 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 ...

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

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

  4. [QTree6]Query on a tree VI

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Linux(CentOS7)命令学习摘要

    1. 修改机器名 hostnamectl set-hostname newname 2. hosts主机存放位置 /etc/hosts 3. 安装tigervncserver, 然后使用vncserv ...

  2. oracle建表流程

    --创建表空间test1 create tablespace test1 datafile 'd:\test1.dbf' size 100m autoextend on next 10m --创建用户 ...

  3. bootstrap模态框关闭后清除模态框的数据

    https://segmentfault.com/q/1010000008789123 bootstrap模态框第二次打开时如何清除之前的数据? 我用了bootstrap模态框的remote功能,在弹 ...

  4. 判断浏览器是否支持H5

    window.onload = function() { if (!window.applicationCache) { alert("请升级您的浏览器版本,你的浏览器不支持HTML5!&q ...

  5. MyBatis全局配置文件的各项标签3

    mapper 将sql映射注册到全局配置中,这个我们在上一章已经使用过了, resource 这个属性是用来引用类路径下的sql映射文件 url 这个属性是用来引用网络路径或磁盘路径下的sql映射文件 ...

  6. RBAC模型

    1.RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角 ...

  7. LODOP.FORMAT格式转换【回调和直接返回值】

    Lodop中有一些格式转换函数,这些函数和其他众多函数一样,c-lodop需要使用回调函数On_Return返回,Lodop插件方式直接返回,通常混合部署,写法要兼容两个控件.可以用if (LODOP ...

  8. MyISAM索引和InnoDB索引的区别

    首先你要知道: 无论是Myisam和Innodb引擎,如果在建表的时候没有显示的定义一行主键列的话,他内部都会自动创建一个隐藏的主键索引: 主键索引以外的索引假设称为次索引:首先Myisam和Inno ...

  9. DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例

    本文已收录至:开源 DotNetty 实现的 Modbus TCP/IP 协议 ModbusFunction 类图如下: 如前文所述,所有请求/相应的 PDU 均继承自 ModbusFunction, ...

  10. spawn

    转载:http://motioo.blog.163.com/blog/static/117718291200954102830215/ 并行计算使用的节点数在开始运行程序时进行指定. 学习了FFT之后 ...