[BZOJ]2589: Spoj 10707 Count on a tree II
Time Limit: 20 Sec Memory Limit: 400 MB
Description
Input
Output
Sample Input
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5
3 8
Sample Output
4
Solution
Code
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
inline int read()
{
int x,f=;char c;
while((c=getchar())<''||c>'')if(c=='-')f=;
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return f?x:-x;
}
#define MN 40000
#define K 713
#define LG 15
#define KS (MN/K)
map<int,int> mp;
struct edge{int nx,t;}e[MN*+];
int h[MN+],en,c[MN+],cnt,fa[LG+][MN+],d[MN+],s[MN+],ht[MN+],q[MN+],qr,b[MN+],p[KS+];
unsigned short ans[KS+][KS+],f[KS+][KS+][MN+];
bool u[KS+][KS+][MN+];
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
void pre(int x)
{
for(int i=h[x];i;i=e[i].nx)if(e[i].t!=fa[][x])
{
fa[][e[i].t]=x;d[e[i].t]=d[x]+;
pre(e[i].t);
s[x]+=s[e[i].t];ht[x]=max(ht[x],ht[e[i].t]+);
}
if(++s[q[++qr]=x],(ht[x]=max(ht[x],))==K||x<)
{for(p[++cnt]=x;s[x]--;)b[q[qr--]]=cnt;ht[x]=s[x]=;}
}
inline void cal(int a,int b,int x)
{
(u[a][b][x]^=)?f[a][b][c[x]]++?:++ans[a][b]:
--f[a][b][c[x]]?:--ans[a][b];
}
int lca(int x,int y)
{
int dx=d[x]-d[y],i;
if(dx<)swap(x,y),dx=-dx;
for(i=;dx;++i,dx>>=)if(dx&)x=fa[i][x];
if(x==y)return x;
for(i=LG;i>=;--i)if(fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int main()
{
int n,m,i,j,x,y,l=,lx=,ly=;
n=read();m=read();
for(i=;i<=n;++i)mp[c[i]=read()]?:mp[c[i]]=++cnt;
for(i=;i<=n;++i)c[i]=mp[c[i]];
for(i=;i<n;++i)ins(read(),read());
cnt=;pre();
for(i=;i<=LG;++i)for(j=;j<=n;++j)fa[i][j]=fa[i-][fa[i-][j]];
for(i=;i<=cnt;++i)for(j=;j<=cnt;++j)
for(x=p[i],y=p[j];x!=y;)
if(d[x]>d[y])cal(i,j,x),x=fa[][x];
else cal(i,j,y),y=fa[][y];
while(m--)
{
i=b[x=read()^l];j=b[y=read()];
if(x==lx&&y==ly){printf("%d\n",l);continue;}
cal(i,j,q[qr=]=lca(lx=x,ly=y));
while(x!=p[i])cal(i,j,q[++qr]=x),x=fa[][x];
while(y!=p[j])cal(i,j,q[++qr]=y),y=fa[][y];
printf("%d\n",l=ans[i][j]);
for(x=;x<=qr;++x)cal(i,j,q[x]);
}
}
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
inline int read()
{
int x,f=;char c;
while((c=getchar())<''||c>'')if(c=='-')f=;
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return f?x:-x;
}
#define MN 40000
#define K 200
#define LG 15
map<int,int> mp;
struct edge{int nx,t;}e[MN*+];
int h[MN+],en,c[MN+],cnt,fa[LG+][MN+],d[MN+],s[MN+],ht[MN+],q[MN+],qn;
int b[MN+],p[K+],u[MN+],ans[K+][MN+],a[MN+][K],v[MN+][K],vn;
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
void pre(int x)
{
for(int i=h[x];i;i=e[i].nx)if(e[i].t!=fa[][x])
{
fa[][e[i].t]=x;d[e[i].t]=d[x]+;
pre(e[i].t);
s[x]+=s[e[i].t];ht[x]=max(ht[x],ht[e[i].t]+);
}
if(++s[q[++qn]=x],(ht[x]=max(ht[x],))==K||x<)
{for(p[++cnt]=x;s[x]--;)b[q[qn--]]=cnt;ht[x]=s[x]=;}
}
void dfs(int k,int x,int f)
{
if(!u[c[x]]++)++ans[k][x];
if(!f)ans[k][fa[][x]]=ans[k][x],dfs(k,fa[][x],x);
else for(int i=h[x];i;i=e[i].nx)if(e[i].t!=f)
ans[k][e[i].t]=ans[k][x],dfs(k,e[i].t,x);
--u[c[x]];
}
void build(int x)
{
int i,j=c[x]/K,k=c[x]%K;
for(i=;i<K;++i)a[x][i]=a[fa[][x]][i];
for(++vn,i=;i<K;++i)v[vn][i]=v[a[x][j]][i];
v[a[x][j]=vn][k]=d[x];
for(i=h[x];i;i=e[i].nx)if(e[i].t!=fa[][x])build(e[i].t);
}
int lca(int x,int y)
{
int dx=d[x]-d[y],i;
if(dx<)swap(x,y),dx=-dx;
for(i=;dx;++i,dx>>=)if(dx&)x=fa[i][x];
if(x==y)return x;
for(i=LG;i>=;--i)if(fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int vio(int x,int y)
{
int res=;
for(qn=;x!=y;)
d[x]>d[y]?(u[q[++qn]=c[x]]++?:++res,x=fa[][x]):
(u[q[++qn]=c[y]]++?:++res,y=fa[][y]);
u[q[++qn]=c[x]]++?:++res;
while(qn)u[q[qn--]]=;
return res;
}
int main()
{
int n,m,i,j,x,y,l=;
n=read();m=read();
for(i=;i<=n;++i)mp[c[i]=read()]?:mp[c[i]]=++cnt;
for(i=;i<=n;++i)c[i]=mp[c[i]]-;
for(i=;i<n;++i)ins(read(),read());
cnt=;pre(d[]=);
for(i=;i<=LG;++i)for(j=;j<=n;++j)fa[i][j]=fa[i-][fa[i-][j]];
for(i=;i<=cnt;++i)dfs(i,p[i],);
build();
while(m--)
{
x=read()^l;y=read();
if(b[x]==b[y])l=vio(x,y);
else
{
if(d[p[b[x]]]<d[p[b[y]]])swap(x,y);
l=ans[b[x]][y];j=d[lca(x,y)];
for(i=x;i!=p[b[x]];i=fa[][i])if(!u[c[i]]++)
if(max(v[a[p[b[x]]][c[i]/K]][c[i]%K],v[a[y][c[i]/K]][c[i]%K])<j)++l;
for(i=x;i!=p[b[x]];i=fa[][i])u[c[i]]=;
}
printf("%d\n",l);
}
}
[BZOJ]2589: Spoj 10707 Count on a tree II的更多相关文章
- 【BZOJ2589】 Spoj 10707 Count on a tree II
BZOJ2589 Spoj 10707 Count on a tree II Solution 吐槽:这道题目简直...丧心病狂 如果没有强制在线不就是树上莫队入门题? 如果加了强制在线怎么做? 考虑 ...
- BZOJ2539 Spoj 10707 Count on a tree II
题面 题解 因为这道题目我也不太会做,所以借鉴了一下大佬heyujun的博客 如果不强制在线,这道题目是树上莫队练手题 我们知道莫队是离线的,但是万一强制在线就凉凉了 于是我们就需要一些操作:树分块 ...
- bzoj2589: Spoj 10707 Count on a tree II
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初 ...
- 【SPOJ】Count On A Tree II(树上莫队)
[SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...
- Bzoj 2588: Spoj 10628. Count on a tree 主席树,离散化,可持久,倍增LCA
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2588 2588: Spoj 10628. Count on a tree Time Limit ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)
Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 7669 Solved: 1894[Submi ...
随机推荐
- 敏捷冲刺每日报告五(Java-Team)
第五天报告(10.29 周日) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- 敏捷冲刺每日报告三(Java-Team)
第三天报告(10.27 周五) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- vue2 前端搜索实现
项目数据少的时候,搜索这样的小事情就要交给咱们前端来做了,重要声明,适用于小项目!!!!! 其实原理很简单,小demo是做搜索市区名称或者按照排名搜索. <div> <input t ...
- AWS EC2服务器的HTTPS负载均衡器配置过程
AWS EC2服务器配置负载均衡器步骤: 1.普通负载均衡器 至少两台EC2实例,这里以Centos6.7系统为例 启动之后先安装个apache的httpd服务器默认80端口,或者使用其他服务 ...
- CSS揭秘(三)形状
Chapter 3 1. 椭圆 椭圆的实现主要依靠 border-radius 属性,该属性确定边框切圆角的半径大小,可以指定数值 px,也可以使用百分比显示 而且该属性非常灵活,四个角可以分别设置 ...
- 延迟确认和Nagle算法
前篇文章介绍了三次握手和四次挥手,了解了TCP是如何建立和断开连接的,文末还提到了抓包挥手时的一个“异常”现象,当时无法解释,特地查了资料,知道了数据传输中的延迟确认策略. 何谓延迟确认策略? WIK ...
- 深度学习之 rnn 台词生成
深度学习之 rnn 台词生成 写一个台词生成的程序,用 pytorch 写的. import os def load_data(path): with open(path, 'r', encoding ...
- vue组件详解(四)——使用slot分发内容
一.什么是slot 在使用组件时,我们常常要像这样组合它们: <app> <app-header></app-header> <app-footer>& ...
- 写一个vue组件
写一个vue组件 我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目.如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli. 一个完整的vue组件 ...
- javascript改变style样式和css样式
转载 在很多情况下,都需要对网页上元素的样式进行动态的修改.在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用.效果.以及缺陷. 1.使用obj.className来修改样式表的 ...