bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]])
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
struct poi{int size,lt,rt;}tree[maxn*];
struct zs{int too,pre;}e[maxn<<];
int n,m,x,y,z,sz,tot,N;
int d[maxn],f[maxn][],last[maxn],root[maxn],v[maxn],b[maxn],num[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline void add(int x,int y){e[++tot].too=y;e[tot].pre=last[x];last[x]=tot;}
void insert(int &x,int l,int r,int cx)
{
tree[++sz]=tree[x];tree[sz].size++;x=sz;
if(l==r)return;
int mid=(l+r)>>;
if(cx<=mid)insert(tree[x].lt,l,mid,cx);
else insert(tree[x].rt,mid+,r,cx);
}
int query(int a,int b,int c,int d,int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)>>;
int t1=tree[a].lt,t2=tree[b].lt,t3=tree[c].lt,t4=tree[d].lt;
int tmp=tree[t1].size+tree[t2].size-tree[t3].size-tree[t4].size;
if(tmp>=k)return query(t1,t2,t3,t4,l,mid,k);
return query(tree[a].rt,tree[b].rt,tree[c].rt,tree[d].rt,mid+,r,k-tmp);
}
void dfs(int x,int fa)
{
root[x]=root[fa];insert(root[x],,N,v[x]);
d[x]=d[fa]+;f[x][]=fa;
for(int i=last[x];i;i=e[i].pre)
if(e[i].too!=fa)dfs(e[i].too,x);
}
inline int lca(int x,int y)
{
if(d[x]<d[y])swap(x,y);
for(int i=;i>=;i--)
if(d[f[x][i]]>=d[y])x=f[x][i];
if(x==y)return x;
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][];
}
int main()
{
read(n);read(m);
for(int i=;i<=n;i++)read(v[i]),b[i]=v[i];N=n;
sort(b+,b++N);N=unique(b+,b++N)-b-;
for(int i=;i<=n;i++)x=lower_bound(b+,b++N,v[i])-b,num[x]=v[i],v[i]=x;
for(int i=;i<n;i++)
read(x),read(y),add(x,y),add(y,x);
dfs(,);for(int j=;j<;j++)for(int i=;i<=n;i++)f[i][j]=f[f[i][j-]][j-];
int lan=;
for(int i=;i<=m;i++)
{
read(x);read(y);read(z);x^=lan;int fq=lca(x,y);
printf("%d",lan=num[query(root[x],root[y],root[fq],root[f[fq][]],,N,z)]);
if(i!=m)puts("");
}
}
bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)的更多相关文章
- SPOJ 10628 Count on a tree(Tarjan离线LCA+主席树求树上第K小)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- 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 ...
- Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)
题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...
- spoj COT - Count on a tree (树上第K小 LCA+主席树)
链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...
- BZOJ2588: Spoj 10628. Count on a tree
传送门 刚开始看错题以为是dfs序瞎搞.. 后来看清题了开始想用树剖瞎搞... 感觉要滚粗啊.. 对于每个点到根的路径建立线段树,暴力建MLE没跑,上主席树,然后$(x,y)$的路径就可以先求出来$L ...
- 【主席树】bzoj2588 Spoj 10628. Count on a tree
每个点的主席树的root是从其父转移来的.询问的时候用U+V-LCA-FA(LCA)即可. #include<cstdio> #include<algorithm> using ...
- 主席树初探--BZOJ2588: Spoj 10628. Count on a tree
n<=100000的点权树,有m<=100000个询问,每次问两个点间的第k小点权,保证有解,强制在线. 主席上树啦!类似于之前的序列不带修改询问的前缀表示法,现在只要把前缀当成某点到根的 ...
随机推荐
- hdu1106 排序(字符串分割,strtok+sscanf)
排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- uvaoj 489 - Hangman Judge(逻辑+写代码能力)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 如何理解一台服务器可以绑定多个ip,一个ip可以绑定多个域名
一个域名只能对应一个IP的意思是域名在DNS服务器里做解析的时候 一条记录只能指向一个IP地址.这个是死规定,试想一下,如果一个子域名指向了2个ip ,当访问者打开这个域名的时候,浏览器是展示哪个IP ...
- Unity编辑器 - TreeView控件笔记
用起来有一些规则,写个简单的案例以备查阅: using System.Collections.Generic; using UnityEditor.IMGUI.Controls; using Unit ...
- django 增删改查操作 数据库Mysql
下面介绍一下django增删改查操作: 1.view.py # -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom dja ...
- 如何实现iframe页面与父级页面js交互
处理办法:1.同一域下,相同端口2.父级.子集页面上同时标记 document.domain = "xxx.com" 操作内部元素:1.jQuery使用 iframe.conten ...
- vmware centOS上网配置笔记
⦁ 修改/etc/sysconfig/network-scripts/ifcfg-eth0文件 (首先查看本机vmware 虚拟网络编辑器中的网关) 重启网络 使用命令:service net ...
- Python3.5 Keras-Theano(含其他库)windows 安装环境
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.2.0-Windows-x86.execonda --version ...
- 由一个hash字符串生成多个子hash字符串
通过存储一个head hash,然后把子hash放到网络中 当然,也可以像默克尔树那样的,生成多级的子hash ,可以通过规则配置不同的hash 生成方式.倒置的默克尔树 我有一个文件,然后我把她分隔 ...
- c# load xml 中文报错
<?xml version="1.0" encoding="GB2312"?>