BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
题意:
给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。
分析:
每个结点开线段树,保存到根这段路径上的权值,然后类似树上差分在主席树上求第k小
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
int head[N],to[N<<1],nxt[N<<1];
int top[N],fa[N],dep[N],son[N],siz[N],tot,cnt;
int n,m,root[N],t[N*50],ls[N*50],rs[N*50],a[N],see;
struct A{
int num,id,v;
}d[N];
bool cmp1(const A &x,const A &y){return x.num<y.num;}
bool cmp2(const A &x,const A &y){return x.id<y.id;}
inline void add(int u,int v){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void rd(int &x){
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}x*=f;
}
void dfs1(int x){
siz[x]=1;
for(int i=head[x];i;i=nxt[i])if(to[i]!=fa[x]){
fa[to[i]]=x;dep[to[i]]=dep[x]+1;
dfs1(to[i]);
siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]])son[x]=to[i];
}
}
void dfs2(int x,int t){
top[x]=t;
if(son[x])dfs2(son[x],t);
for(int i=head[x];i;i=nxt[i])if(to[i]!=fa[x]&&to[i]!=son[x])dfs2(to[i],to[i]);
}
int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])swap(x,y);
y=fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
void insert(int x,int &y,int l,int r,int val){
y=++tot;
if(l==r){t[y]=t[x]+1;return ;}
int mid=l+r>>1;
if(val<=mid) rs[y]=rs[x],insert(ls[x],ls[y],l,mid,val);
else ls[y]=ls[x],insert(rs[x],rs[y],mid+1,r,val);
t[y]=t[ls[y]]+t[rs[y]];
}
int query(int x,int y,int lca,int f,int l,int r,int k){
if(l==r)return a[l];
int mid=l+r>>1,sizls=t[ls[x]]+t[ls[y]]-t[ls[lca]]-t[ls[f]];
if(k<=sizls) return query(ls[x],ls[y],ls[lca],ls[f],l,mid,k);
else return query(rs[x],rs[y],rs[lca],rs[f],mid+1,r,k-sizls);
}
void build(int x){
for(int i=head[x];i;i=nxt[i]){
if(to[i]!=fa[x]){
insert(root[x],root[to[i]],1,n,d[to[i]].v);
build(to[i]);
}
}
}
int main(){
rd(n);rd(m);
int i,x,y,k,j;
for(i=1;i<=n;i++) rd(d[i].num),d[i].id=i;
sort(d+1,d+n+1,cmp1);
d[0].num=-1000000;
for(j=0,i=1;i<=n;i++){if(d[i].num!=d[i-1].num)j++;d[i].v=j;a[j]=d[i].num;}
sort(d+1,d+n+1,cmp2);
for(i=1;i<n;i++) {
rd(x);rd(y);
add(x,y);add(y,x);
}
dep[1]=1;fa[1]=0;
dfs1(1);dfs2(1,1);
int ans=0;
//for(i=1;i<=n;i++) insert(root[fa[a[i]]],root[a[i]],minn,maxn,v[a[i]]);
insert(root[0],root[1],1,n,d[1].v);
build(1);
for(i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&k);x^=ans;
int lca=LCA(x,y);
ans=query(root[x],root[y],root[lca],root[fa[lca]],1,n,k);
if(i<m)
printf("%d\n",ans);
else printf("%d",ans);
}
}
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树的更多相关文章
- 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 ...
- 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)
http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...
- SPOJ 10628 Count on a tree (lca+主席树)
题意:给定一棵有n个结点的树,每一个点有一个权值.共同拥有m个询问.对于每一个询问(u,v,k),回答结点u至v之间第k小的点的权值. 思路:主席树+lca.首先指定一个根结点dfs一次并在此过程中建 ...
- 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)
传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...
- [SCOI2015]情报传递[树剖+主席树]
[SCOI2015]情报传递 题意大概就是 使得在 \(i\) 时刻加入一个情报员帮您传情报 然后询问 \(x,y,c\) 指 \(x\)到\(y\)多少个人有风险-(大于c)的都有风险-每天风险值+ ...
- [HNOI2015]开店(树剖+主席树+标记永久化)
听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...
- BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
- BZOJ_2157_旅游_树剖+线段树
BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...
随机推荐
- 并发编程(四):atomic
本篇博客我们主要讲述J.U.C包下的atomic包,在上篇博客"并发模拟"的最后,我们模拟高并发的情形时出现了线程安全问题,怎么解决呢?其实解决的办法有很多中,如直接在add()方 ...
- IDEA: 遇到问题Error during artifact deployment. See server log for details解决方法
1.检查tomcat是否配置正确. 2.检查配置文件是否配置正确,web.xml.等. 3. 4.
- Failed to create the Java Virtual Machine(zt)
http://lixueli26.iteye.com/blog/711152 在以下版本也发生类似情况,采用同样方法得以解决. 版本:eclipse-jee-indigo-win32 自己电脑上装的j ...
- Python Django开发中XSS内容过滤问题的解决
from:http://stackoverflow.com/questions/699468/python-html-sanitizer-scrubber-filter 通过下面这个代码就可以把内容过 ...
- Django代码注意
1.模板标签里面 extend和include是冲突的,有了extend,include无法生效,原因:是底层渲染独立机制设计导致. 2.#coding:utf-8 这句只有放在代码文件第一行才能生效 ...
- Effective Java 第三版——40. 始终使用Override注解
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- CF877F
题目大意:给定n个数有正有负,有Q次询问,每次询问区间[l,r]中有几个子区间满足和为k 做法:显然的莫队 每次用map记录一下当前区间[l,r]中的前缀和的值的个数 然后r的话找sum[r]-k的, ...
- Maven Scope 依赖范围
Maven依赖范围就是用来控制依赖与这三种classpath(编译classpath.测试classpath.运行classpath)的关系,Maven有以下几种依赖范围: ·compile:编译依赖 ...
- PAT1061:Dating
1061. Dating (20) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Sherlock Holme ...
- Spring Boot全局支持CORS(跨源请求)的配置方法
http://blog.csdn.net/zhangchao19890805/article/details/53893735