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是上一个询问的答案,初始 ...
随机推荐
- LuoguP2602 [ZJOI2010]数字计数【数位dp】By cellur925
题目传送门 题目大意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 继续数位dp=w=. 这一次我们不需要记录$pre$啦!(撒花). 因为这次我们需要的 ...
- android 多线程(二)
1. 使用 AsyncTask 实现进度条 package com.test.network; import android.os.AsyncTask; import android.support. ...
- SP1805 Largest Rectangle in a Histogram
题目链接: 洛谷SP1805 题意: 如图所示,在一条水平线上有n个宽为1的矩形,求包含于这些矩形的最大子矩形面积(图中的阴影部分的面积即所求答案) 输入格式: 有多组测试数据,每组数据占一行.输入零 ...
- Query on a tree IV SPOJ - QTREE4
https://vjudge.net/problem/SPOJ-QTREE4 点分就没有一道不卡常的? 卡常记录: 1.把multiset换成手写的带删除堆(套用pq)(作用很大) 2.把带删除堆里面 ...
- CentOS 7.4安装mariadb,启动报错
[root@iZ25b6alxstZ ~]# systemctl start mariadb Job for mariadb.service failed because the control pr ...
- php使用json_decode返回NULL
php5.2以后自带json_decode函数,但是对json文本串的格式要求非常严格. 很可能使用该函数得到的返回值是NULL 可以使用使用json_last_error()函数获取到的返回值来帮助 ...
- 【转】Android Support Library详细介绍
网上对Android Support Library中各个依赖包介绍的中文资料太少了,结合官方文档和有限的参考资料做了一次总结,有描述得不对的地方还请指正. 一.主工程.依赖包.jar包.androi ...
- leetcode410 Split Array Largest Sum
思路: dp. 实现: class Solution { public: int splitArray(vector<int>& nums, int m) { int n = nu ...
- CF778B(round 402 div.2 E) Bitwise Formula
题意: Bob recently read about bitwise operations used in computers: AND, OR and XOR. He have studied t ...
- ["1", "2", "3"].map(parseInt)
为什么["1", "2", "3"].map(parseInt) 为 1,NaN,NaN; parseInt() parseInt() 函数 ...