【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树

2024-03-02 21:48

本文主要是介绍【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我沙茶

我沙茶

我沙茶

傻到去写链剖! 本来求个LCA又好写又快.....

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 100010int team[MAXN],head,tail;
int fa[MAXN],son[MAXN],size[MAXN],loc[MAXN],top[MAXN],depth[MAXN];int tot,g[MAXN*2],nnext[MAXN*2],num[MAXN*2];
void Add(int x,int y)
{tot++;nnext[tot]=g[x];g[x]=tot;num[tot]=y;
}void Lian_Pou()
{team[++tail]=1;depth[1]=1;while(head<tail){int x=team[++head];for(int i=g[x];i;i=nnext[i]){int tmp=num[i];if(depth[tmp]!=0) continue ;fa[tmp]=x;depth[tmp]=depth[x]+1;team[++tail]=tmp;}}for(int i=tail;i>=1;i--){int x=team[i];size[x]=1;for(int j=g[x];j;j=nnext[j]){int tmp=num[j];if(tmp==fa[x]) continue ;size[x] += size[tmp];if(size[tmp]>size[son[x]]) son[x]=tmp;}}loc[1]=1;top[1]=1;for(int i=1;i<=tail;i++){int x=team[i];int cnt=loc[x];if(son[x]!=0){loc[son[x]]=cnt+1;top[son[x]]=top[x];cnt+=size[son[x]];}for(int j=g[x];j;j=nnext[j]){int tmp=num[j];if(tmp==fa[x]||tmp==son[x]) continue ;loc[tmp]=cnt+1;top[tmp]=tmp;cnt+=size[tmp];}}
}
struct INIT
{int num;int loc;int no;
} init[MAXN];
bool cmp(INIT a,INIT b) 
{return a.loc<b.loc;
}
bool cmp1(INIT a,INIT b)
{return a.num<b.num;
}int cnt;
int seg_tot;
struct H
{int L,R;int sum;
}seg[MAXN*20];void Seg_Add(int now,int l,int r,int x,int last)
{if(l==r) {seg[now].sum=seg[last].sum+1;;return ;}int mid=(l+r)/2;if(x<=mid) {seg[now].L=++seg_tot;seg[now].R=seg[last].R;last=seg[last].L;Seg_Add(seg[now].L,l,mid,x,last);}else{seg[now].R=++seg_tot;seg[now].L=seg[last].L;last=seg[last].R;Seg_Add(seg[now].R,mid+1,r,x,last);}seg[now].sum=seg[seg[now].L].sum+seg[seg[now].R].sum;
}
int hash[MAXN];
int root[MAXN];
int LL[MAXN],RR[MAXN],LN,RN;
void Solve(int x,int y)
{LN=0;RN=0;while(top[x]!=top[y]){if(depth[top[x]]<depth[top[y]]) swap(x,y);LL[++LN]=root[loc[top[x]]-1];RR[++RN]=root[loc[x]];x=fa[top[x]];}if(depth[x]<depth[y]) swap(x,y);LL[++LN]=root[loc[y]-1];RR[++RN]=root[loc[x]];
}int Q(int l,int r,int k)
{	if(l==r) return l;int S=0;for(int i=1;i<=LN;i++) {S-=seg[seg[LL[i]].L].sum;S+=seg[seg[RR[i]].L].sum;}int mid=(l+r)/2;if(k<=S){for(int i=1;i<=LN;i++) LL[i]=seg[LL[i]].L;for(int i=1;i<=RN;i++) RR[i]=seg[RR[i]].L;return Q(l,mid,k);}else{for(int i=1;i<=LN;i++) LL[i]=seg[LL[i]].R;for(int i=1;i<=RN;i++) RR[i]=seg[RR[i]].R;k-=S;return Q(mid+1,r,k);}
}int main()
{
//	freopen("a.in","r",stdin);
//	freopen("wa.out","w",stdout);int n,m;cin >> n >> m;for(int i=1;i<=n;i++) scanf("%d",&init[i].num);for(int i=1;i<n;i++){int x,y;scanf("%d %d",&x,&y);Add(x,y);Add(y,x);}Lian_Pou();for(int i=1;i<=n;i++) init[i].loc=loc[i];sort(init+1,init+1+n,cmp1);init[1].no=1;for(int i=2;i<=n;i++)if(init[i].num!=init[i-1].num)init[i].no=init[i-1].no+1;else init[i].no=init[i-1].no;cnt=init[n].no;for(int i=1;i<=n;i++) hash[init[i].no]=init[i].num;sort(init+1,init+n+1,cmp);for(int i=1;i<=n;i++){root[i]=++seg_tot;Seg_Add(root[i],1,cnt,init[i].no,root[i-1]);}int last=0;for(int i=1;i<=m;i++){int u,v,k;scanf("%d %d %d",&u,&v,&k);u^=last;Solve(u,v);last=hash[Q(1,cnt,k)];if(i!=m) printf("%d\n",last);else printf("%d",last);}return 0;
}


