[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 ...
随机推荐
- 20162330 实验一 《Java开发环境的熟悉》 实验报告
2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验一 <Java开发环境的熟悉> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623 ...
- 【iOS】Swift GCD-下
欢迎来到本GCD教程的第二同时也是最终部分! 在第一部分中,你学到了并发,线程以及GCD的工作原理.通过使用dispatch_barrrier和dispatch_sync,你做到了让PhotoMana ...
- ELK学习总结(3-2)elk的过滤查询
和一般查询比较,filter查询:能够缓存数据在内存中,应该尽可能使用 建立测试数据 查看测试数据 1.filtered查询 GET /store/products/_search { "q ...
- notepad++运行Python
1.打开notepad++的菜单栏,点击run 2.输入cmd /k python "$(FULL_CURRENT_PATH)" & PAUSE & EXIT 3. ...
- Stanford依存句法关系解释
ROOT:要处理文本的语句 IP:简单从句 NP:名词短语 VP:动词短语 PU:断句符,通常是句号.问号.感叹号等标点符号 LCP:方位词短语 PP:介词短语 CP:由'的'构成的表示修饰性关系的短 ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- python/MySQL(索引、执行计划、BDA、分页)
---恢复内容开始--- python/MySQL(索引.执行计划.BDA.分页) MySQL索引: 所谓索引的就是具有(约束和加速查找的一种方式) 创建索引的缺点是对数据进行(修改.更新.删除) ...
- Django(博客系统):文章内容使用django-ckeditor、文章简介使用django-tinymce
文章内容使用django-ckeditor 1)安装django-ckeditor pip install django-ckeditorpip install Pillow 2)在settings. ...
- Iframe父页面与子页面之间的相互调用
iframe元素就是文档中的文档. window对象: 浏览器会在其打开一个HTML文档时创建一个对应的window对象.但是,如果一个文档定义了一个或者多个框架(即:包含一个或者多个frame或者i ...
- C# QQ邮箱授权码发送邮件
using System.Net;using System.Web.Mail; public class SendMail { /// <summary> /// 发送Email /// ...