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段组 ...
随机推荐
- SupperSocket深入浅出(二)
如果还没有看SuperStock深入浅出(一) ,请先看 这一章,主要说下命令是如果运行的.刚开始的时候会发现拷别人的代码命令是可以运行的,在修改的过程中突然发现命令无效了? 这里什么原因?,我先把代 ...
- day 9 名字管理系统
1 while True ##### 布尔值:True or False In [8]: a = 19 In [6]: a > 18 Out[6]: True In [7]: a < 18 ...
- LOJ #2585. 「APIO2018」新家
#2585. 「APIO2018」新家 https://loj.ac/problem/2585 分析: 线段树+二分. 首先看怎样数颜色,正常的时候,离线扫一遍右端点,每次只记录最右边的点,然后查询左 ...
- Hibernate各种主键生成策略与配置详解(转)
原文链接:http://www.cnblogs.com/hoobey/p/5508992.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate ...
- 面试之HTTP基础(不断完善中)
目录 1. HTTP状态码 2.Cookie和Session Cookie Session 3.短连接与长连接 4.HTTPs 加密 5.Http和https的区别 6.HTTP/1.0 与 HTTP ...
- 性能测试工具——LoadRunner篇(一)
一.LoadRunner组件 1.Virtual User Generato——r录制最终用户业务流程并创建性能 2.Controller——组织.驱动.管理并发监控负载测试 3.Analysis—— ...
- Java接口获取系统配置信息
Java获取当前运行系统的配置信息 接口:System.getProperty() 参数 描述 java.version Java运行时环境版本 java.vendor Java运行时环境供应商 ja ...
- http 502 bad gate way
世界杯期间,公司的cdn在回源时突然出现大量502. 刚出现问题时,因为考虑到一般502都是上游服务器出现问题,然后因为已经服务了很久都没有出现过这种问题, 就没有仔细考虑,就让回源中心的同事进行排查 ...
- 详解Python中的下划线
本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用 ...
- 网易客户端授权密码,errormsg='authentication failed (method LOGIN)' exitcode=EX_NOPERM
zabbix群里一网友在安装msmtp+mutt测试发送邮件失败 配置文件如下: /usr/local/msmtp/etc/msmtprc account default host smtp..com ...