BZOJ3637 Query on a tree VI(树链剖分+线段树)
考虑对于每一个点维护子树内与其连通的点的信息。为了换色需要,记录每个点黑白两种情况下子树内连通块的大小。
查询时,找到深度最浅的同色祖先即可,这可以比较简单的树剖+线段树乱搞一下(似乎就是qtree3),具体的,可以维护一下区间是否全黑/白,线段树上二分。换色会造成一个连通块分裂并产生新连通块,这只会影响到祖先节点的信息。同样树剖+线段树暴力改上去即可。
因为写的实在太丑没有一个oj能过,darkbzoj上42个点跑到第38个T掉了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
int n,m,p[N],color[N],t=;
int dfn[N],id[N],top[N],fa[N],son[N],size[N],cnt=;
int L[N<<],R[N<<],tree[][N<<],lazy[][N<<],same[][N<<];
struct data{int to,nxt;
}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs1(int k)
{
size[k]=;color[k]=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k])
{
fa[edge[i].to]=k;
dfs1(edge[i].to);
size[k]+=size[edge[i].to];
if (size[edge[i].to]>size[son[k]]) son[k]=edge[i].to;
}
}
void dfs2(int k,int from)
{
id[k]=++cnt;dfn[cnt]=k;
top[k]=from;
if (son[k]) dfs2(son[k],from);
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k]&&edge[i].to!=son[k]) dfs2(edge[i].to,edge[i].to);
}
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;same[][k]=;
if (l==r){tree[][k]=size[dfn[l]];tree[][k]=;return;}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
void down(int k)
{
tree[][k<<]+=lazy[][k],tree[][k<<|]+=lazy[][k];
tree[][k<<]+=lazy[][k],tree[][k<<|]+=lazy[][k];
lazy[][k<<]+=lazy[][k],lazy[][k<<|]+=lazy[][k];
lazy[][k<<]+=lazy[][k],lazy[][k<<|]+=lazy[][k];
lazy[][k]=lazy[][k]=;
}
int getsame(int k,int l,int r,int p)
{
if (L[k]==l&&R[k]==r) return same[p][k];
if (lazy[p][k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) return getsame(k<<,l,r,p);
else if (l>mid) return getsame(k<<|,l,r,p);
else return getsame(k<<,l,mid,p)&getsame(k<<|,mid+,r,p);
}
int query1(int k,int l,int r,int p)
{
if (L[k]==R[k]) return same[p][k]?l:;
if (lazy[p][k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) return query1(k<<,l,r,p);
else if (l>mid) return query1(k<<|,l,r,p);
else return getsame(k,mid,r,p)?query1(k<<,l,mid,p):query1(k<<|,mid+,r,p);
}
int queryance(int x,int p)
{
int ans=id[x];
while ()
{
int y=query1(,id[top[x]],id[x],p);
if (!y) break;
if (y>id[top[x]]) return y;
ans=id[top[x]];
if (x==) break;
x=fa[top[x]];
}
return ans;
}
int query(int k,int x,int p)
{
if (L[k]==R[k]) return tree[p][k];
if (lazy[p][k]) down(k);
int mid=L[k]+R[k]>>;
if (x<=mid) return query(k<<,x,p);
else return query(k<<|,x,p);
}
void modify(int k,int l,int r,int x,int p)
{
if (L[k]==l&&R[k]==r) {tree[p][k]+=x,lazy[p][k]+=x;return;}
if (lazy[p][k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) modify(k<<,l,r,x,p);
else if (l>mid) modify(k<<|,l,r,x,p);
else modify(k<<,l,mid,x,p),modify(k<<|,mid+,r,x,p);
}
void modifycolor(int k,int x,int p,int op)
{
if (L[k]==R[k]) {same[p][k]=op;return;}
int mid=L[k]+R[k]>>;
if (x<=mid) modifycolor(k<<,x,p,op);
else modifycolor(k<<|,x,p,op);
same[p][k]=same[p][k<<]&&same[p][k<<|];
}
void modifyance(int x,int p,int s,int y)
{
while (top[x]!=top[y])
{
modify(,id[top[x]],id[x],s,p);
x=fa[top[x]];
}
modify(,id[y],id[x],s,p);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3637.in","r",stdin);
freopen("bzoj3637.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
fa[]=;dfs1();
dfs2(,);
build(,,n);
m=read();
while (m--)
{
int op=read(),x=read(),y=queryance(x,color[x]);
if (op)
{
if (id[x]==y)
{
modifycolor(,id[x],color[x],);
color[x]^=;
modifycolor(,id[x],color[x],);
y=queryance(x,color[x]);
if (x>)
modifyance(fa[x],color[x],query(,id[x],color[x]),fa[dfn[y]]),
modify(,id[fa[x]],id[fa[x]],-query(,id[x],color[x]^),color[x]^);
}
else
{
if (x>)
modifyance(fa[x],color[x],-query(,id[x],color[x]),fa[dfn[y]]),
modify(,id[fa[x]],id[fa[x]],query(,id[x],color[x]^),color[x]^);
modifycolor(,id[x],color[x],);
color[x]^=;
modifycolor(,id[x],color[x],);
}
}
else printf("%d\n",query(,y,color[x]));
}
return ;
}
BZOJ3637 Query on a tree VI(树链剖分+线段树)的更多相关文章
- Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)
		You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ... 
- Aizu	2450 Do use segment tree 树链剖分+线段树
		Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ... 
- 【POJ3237】Tree(树链剖分+线段树)
		Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ... 
- POJ3237 Tree 树链剖分 线段树
		欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ... 
- 【CF725G】Messages on a Tree 树链剖分+线段树
		[CF725G]Messages on a Tree 题意:给你一棵n+1个节点的树,0号节点是树根,在编号为1到n的节点上各有一只跳蚤,0号节点是跳蚤国王.现在一些跳蚤要给跳蚤国王发信息.具体的信息 ... 
- Water Tree CodeForces 343D 树链剖分+线段树
		Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ... 
- 【BZOJ-2325】道馆之战      树链剖分 + 线段树
		2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ... 
- POJ3237 (树链剖分+线段树)
		Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ... 
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
		BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ... 
- 2243: [SDOI2011]染色  树链剖分+线段树染色
		给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ... 
随机推荐
- [agc002D]Stamp Rally-[并查集+整体二分]
			Description 题目大意:给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的边的最大编号最小.n, ... 
- day7  opencv+python    读取视频,没有东西
			1.读取视频man.avi, 报错. 我的视频和文件在同一目录下. #coding=utf-8 import numpy as np import cv2 cap = cv2.VideoCapture ... 
- vue 3.0使用 BUG解决
			最近在做vue的项目,吊进了很多坑,这些坑很浅,但一旦掉进去了,不花点功夫还爬不出来.所以总结下,当做下笔记,持续更新 1.<router-link> 里加的事件没反应 错误代码: < ... 
- python进程-进阶
			进程同步(multiprocessing.Lock(锁机制).multiprocessing.Semaphore(信号量机制).multiprocessing.Event(事件机制)) 在计算机中,有 ... 
- stl源码分析之allocator
			allocator封装了stl标准程序库的内存管理系统,标准库的string,容器,算法和部分iostream都是通过allocator分配和释放内存的.标准库的组件有一个参数指定使用的allocat ... 
- Migrating to WebSphere 9
			Migrating to WebSphere 9 Make a migration plan Requirements Migrate WebSphere profiles into the new ... 
- 【springmvc+mybatis项目实战】杰信商贸-7.生产厂家新增
			我们要实现新的功能,就是生产厂家的新增先来回顾一下系统架构图我们数据库这边已经建好表了,接下来要做的就是mapper映射 编辑FactoryMapper.xml文件,加入“添加”的逻辑配置代码块 &l ... 
- lxd&openstack-lxd源码剖析
			lxd:https://linuxcontainers.org/lxd/,目标是融入到openstack体系被管理,像虚拟机一样被管理使用.从如下图可知,并非走的是libvirt-lxc路线,而是no ... 
- 基于C#的机器学习--模糊逻辑-穿越障碍
			模糊逻辑-穿越障碍 模糊逻辑.另一个我们经常听到的术语.但它的真正含义是什么?它是否意味着不止一件事?我们马上就会知道答案. 我们将使用模糊逻辑来帮助引导一辆自动驾驶汽车绕过障碍,如果我们做得正确,我 ... 
- 剑指Offer66题的总结、目录
			原文链接 剑指Offer每日6题系列终于在今天全部完成了,从2017年12月27日到2018年2月27日,历时两个月的写作,其中绝大部分的时间不是花在做题上,而是花在写作上,这个系列不适合大神,大牛, ... 
