QTREE6&&7 - Query on a tree VI &&VII
树上连通块
不用具体距离,只询问连通块大小或者最大权值
可以类比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的更多相关文章
- QTREE6 - Query on a tree VI 解题报告
QTREE6 - Query on a tree VI 题目描述 给你一棵\(n\)个点的树,编号\(1\)~\(n\).每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我 ...
- 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 ...
- SP16549 QTREE6 - Query on a tree VI LCT维护颜色联通块
\(\color{#0066ff}{ 题目描述 }\) 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v ...
- [QTree6]Query on a tree VI
Description: 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括 ...
- 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)
洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...
- SPOJ 16549 - QTREE6 - Query on a tree VI 「一种维护树上颜色连通块的操作」
题意 有操作 $0$ $u$:询问有多少个节点 $v$ 满足路径 $u$ 到 $v$ 上所有节点(包括)都拥有相同的颜色$1$ $u$:翻转 $u$ 的颜色 题解 直接用一个 $LCT$ 去暴力删边连 ...
- SP16549 QTREE6 - Query on a tree VI(LCT)
题意翻译 题目描述 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥 ...
- SPOJ QTREE6 Query on a tree VI 树链剖分
题意: 给出一棵含有\(n(1 \leq n \leq 10^5)\)个节点的树,每个顶点只有两种颜色:黑色和白色. 一开始所有的点都是黑色,下面有两种共\(m(1 \leq n \leq 10^5) ...
- bzoj3637 CodeChef SPOJ - QTREE6 Query on a tree VI 题解
题意: 一棵n个节点的树,节点有黑白两种颜色,初始均为白色.两种操作:1.更改一个节点的颜色;2.询问一个节点所处的颜色相同的联通块的大小. 思路: 1.每个节点记录仅考虑其子树时,假设其为黑色时所处 ...
随机推荐
- 日期选择器date、week、time、datetime、datetime-local类型
下面只写两个类型的代码案例,其他都大同小异 date类型: <!DOCTYPE html> <html> <head> <meta charset=" ...
- Day 3-5 装饰器
开放-封闭原则: 封闭:已实现的功能代码块不应该被修改. 开放:对现有功能的扩展开放. 装饰器: 定义:在符合'开放-封闭'的原则下,给程序扩展其他的功能! 例:在不更改tokyo函数的情况下.给to ...
- python中的 list (列表)append()方法 与extend()方法的用法 和 区别
参考: https://www.cnblogs.com/xuchunlin/p/5479119.html
- ansible的playbook简单使用
一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...
- python django 的环境搭建(centos)
一.安装好nginx 二.安装uwsgi yum install python-devel -y pip3 install uwsgi #测试启动django /usr/local/python3/b ...
- 用织梦建站如何去掉a这个目录,还有内容页的a
1.另外建一个站点,将物理路径直接指向a即可. 2.去掉文章页生成的带a的路径: 只需要这一句话: function='str_replace("/a","" ...
- flask保存 文件到本地
本篇队长介绍一下如何 把前端上传的文件保存 到 后端flask项目目录 首先讲一下上传.保存文件的思路: 第一步:前端通过post请求方式提交上传的文件 <input id="file ...
- Apache的commons工具类
package cn.zhou; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileU ...
- 所活天数!java Date应用
package cn.jiu.com; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...
- codeforces474D
Flowers CodeForces - 474D 话说某个幸运的小伙伴X拿到了kevin女神送的蛋糕,然而他的吃法非常奇特,他独创了两种吃蛋糕的办法:一.一次吃一整个蛋糕:二.一次吃k个蛋糕. 那么 ...