Portal -->bzoj2588

Solution

  不行我一定要来挂这道题qwq很气愤qwq(其实还不是因为自己蠢。。)

  额首先说一下正解

  如果这个问题放在序列上面的话。。直接离散化一下然后一个可持久化权值线段树就好了

  然后放在树上的话,我们可以考虑处理树上点对问题的一个很常见的套路:

\[info(x\rightarrow y)=info(root\rightarrow x)+info(root\rightarrow y)-info(root\rightarrow lca)*2
\]

  那所以我们还是用可持久化权值线段树,每一个节点\(x\)从\(fa[x]\)更新过来就好了

  一个小trick是在查询的时候直接传参这样比较方便

​  还有就是因为是点值,所以要记得算上\(lca\)处的值

  

  好的然而我在场上想到的是这样的:

  “放在序列上直接可持久化权值线段树那放在树上当然是套个树链剖分啊”

  然后码了个线段树合并什么的qwq总共4k,然后T掉了,原因是。。貌似这题的合并还是怎么的并不是log的。。。

  

  综上,这题一定要挂上来,太气了qwq被自己蠢哭我需要智力康复qwq

  

  正解的代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define TOP 20
using namespace std;
const int N=100010,SEG=(N+20)*20;
struct xxx{
int y,nxt;
}a[N*2];
int pre[TOP+1][N],dep[N],V[N],val[N],Lis[N];
int h[N],sz[N],son[N];
int n,m,lastans,tot,dfn_t;
namespace Seg{/*{{{*/
int ch[SEG][2],sz[SEG],rt[N];
int n,tot,tot1;
void pushup(int x){sz[x]=sz[ch[x][0]]+sz[ch[x][1]];}
int newnode(int pre){
ch[++tot][0]=ch[pre][0]; ch[tot][1]=ch[pre][1]; sz[tot]=sz[pre];
return tot;
}
void _insert(int pre,int &x,int d,int lx,int rx){
x=newnode(pre);
if (lx==rx){++sz[x]; return;}
int mid=lx+rx>>1;
if (d<=mid) _insert(ch[pre][0],ch[x][0],d,lx,mid);
else _insert(ch[pre][1],ch[x][1],d,mid+1,rx);
pushup(x);
}
void insert(int pre,int x,int d){_insert(rt[pre],rt[x],d,1,n);tot1=tot;}
int _query(int l,int r,int lca,int lx,int rx,int k,int pos){//pos=val[lca]
if (lx==rx) return lx;
int mid=lx+rx>>1,lsz=sz[ch[r][0]]+sz[ch[l][0]]-2*sz[ch[lca][0]];
if (lx<=pos&&pos<=mid) ++lsz;
if (k<=lsz) return _query(ch[l][0],ch[r][0],ch[lca][0],lx,mid,k,pos);
return _query(ch[l][1],ch[r][1],ch[lca][1],mid+1,rx,k-lsz,pos);
}
int query(int l,int r,int lca,int k){return _query(rt[l],rt[r],rt[lca],1,n,k,val[lca]);}
void _debug(int x,int l,int r){
if (!x){
for (int i=l;i<=r;++i) printf("%d %d\n",i,0);
return;
}
if (l==r) {printf("%d %d\n",l,sz[x]);return;}
int mid=l+r>>1;
_debug(ch[x][0],l,mid);
_debug(ch[x][1],mid+1,r);
}
void debug(int x){_debug(rt[x],1,n);}
}/*}}}*/ void add(int x,int y){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;} void dfs(int fa,int x,int d){
pre[0][x]=fa; dep[x]=d;
Seg::insert(fa,x,val[x]);
for (int i=1;i<=TOP;++i) pre[i][x]=pre[i-1][pre[i-1][x]];
int u;
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (u==fa) continue;
dfs(x,u,d+1);
}
} void prework(){
sort(Lis+1,Lis+1+n);
Lis[0]=unique(Lis+1,Lis+1+n)-Lis-1;
int x;
for (int i=1;i<=n;++i){
x=lower_bound(Lis+1,Lis+1+Lis[0],val[i])-Lis;
V[x]=val[i];
val[i]=x;
}
Seg::n=Lis[0];
} int get_lca(int x,int y){
if (dep[x]<dep[y]) swap(x,y);
for (int i=TOP;i>=0;--i)
if (dep[pre[i][x]]>=dep[y]) x=pre[i][x];
if (x==y) return x;
for (int i=TOP;i>=0;--i)
if (pre[i][x]!=pre[i][y]) x=pre[i][x],y=pre[i][y];
return pre[0][x];
} void solve(int x,int y,int k){
int lca=get_lca(x,y);
/*Seg::debug(x); printf("\n");
Seg::debug(y); printf("\n");
Seg::debug(lca); printf("\n");*/
lastans=Seg::query(x,y,lca,k);
printf("%d\n",V[lastans]);
lastans=V[lastans];
} int main(){/*{{{*/
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y,k;
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
tot=0;
for (int i=1;i<=n;++i) scanf("%d",val+i),Lis[++Lis[0]]=val[i];
for (int i=1;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
} prework();
dfs(0,1,1); lastans=0;
for (int i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&k);
x^=lastans;
solve(x,y,k);
}
}/*}}}*/

