【树上莫队】bzoj3757 苹果树
学习这位神犇的:http://blog.csdn.net/jiangyuze831/article/details/41476865
注意:
①排序时第一关键字是左端点所在块编号(块状树),第二关键字是右端点dfs序。
②维护的当前链不能包括lca(l,r),但最后要计算上lca(l,r)的答案。
③对l->l'/r->r'取反的时候也不能取反lca(l,l')/lca(r,r')。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 50001
#define M 100001
int n,m;
int first[N],en,next[N<<1],dfsn[N],v[N<<1],fa[N],bel[N],dep[N],siz[N],cnt,top[N];
int x,y,root,sz,col[N],Time[N],ans,anss[M];
bool vis[N];
struct ASK{int l,r,a,b,id;void Read(){scanf("%d%d%d%d",&l,&r,&a,&b);}}Q[M];
bool operator < (const ASK &a,const ASK &b)
{return bel[a.l]!=bel[b.l] ? bel[a.l]<bel[b.l] : dfsn[a.r]<dfsn[b.r];}
void AddEdge(const int &U,const int &V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
void dfs(int cur)
{
dfsn[cur]=++cnt;
for(int i=first[cur];i;i=next[i])
if(v[i]!=fa[cur])
{
dep[v[i]]=dep[cur]+1;
fa[v[i]]=cur;
dfs(v[i]);
}
}
void makeblock(int cur)
{
for(int i=first[cur];i;i=next[i])
if(v[i]!=fa[cur])
{
if(siz[bel[cur]]<sz)
{
++siz[bel[cur]];
bel[v[i]]=bel[cur];
top[v[i]]=top[cur];
}
makeblock(v[i]);
}
}
int QLCA(int U,int V)
{
while(U!=V)
{
if(top[U]==top[V])
{
if(dep[U]<dep[V])
swap(U,V);
U=fa[U];
}
else
{
if(dep[top[U]]<dep[top[V]])
swap(U,V);
U=fa[top[U]];
}
}
return U;
}
void update(const int &Col,const int &op)
{
Time[Col]+=op;
if(!Time[Col]) --ans;
else if(Time[Col]==1&&op==1) ++ans;
}
void Work(int U,int V,int lca)
{
while(U!=lca)
{
vis[U]^=1;
update(col[U],vis[U]?1:-1);
U=fa[U];
}
while(V!=lca)
{
vis[V]^=1;
update(col[V],vis[V]?1:-1);
V=fa[V];
}
}
void Solve(const int &p)
{
int lca=QLCA(Q[p].l,Q[p].r);
if(p==1) Work(Q[p].l,Q[p].r,lca);
else
{
Work(Q[p-1].l,Q[p].l,QLCA(Q[p-1].l,Q[p].l));
Work(Q[p-1].r,Q[p].r,QLCA(Q[p-1].r,Q[p].r));
}
update(col[lca],1);
anss[Q[p].id]=ans;
if(Q[p].a!=Q[p].b)
anss[Q[p].id]-=(Time[Q[p].a]&&Time[Q[p].b]);
update(col[lca],-1);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&col[i]);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&x,&y);
if(!x) root=y;
else if(!y) root=x;
else
{
AddEdge(x,y);
AddEdge(y,x);
}
}
dfs(root);
for(int i=1;i<=n;i++)
{
siz[bel[i]=dfsn[i]]=1;
top[i]=i;
}
sz=(((int)sqrt(n))<<1);
makeblock(root);
for(int i=1;i<=m;++i) Q[i].Read(),Q[i].id=i;
sort(Q+1,Q+m+1);
for(int i=1;i<=m;++i) Solve(i);
for(int i=1;i<=m;++i) printf("%d\n",anss[i]);
return 0;
}
【树上莫队】bzoj3757 苹果树的更多相关文章
- 【BZOJ-3757】苹果树 块状树 + 树上莫队
3757: 苹果树 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1305 Solved: 503[Submit][Status][Discuss] ...
- [BZOJ3757]苹果树(树上莫队)
树上莫队共有三种写法: 1.按DFS序列分块,和普通莫队类似.常数大,不会被卡. 2.按块状树的方式分块.常数小,会被菊花图卡到O(n). 3.按[BZOJ1086]王室联邦的方式分块.常数小,不会被 ...
- BZOJ3757: 苹果树【树上莫队】
Description 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树 ...
- 2018.09.16 bzoj3757: 苹果树(树上莫队)
传送门 一道树上莫队. 先用跟bzoj1086一样的方法给树分块. 分完之后就可以莫队了. 但是两个询问之间如何转移呢? 感觉很难受啊. 我们定义S(u,v)" role="pre ...
- 【BZOJ3757】苹果树(树上莫队)
点此看题面 大致题意: 每次问你树上两点之间路径中有多少种颜色,每次询问可能会将一种颜色\(a\)看成\(b\). 树上莫队 这题是一道树上莫队板子题. 毕竟求区间中有多少种不同的数是莫队算法的经典应 ...
- 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)
2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...
- 树上莫队 wowow
构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块. int dfs(int x){ ; dfn[x]=++ind; ;i<=;i++) if (bin[i]<=deep[x]) f ...
- [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】
题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...
- spoj COT2 - Count on a tree II 树上莫队
题目链接 http://codeforces.com/blog/entry/43230树上莫队从这里学的, 受益匪浅.. #include <iostream> #include < ...
- BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]
传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include < ...
随机推荐
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- QT QLayout 清空
QLayout* pLayout = (QLayout*)ui->frame->layout(); )) { QWidget* pWidget = child->widget(); ...
- DIV + CSS问题收集
div里面有三列数据,怎么让他竖向排列,在css中怎么设置 https://zhidao.baidu.com/question/712007772597664245.html css设置块元素在div ...
- [04] css 选择器
1.元素选择器 常见的html标签元素 h1 { color: red; } body { background: red; } 2.分组选择器 例如body和h2标签的字体颜色都是red,使用逗号将 ...
- Linux下部署weblogic应用
1.Linux下weblogic安装 2.Linux下设置weblogic监听服务器地址(默认为本机) 1).修改domain\config\config.xml文件 修改 <server> ...
- 记另类Request method 'GET' not supported
一般遇到Request method 'GET' not supported这种问题,大家都会找相应controller下的具体方法,把get改为post之类.但是我这次是在访问静态资源,static ...
- [BZOJ3275]Number解题报告|网络流
Description 有N个正整数,需要从中选出一些数,使这些数的和最大.若两个数a,b同时满足以下条件,则a,b不能同时被选1:存在正整数C,使a*a+b*b=c*c2:gcd(a,b)=1 这道 ...
- http://www.himigame.com/mac-cocoa-application/893.html
[Cocoa(mac) Application 开发系列之一]创建第一个application—计算器 终于HTTP与Socket服务器以及cocos2dx之间的通信各种框架成功完成后,现在抽时间学习 ...
- textbox自动提示
AutoCompleteStringCollection myCutomSource = new AutoCompleteStringCollection(); myCutomS ...
- python 多进程锁Lock和共享内存
多进程锁 lock = multiprocessing.Lock() 创建一个锁 lock.acquire() 获取锁 lock.release() 释放锁 with lock: 自动获取.释放锁 类 ...