主席树+dfs SPOJ BZOJ2588 Count on a tree
这道题我由于智障错误导致一直错。
在树上建主席树,加上lca思想,很简单。
#include<bits/stdc++.h>
using namespace std;
const int N=;
struct node
{
int to,nex;
}e[N<<];
struct tree
{
int l,r,s;
}t[];
int n,m,cnt,cn,mx,pre,head[N],f[N][],a[N],rt[N],d[N];
vector<int>v;
inline int get(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+;}
void add(int x,int y)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;
}
void update(int &x,int l,int r,int p,int num)
{
x=++cn;t[x]=t[p];t[x].s++;int mid=l+r>>;
if(l==r)return ;
if(mid>=num)update(t[x].l,l,mid,t[p].l,num);
else update(t[x].r,mid+,r,t[p].r,num);
}
void dfs(int x,int fa)
{
update(rt[x],,mx,rt[fa],get(a[x]));f[x][]=fa;d[x]=d[fa]+;
for(int i=;i<=;++i)
if(d[x]>=(<<i))
f[x][i]=f[f[x][i-]][i-];
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==fa)continue;
dfs(y,x);
}
}
int lca(int x,int y)
{
if(d[x]<d[y])swap(x,y);
int tmp=d[x]-d[y];
for(int i=;i>=;i--)
if(tmp&(<<i))x=f[x][i];
for(int i=;i>=;i--)
{
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
}
return x==y?x:f[x][];
}
int query(int l,int r,int rt1,int rt2,int rt3,int rt4,int k)
{
if(l==r){
pre=v[l-];return l;
}
int sum=t[t[rt1].l].s+t[t[rt2].l].s-t[t[rt3].l].s-t[t[rt4].l].s;
int mid=(l+r)>>;
if(sum>=k)return query(l,mid,t[rt1].l,t[rt2].l,t[rt3].l,t[rt4].l,k);
else return query(mid+,r,t[rt1].r,t[rt2].r,t[rt3].r,t[rt4].r,k-sum);
}
int main()
{
//freopen("rand.out","r",stdin);
//freopen("my.out","w",stdout);
int x,y,k;
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);v.push_back(a[i]);
}
sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());mx=v.size();
for(int i=;i<n;++i)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(,);
for(int i=;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&k);
int z=lca(pre^x,y);
printf("%d",v[query(,mx,rt[pre^x],rt[y],rt[z],rt[f[z][]],k)-]);
if(i<m) puts("");
}
return ;
}
BZOJ最后换行会PE。。。。
主席树+dfs SPOJ BZOJ2588 Count on a tree的更多相关文章
- 【BZOJ2588】Spoj 10628. Count on a tree 主席树+LCA
[BZOJ2588]Spoj 10628. Count on a tree Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lasta ...
- 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 ...
- 洛谷P2633/bzoj2588 Count on a tree (主席树)
洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...
- BZOJ2588 Count on a tree 【树上主席树】
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7577 Solved: 185 ...
- 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(树链剖分LCA+主席树)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Description 给定一棵N个节点的树,每个点 ...
- 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 ...
随机推荐
- asp.net DataTable导出 excel的方法记录(第三方)
官网:http://npoi.codeplex.com/ 简单应用,主要是可以实现我们想要的简单效果,呵呵 需要引入dll,可以在官网下载,也可在下面下载 protected void getExce ...
- uoj311 【UNR #2】积劳成疾
传送门:http://uoj.ac/problem/311 [题解] 这题的期望dp好神奇啊(可能是我太菜了) 由于每个位置都完全一样,所以我们设$f_{i,j}$表示审了连续$i$个位置,最大值不超 ...
- JSDom
什么是Dom? 1.简介 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.Document Object Model的历史可 ...
- 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)
题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...
- php常用函数——数学函数
php常用函数——数学函数
- elk系列1之入门安装与基本操作【转】
preface 我们每天都要查看服务器的日志,一方面是为了开发的同事翻找日志,另一方面是巡检服务器查看日志,而随着服务器数量以及越来越多的业务上线,日志越来越多,人肉运维相当痛苦了,此时,参考现在非常 ...
- mysqldump 逻辑备份的正确方法【转】
1. 利用mysqldump进行逻辑备份 1)全逻辑备份: mysqldump -uxxx -p --flush-logs --delete-master-logs --all-databases & ...
- 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践
之前介绍过关于HBase 0.9.8版本的部署及使用,本篇介绍下最新版本HBase1.2.4的部署及使用,有部分区别,详见如下: 1. 环境准备: 1.需要在Hadoop[hadoop-2.7.3] ...
- LFM隐语义模型Latent Factor Model
实际应用 LFM 模型在实际使用中有一个困难,就是很难实现实时推荐.经典的 LFM 模型每次训练都需要扫描所有的用户行为记录,并且需要在用户行为记录上反复迭代来优化参数,所以每次训练都很耗时,实际应用 ...
- CGIC函数说明
CGIC函数说明 参考cgic函数说明_Embedded Resources Library Online (C)郝博士 cgiFormResultType cgiFormString( char * ...