题目


分析

第\(k\)大的问题可以用主席树解决,

下标为节点离散化后的权值,

连边操作考虑合并两棵树,

如果暴力合并那肯定会T飞,考虑启发式合并

同时维护子树内的lca,方便主席树的查询


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=80011; struct node{int y,next;}e[N<<1];
int a[N],b[N],n,m,k=1,Q,fat[N],f[N][17],siz[N],dep[N],rt[N],ls[N],M;
struct Chair{
int w[N<<7],ls[N<<7],rs[N<<7],cnt;
inline void build(int &rt,int l,int r){
w[rt=++cnt]=0; rr int mid=(l+r)>>1;
if (l<r) build(ls[rt],l,mid),build(rs[rt],mid+1,r);
}
inline void update(int &rt,int l,int r,int k){
rr int trt=++cnt,mid=(l+r)>>1;
ls[trt]=ls[rt],rs[trt]=rs[rt],w[trt]=w[rt]+1,rt=trt;
if (l==r) return;
k<=mid?update(ls[trt],l,mid,k):update(rs[trt],mid+1,r,k);
}
inline signed query(int fi,int se,int th,int fo,int l,int r,int kth){
if (l==r) return b[l];
rr int mid=(l+r)>>1,lef=w[ls[fi]]+w[ls[se]]-w[ls[th]]-w[ls[fo]];
if (kth<=lef) return query(ls[fi],ls[se],ls[th],ls[fo],l,mid,kth);
else query(rs[fi],rs[se],rs[th],rs[fo],mid+1,r,kth-lef); }
}Tre;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed getf(int u){return fat[u]==u?u:fat[u]=getf(fat[u]);}
inline void add(int x,int y){
e[++k]=(node){y,ls[x]},ls[x]=k;
e[++k]=(node){x,ls[y]},ls[y]=k;
}
inline void dfs(int x,int fa,int root){
f[x][0]=fa,dep[x]=dep[fa]+1,fat[x]=fa,++siz[root];
for (rr int i=1;i<=16;++i) f[x][i]=f[f[x][i-1]][i-1];
Tre.update(rt[x]=rt[fa],1,M,a[x]);
for (rr int i=ls[x];i;i=e[i].next)
if (e[i].y!=fa) dfs(e[i].y,x,root);
}
inline signed lca(int x,int y){
if (dep[x]<dep[y]) x^=y,y^=x,x^=y;
for (rr int i=16;~i;--i)
if (dep[f[x][i]]>=dep[y]) x=f[x][i];
if (x==y) return x;
for (rr int i=16;~i;--i)
if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
signed main(){
iut(),n=iut(),m=iut(),Q=iut(),Tre.cnt=0;
for (rr int i=1;i<=n;++i) b[i]=a[i]=iut(),fat[i]=i;
for (rr int i=1;i<=m;++i) add(iut(),iut());
sort(b+1,b+1+n),M=unique(b+1,b+1+n)-b-1,Tre.build(rt[0],1,M);
for (rr int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+M,a[i])-b;
for (rr int i=1;i<=n;++i) if (fat[i]==i) dfs(i,0,i),fat[i]=i;
for (rr int lans=0;Q;--Q){
rr char c=getchar();
while (c!='Q'&&c!='L') c=getchar();
rr int x=iut()^lans,y=iut()^lans;
if (c=='L'){
rr int fa=getf(x),fb=getf(y); add(x,y);
if (siz[fa]<siz[fb])
fa^=fb,fb^=fa,fa^=fb,
x^=y,y^=x,x^=y;
dfs(y,x,fa);
}else{
rr int kth=iut()^lans,LCA=lca(x,y);
lans=Tre.query(rt[x],rt[y],rt[LCA],rt[f[LCA][0]],1,M,kth);
print(lans),putchar(10);
}
}
return 0;
}

#主席树,dsu on tree,树上倍增#洛谷 3302 [SDOI2013]森林的更多相关文章

  1. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

  2. 洛谷 P3302 [SDOI2013]森林 Lebal:主席树 + 启发式合并 + LCA

    题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权 ...

  3. 洛谷 P3302 [SDOI2013]森林 解题报告

    P3302 [SDOI2013]森林 题目描述 小\(Z\)有一片森林,含有\(N\)个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有\(M\)条边. 小Z希望执行\(T\)个操作,操 ...

  4. 洛谷 P3302 [SDOI2013]森林

    ->题目链接 题解: #include<queue> #include<cstdio> #include<cstring> #include<iostr ...

  5. 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数

    「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...

  6. dsu on tree (树上启发式合并) 详解

    一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...

  7. dsu on tree 树上启发式合并 学习笔记

    近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...

  8. dsu on tree[树上启发式合并学习笔记]

    dsu on tree 本质上是一个 启发式合并 复杂度 \(O(n\log n)\) 不支持修改 只能支持子树统计 不能支持链上统计- 先跑一遍树剖的dfs1 搞出来轻重儿子- 求每个节点的子树上有 ...

  9. [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca

    Brief Description 求一个无向图的严格次小生成树. Algorithm Design 考察最小生成树的生成过程.对于一个非树边而言,如果我们使用这一条非树边去替换原MST的路径上的最大 ...

  10. luogu4180 次小生成树Tree 树上倍增

    题目:求一个无向图的严格次小生成树(即次小生成树的边权和严格小于最小生成树的边权和) 首先求出图中的最小生成树.任意加一条树外边都会导致环的出现.我们现在目标是在树外边集合B中,找到边b∈B,a∈b所 ...

随机推荐

  1. Java常用编程类库

    Java语言已经有许多非常成熟的开源基础类库,封装了日常开发中的各种常用操作,如:对象判空,字符串编码,本地缓存等等. 可以直接在项目中引入对应类库使用即可,或者参与完善相应类库的方法. 现将常用的基 ...

  2. 项目实战:Qt管道焊接参数条码打印系统(条码打印机TSC 244 Pro、打印条码、打印中文、打印字符、多张连续打印)

    需求   电脑端通过条码打印机TSC-TTP244 Pro:  1. 打印出尺寸为60*30cm  2. 条码打印机TSC-TTP244 Pro 不干胶纸 (不需要碳带,热敏纸)  3. window ...

  3. 正则函数及面向对象开发初识---day19

    1.正则函数 # ### 正则函数 import re #search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1+2 3*4" obj = ...

  4. Redis缓存应用场景

    记录一下自己的听课笔记,看的网课. 参考资料:https://zhuanlan.zhihu.com/p/157717158 常见应用场景 1 数据缓存 缓存一些常用的.经常访问的.不经常变化的数据,也 ...

  5. 如何运维多集群数据库?58 同城 NebulaGraph Database 运维实践

    图计算业务背景介绍 我们为什么选择 NebulaGraph? 在公司各个业务线中,有不少部门都有着关系分析等图探索场景,随着业务发展,相关的需求越来越多.大量需求使用多模数据库来实现,开发成本和管理成 ...

  6. 【风控算法】二、SQL->Python->PySpark计算KS,AUC及PSI

    KS,AUC 和 PSI 是风控算法中最常计算的几个指标,本文记录了多种工具计算这些指标的方法. 生成本文的测试数据: import pandas as pd import numpy as np i ...

  7. 清除 gitee.io 页面强缓存 Chrome浏览器 F12 找到页面 右键 Clear browser cache

    清除 gitee.io 页面强缓存 Chrome浏览器 F12 找到页面 右键 Clear browser cache

  8. react build 后,打包后自动将index.html copy 404.html - create-react-app 创建的项目

    起因:build上传gitee,启用路由需要404.html自动跳转 当前环境 create-react-app 搭建的架子 解决方案 由于默认的时候把build.js打包,无法查看,只好eject ...

  9. A Representation Learning Framework for Property Graphs-KDD19

    一.摘要 图上的表示学习,也称为图嵌入,已经证明了它对一系列机器学习应用程序的重大影响,如分类.预测和推荐. 然而,现有工作在很大程度上忽略了那些可以被表示为属性图的现代应用程序中的节点以及边的属性中 ...

  10. python中bytes转int的实例(bytearray to short int in python)

    python很多数据都是bytes格式的,经常需要转换成int或者short,笔者实际项目有需求,这里就做个笔记吧. 实例一: bytes转short:(无符号类型) import struct ba ...