[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 ...
随机推荐
- Beta冲刺第五天
一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:日程刷新重构. 2.黄腾达:创建协作日程当选择只触发一次时自动填充1,并禁用input. 3.张合胜:修复列表显示日程重复单位的格式化. 三.明日 ...
- LOW版统计词频
import string path = 'waldnn' with open(path,'r') as text: words = [raw_word.strip(string.punctuatio ...
- EasyUI 主布局整合。
博文学习地址:http://www.cnblogs.com/xishuai/p/3620327.html html: <%@ Page Language="C#" AutoE ...
- LeetCode & Q268-Missing Number-Easy
Array Math Bit Manipulation Description: Given an array containing n distinct numbers taken from 0, ...
- Python内置函数(28)——iter
英文文档: iter(object[, sentinel]) Return an iterator object. The first argument is interpreted very dif ...
- api-gateway实践(04)新服务网关 - 新手入门
一.网关引擎环境 1.下载代码 2.搭建环境 3.打包部署 二.配置中心环境 1.下载代码 2.搭建环境 3.打包部署 三.创建业务实例 1.以租户身份登录配置中心,注册 group.version. ...
- window.open()参数详解及对浏览器的兼容性
因为篇幅,window.open()浏览器的兼容性请点击 这里 Part1:参数详解 window.open(url,name,param) url:即将打开的子窗口的地址:比如 "http ...
- 对JVM虚拟机中方法区的理解
因为jdk8的jvm已经取消了方法区,所以这边先主要介绍jdk8以下版本中方法区相关内容. 1.虚拟机规范中方法区的概念: 原文链接:http://docs.oracle.com/javase/spe ...
- NetSNMP开源代码学习——小试牛刀
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 题外话:技术越是古董级的东西,越是值得学习. 一. 配置 参考: http://www.cnbl ...
- spark算子:partitionBy对数据进行分区
def partitionBy(partitioner: Partitioner): RDD[(K, V)] 该函数根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区. s ...