bzoj2588 counting on a tree
题目不难,树上可持久化数据结构。
帖代码:
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1000005 int n,m,hed[N],cnt,mx;
struct ED
{
int to,nxt;
}e[*N];
struct ND
{
int x,id;
}nd[N];
int to[N],v[N];
bool cmp(ND a,ND b)
{
return a.x<b.x;
}
void ae(int f,int t)
{
e[++cnt].to = t;
e[cnt].nxt = hed[f];
hed[f] = cnt;
}
int dep[N],fa[N],siz[N],son[N],tp[N];
void dfs1(int u,int f)
{
siz[u]=;
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(to == f)continue;
fa[to]=u;
dep[to]=dep[u]+;
dfs1(to,u);
siz[u]+=siz[to];
if(siz[to]>siz[son[u]])son[u]=to;
}
}
void dfs2(int u,int t)
{
tp[u]=t;
if(!son[u])return ;
dfs2(son[u],t);
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(to==fa[u]||to==son[u])continue;
dfs2(to,to);
}
}
int get_lca(int a,int b)
{
while(tp[a]!=tp[b])
{
if(dep[tp[a]]<dep[tp[b]])swap(a,b);
a=fa[tp[a]];
}
return dep[a]<dep[b]?a:b;
}
int tot,rt[N];
struct segtree
{
int ls,rs;
int vl;
}tr[*N];
void update(int u)
{
tr[u].vl=tr[tr[u].ls].vl+tr[tr[u].rs].vl;
}
void insert(int l,int r,int &u,int k,int qx)
{
u = ++tot;
tr[u].ls =tr[k].ls,tr[u].rs=tr[k].rs,tr[u].vl=tr[k].vl;
if(l==r)
{
tr[u].vl++;
return ;
}
int mid = (l+r)>>;
if(qx<=mid)insert(l,mid,tr[u].ls,tr[k].ls,qx);
else insert(mid+,r,tr[u].rs,tr[k].rs,qx);
update(u);
}
void build(int u)
{
insert(,mx,rt[u],rt[fa[u]],v[u]);
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].to;
if(to==fa[u])continue;
build(to);
}
}
int query(int l,int r,int u,int v,int lca,int fl,int ned)
{
if(l==r)return to[l];
int k = tr[tr[u].ls].vl+tr[tr[v].ls].vl-tr[tr[lca].ls].vl-tr[tr[fl].ls].vl;
int mid = (l+r)>>;
if(ned<=k)return query(l,mid,tr[u].ls,tr[v].ls,tr[lca].ls,tr[fl].ls,ned);
else return query(mid+,r,tr[u].rs,tr[v].rs,tr[lca].rs,tr[fl].rs,ned-k);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&nd[i].x),nd[i].id=i;
sort(nd+,nd++n,cmp);
int las = -;
for(int i=;i<=n;i++)
{
if(nd[i].x!=las)
{
las=nd[i].x;
to[++mx]=nd[i].x;
}
v[nd[i].id]=mx;
}
for(int f,t,i=;i<n;i++)
{
scanf("%d%d",&f,&t);
ae(f,t),ae(t,f);
}
dfs1(,),dfs2(,);
build();
int ans = ;
for(int u,v,k,i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&k);
u^=ans;
int lca = get_lca(u,v);
ans = query(,mx,rt[u],rt[v],rt[lca],rt[fa[lca]],k);
printf("%d\n",ans);
}
return ;
}
bzoj2588 counting on a tree的更多相关文章
- 洛谷P2633/bzoj2588 Count on a tree (主席树)
洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K ...
- 主席树+dfs SPOJ BZOJ2588 Count on a tree
这道题我由于智障错误导致一直错. 在树上建主席树,加上lca思想,很简单. #include<bits/stdc++.h> using namespace std; ; struct no ...
- BZOJ2588 Count on a tree 【树上主席树】
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Submit: 7577 Solved: 185 ...
- HDU - 4358 Boring counting (dsu on tree)
Boring counting: http://acm.hdu.edu.cn/showproblem.php?pid=4358 题意: 求一棵树上,每个节点的子节点中,同一颜色出现k次 的 个数. 思 ...
- [BZOJ2588]Count on a tree(LCA+主席树)
题面 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问 ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- bzoj2588 Count on a tree
题意:给定一棵树,有点权,不带修改,询问路径点权第K大,强制在线. 这道题建主席树的方法好机智.按照BFS/DFS序建树,对于每个点,建出"这个点到根节点的路径上的点"组成的权值线 ...
- BZOJ2588:Count on a tree(主席树)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
随机推荐
- E20170405-gg
repository n. 存储库,知识库 Permanent adj 永久的 host n 主机,住处人,主人 authenticate v 使生效,验证 shell n 外壳 commi ...
- android内存溢出 java.lang.OutOfMemoryError
今天在做ListView 的时候.想做一个音乐列表模块,前面是图片,后面是分类名称,如下图: 结果运行时候,LogCat是总是报 java.lang.OutOfMemoryError的错误,顾名思义, ...
- Luogu P1754球迷购票问题【dp/卡特兰数】By cellur925
题目传送门 虽然是水dp,但我感到还是有些无从下手== f[i][j]表示还剩i个50元没考虑,j个100元没考虑的方案数,可有转移f[i][j]=f[i-1][j]+f[i][j-1] 但其实它也可 ...
- mac 配置nginx 虚拟域名(转载)
我是通过homebrew 安装nginx 的,所以安装目录是默认的,之前多个server都是放在默认安装目录下的nginx.conf里的,但是这样不太好,就是会导致nginx.conf 越来越长,而且 ...
- selenium自动化测试实例
11.1使用JavaScripExecutor单击元素 被测试网页:http://www.sogou.com Java代码 public class NewTest { WebDriver ...
- scikit-learning教程(三)使用文本数据
使用文本数据 本指南的目标是探讨scikit-learn 一个实际任务中的一些主要工具:分析二十个不同主题的文本文档(新闻组帖子)集合. 在本节中,我们将看到如何: 加载文件内容和类别 提取适用于机器 ...
- sql 防注入插入
var strsql = "insert into Staff_Answer (ExamTitleID,QuestionsID,MultipleChoice,RightOption,Answ ...
- AJPFX总结多线程编程的注意事项
多线程编程的注意事项 1.明确目的,为什么要使用多线程?如果是由于单线程读写或者网络访问(例如HTTP访问互联网)的瓶颈,可以考虑使用线程池.如果是对不同的资源(例如SOCKET连接 ...
- AS 开发环境配置
安装时不用设置代理(proxy). 建议选择标准安装,自定义安装容易选掉一些功能.插件. SDK Tools里的(HAXM installer)有时会未安装,安装完需检查(HAXM installer ...
- P3372 【模板】线段树 1 区间查询与区间修改
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...