【bzoj2588】Count on a tree的更多相关文章

  1. 【BZOJ2588】Count On a Tree(主席树)

    [BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...

  2. 【BZOJ-2588】Count on a tree 主席树 + 倍增

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 3749  Solved: 873[ ...

  3. 【bzoj2588】Count on a tree 主席树

    这题给人开了个新思路. 原本构造一个序列的主席树,是这个位置用上个位置的信息来省空间,树上的主席树是继承父亲的信息来省空间. 此题若带修改怎么办? 若对某个点的权值做修改,则这个点的子树都会受影响,想 ...

  4. 【BZOJ2588】Count on a tree 题解(主席树+LCA)

    前言:其实就是主席树板子啦……只不过变成了树上的查询 -------------------------- 题目链接 题目大意:求树上$u$到$v$路径第$k$大数. 查询静态区间第$k$大肯定是用主 ...

  5. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  6. 主席树+LCA【p2633 (bzoj2588】 Count on a tree

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  7. 【BZOJ2558】Count on a tree

    又是因为傻逼错误浪费了半天时间 原题: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个 ...

  8. 【SPOJ10628】Count on a tree

    题目大意:给定一棵 N 个节点的树,点有点权,要求回答 M 个询问,每次询问点 u 到点 v 的简单路径(链)上权值第 K 小是多少. 题解:学习到了树上主席树. 主席树维护序列时,每次将后一个点的树 ...

  9. 【BZOJ2588】Spoj 10628. Count on a tree 主席树+LCA

    [BZOJ2588]Spoj 10628. Count on a tree Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lasta ...

随机推荐

  1. [转]git学习------>git-rev-parse命令初识

    git学习------>git-rev-parse命令初识 2017年06月13日 10:04:13 阅读数:2172 一.准备工作 第一步:在d盘git test目录下,新建工作区根目录dem ...

  2. dubbo 微服务框架

    dubbo 注解配置: @Service //Service注解暴露服务 @Configuration // javaconfig形式配置公共模块 @DubboComponentScan // 指定d ...

  3. 2.0 flume、sqoop、oozie/Azkaban

    在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集.结果数据导出.任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便 ...

  4. Windows下使用WinRAR命令自动备份文件

    最近有一个需求:为了防止数据丢失,每天对固定文件夹下的文件进行打包压缩备份. 解决办法:使用Windows的任务计划程序,每天执行一下压缩命令: Windows任务计划程序在这里就不再介绍了,网上有很 ...

  5. React 初学

    React.createClass({}); getInitialState,this.setState({}); {}解读代码块,外层不要加引号,比如onChange={this.handleCha ...

  6. Java:有关try、catch和finally的学习(供自己参考)

    Java:有关try.catch和finally的学习 在看到书本的时候对finally的介绍是:不论是否在try块中产生异常,都会执行finally.当时对这句话的理解不够深,误以为在try...c ...

  7. “我爱淘”第二冲刺阶段Scrum站立会议6

    完成任务: 完成学院分类的点击查看书籍功能,可以点击书的条目查看书的详细信息. 计划任务: 将书的详细信息进行完善,并且可以点击收藏以及已预订等功能. 遇到问题: 分类功能,根据不同学院,自动将数据库 ...

  8. 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法

    运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...

  9. HDU 5269 ZYB loves Xor I Trie树

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  10. IT小小鸟的读后感

    在我经历了半个学期的大学生活后,我依然不清楚我现在所学的专业有什么用或者说该怎么学.直到我阅读了<我是一只IT小小鸟>这篇文章之后.我才对我所将来或许要从事的IT事业有了些许的了解. 在观 ...