这篇关于【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767525

相关文章

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

leetcode#38. Count and Say

The count-and-say sequence is the sequence of integers with the first five terms as following: 1. 12. 113. 214. 12115. 111221 1 is read off as “one 1” or 11. 11 is read off

Sorry!Hbase的LSM Tree就是可以为所欲为!

我们先抛出一个问题: LSM树是HBase里使用的非常有创意的一种数据结构。在有代表性的关系型数据库如MySQL、SQL Server、Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和B+树。而在一些主流的NoSQL数据库如HBase、Cassandra、LevelDB、RocksDB中,则是使用日志结构合并树(Log-structured Merge Tree,LSM Tr

【spring】does not have member field ‘com.sun.tools.javac.tree.JCTree qualid

spring-in-action-6-samples 的JDK版本 最小是11,我使用 了22: jdk21 jdk22 都与lombok 不兼容,必须使用兼容版本, 否则报错: thingsboard 的大神解释了: java: java.lang.NoSuchFieldError: Class com

[LeetCode] 863. All Nodes Distance K in Binary Tree

题:https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/ 题目大意 求给树中,距给定 结点 指定长度的 所有结点的val 思路 tree -> graph 、 bfs 先遍历树,并用map记录每个结点的父结点 ,将树变为图,然后 bfs。 /*** Definition for a binary tree

《Learning To Count Everything》CVPR2021

摘要 论文提出了一种新的方法来解决视觉计数问题,即在给定类别中仅有少量标注实例的情况下,对任何类别的对象进行计数。将计数问题视为一个少样本回归任务,并提出了一种新颖的方法,该方法通过查询图像和查询图像中的少量示例对象来预测图像中所有感兴趣对象的存在密度图。此外,还提出了一种新颖的适应策略,使网络能够在测试时仅使用新类别中的少量示例对象来适应任何新的视觉类别。为了支持这一任务,作者还引入了一个包含

class _ContiguousArrayStorage deallocated with non-zero retain count

Xcode报错 : Object 0x11c614000 of class _ContiguousArrayStorage deallocated with non-zero retain count 2. This object's deinit, or something called from it, may have created a strong reference to self w

js实现树级递归,通过js生成tree树形菜单(递归算法)

1、效果图 需求:首先这是一个数据集—js的类型,我们需要把生成一个tree形式的对象 : var data = [{ id: 1, name: "办公管理", pid: 0 },{ id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 },{ id: 4, name: "请假记录", pid: 2 },{ id:

【unity实战】利用Root Motion+Blend Tree+Input System+Cinemachine制作一个简单的角色控制器

文章目录 前言动画设置Blend Tree配置角色添加刚体和碰撞体代码控制人物移动那么我们接下来调整一下相机的视角效果参考完结 前言 Input System知识参考: 【推荐100个unity插件之18】Unity 新版输入系统Input System的使用,看这篇就够了 Cinemachine虚拟相机知识参考: 【推荐100个unity插件之10】Unity最全的最详细的C