bzoj2589: Spoj 10707 Count on a tree II
Description
Input
Output
#include<bits/stdc++.h>
const int N=;
int n,m,B;
int read(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
int v[N],vs[N],e[N*][],e0[N],ep=,la=;
int id[N],rt[N],idp=,fa[N],dep[N],t[N],ANS=;
int sz[N],pf[N],top[N];
int ans[][N],h[N];
int mem[*N],*ptr=mem;
struct Array{
int*arr[];
const int&operator[](int x){
return arr[x>>][x&];
}
void copy(Array&src,int x,int y){
memcpy(&arr,&src.arr,*);
ptr+=;
memcpy(ptr,arr[x>>],*);
ptr[x&]=y;
arr[x>>]=ptr;
}
}as[N];
int lca(int x,int y){
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]<dep[b])std::swap(a,b),std::swap(x,y);
x=fa[a];a=top[x];
}
return dep[x]<dep[y]?x:y;
}
int vio(int x,int y){
int a=lca(x,y),r=;
for(int w=x;w!=a;w=fa[w])if(!t[v[w]]++)++r;
for(int w=y;w!=a;w=fa[w])if(!t[v[w]]++)++r;
if(!t[v[a]])++r;
for(int w=x;w!=a;w=fa[w])t[v[w]]=;
for(int w=y;w!=a;w=fa[w])t[v[w]]=;
return r;
}
int query(int x,int y){
if(id[x]==id[y])return vio(x,y);
if(dep[rt[id[x]]]<dep[rt[id[y]]])std::swap(x,y);
int d=dep[lca(x,y)],b=rt[id[x]];
int r=ans[id[b]][y];
for(int w=x;w!=b;w=fa[w]){
int c=v[w];
if(!t[c]&&as[b][c]<d&&as[y][c]<d)++r,t[c]=;
}
for(int w=x;w!=b;w=fa[w])t[v[w]]=;
return r;
}
void f3(int w,int pa,int ID){
if(!t[v[w]]++)++ANS;
ans[ID][w]=ANS;
for(int i=e0[w];i;i=e[i][]){
int u=e[i][];
if(u!=pa)f3(u,w,ID);
}
if(!--t[v[w]])--ANS;
}
void f1(int w,int pa){
sz[w]=;
fa[w]=pa;
dep[w]=dep[pa]+;
for(int i=e0[w];i;i=e[i][]){
int u=e[i][];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[pf[w]])pf[w]=u;
}
}
}
void f2(int w){
for(int i=e0[w];i;i=e[i][]){
int u=e[i][];
if(u!=fa[w]&&!id[u]){
id[u]=id[w];
f2(u);
}
}
}
void f4(int w){
as[w].copy(as[fa[w]],v[w],dep[w]);
for(int i=e0[w];i;i=e[i][]){
int u=e[i][];
if(u!=fa[w])f4(u);
}
}
void f5(int w,int tp){
top[w]=tp;
if(pf[w])f5(pf[w],tp);
for(int i=e0[w];i;i=e[i][]){
int u=e[i][];
if(u!=fa[w]&&u!=pf[w])f5(u,u);
}
}
void f6(int w){
h[w]=;
for(int i=e0[w];i;i=e[i][]){
int u=e[i][];
if(u!=fa[w]&&!id[u]){
f6(u);
if(h[u]>=h[w])h[w]=h[u]+;
}
}
}int main(){
n=read();m=read();
B=sqrt(n+)+;
for(int i=;i<=n;i++)vs[i]=v[i]=read();
std::sort(vs+,vs+n+);
for(int i=;i<=n;i++)v[i]=std::lower_bound(vs+,vs+n+,v[i])-vs;
for(int i=;i<n;i++){
int a=read(),b=read();
e[ep][]=b;e[ep][]=e0[a];e0[a]=ep++;
e[ep][]=a;e[ep][]=e0[b];e0[b]=ep++;
}
for(int i=;i<;i++)as[].arr[i]=mem;
f1(,);
do{
f6();
int r=;
for(int i=;i<=n;i++)if(!id[i]&&h[i]==B){
r=i;
break;
}
rt[id[r]=++idp]=r;
f2(r);
f3(r,,idp);
}while(!id[]);
f4();f5(,);
while(m--){
int x=read()^la,y=read();
printf("%d\n",la=query(x,y));
}
return ;
}
bzoj2589: 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的博客 如果不强制在线,这道题目是树上莫队练手题 我们知道莫队是离线的,但是万一强制在线就凉凉了 于是我们就需要一些操作:树分块 ...
- [BZOJ]2589: Spoj 10707 Count on a tree II
Time Limit: 20 Sec Memory Limit: 400 MB Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor last ...
- 【BZOJ2589】[SPOJ10707]Count on a tree II
[BZOJ2589][SPOJ10707]Count on a tree II 题面 bzoj 题解 这题如果不强制在线就是一个很\(sb\)的莫队了,但是它强制在线啊\(qaq\) 所以我们就用到了 ...
- 【SPOJ】Count On A Tree II(树上莫队)
[SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...
- spoj COT2 - Count on a tree II
COT2 - Count on a tree II http://www.spoj.com/problems/COT2/ #tree You are given a tree with N nodes ...
- SPOJ COT2 - Count on a tree II(LCA+离散化+树上莫队)
COT2 - Count on a tree II #tree You are given a tree with N nodes. The tree nodes are numbered from ...
- SPOJ COT2 Count on a tree II(树上莫队)
题目链接:http://www.spoj.com/problems/COT2/ You are given a tree with N nodes.The tree nodes are numbere ...
- SPOJ COT2 Count on a tree II (树上莫队)
题目链接:http://www.spoj.com/problems/COT2/ 参考博客:http://www.cnblogs.com/xcw0754/p/4763804.html上面这个人推导部分写 ...
随机推荐
- ZOJ 1234 Chopsticks
原题链接 题目大意:有这么一个公式 A,B,C(A<=B<=C), (A-B)^2来衡量这对数字的好坏,值越小越好.现在给出一个数组,要求每三个配对,最后得到的每组值总和最小. 解法:我是 ...
- input type=file
(1)首先来说一下,如何让 <input type='file' >成为你想要的模样. 最简单的方法就是在让<input type='file' >的透明度为0(完全透明),然 ...
- hive学习笔记_hive的介绍与安装
一.什么是Hive Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据 ...
- google-http-java-client(android学习篇2源码)
package com.google.api.services.samples.googleplus.cmdline.simple; import com.google.api.client.ht ...
- 课堂所讲整理:HTML--8Window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunmen ...
- backtrack下whatweb的使用
whatweb是backtrack下的一款Web识别工具,位于 Applications-->BackTrack-->Information Gathing-->Web Applic ...
- VS2013远程调试功能
我跪了,我真的跪了. 实际证明这是不可行的. [开发机] Win10,64bits,VS2013 [目标机] Winxp VS2013的debug tool不能在xp上安装运行,卒! 如果有win7, ...
- Linux驱动设计——内存与IO访问
名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内 ...
- freeswitch 挂断前执行脚本
通道变量名 api_hangup_hook 介绍在挂断时执行指定API命令 示例 <action application="set" data="api_hangu ...
- Lua5.1基本函数库介绍
Lua5.1基本函数库介绍assert (v [, message])功能:相当于C的断言,参数:v:当表达式v为nil或false将触发错误,message:发生错误时返回的信息,默认为" ...