原本看标题还以为是treap的题,但是实际上是线段树。

求两点的LCA相当于求区间priority最小值的位置。

然后就可以离线先离散化然后建树做了。

记录的minpos是线段树上叶子结点的节点编号。

一道水题。

题目链接

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
const long long maxn=1e5+10,maxm=3e5+10,INF=1e18;
long long n,m;
long long pp[maxn],pr[maxn],rr[maxm],rp[maxm];
char kk[maxm];
long long num[maxn+maxm],tot=0; set<long long> G;
set<long long>::iterator it; long long aa,ff;char cc;
long long read() {
aa=0;ff=1;cc=getchar();
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa*ff;
} struct Node{
int l,r,minpos;long long minnum;
}node[4*(maxn+maxm)]; void bld(int pos,int l,int r) {
node[pos].l=l;node[pos].r=r;
node[pos].minnum=INF;
if(l==r) {
node[pos].minpos=pos;
return;
}
int mid=(l+r)>>1;
bld(pos<<1,l,mid);
bld(pos<<1|1,mid+1,r);
node[pos].minpos=node[pos<<1].minpos;
} void chge(int pos,int os,long long prr) {
if(node[pos].l==node[pos].r) {
node[pos].minnum=prr;
node[pos].minpos=pos;
return ;
}
int mid=(node[pos].l+node[pos].r)>>1;
if(os<=mid) chge(pos<<1,os,prr);
else chge(pos<<1|1,os,prr);
node[pos].minnum=min(node[pos<<1].minnum,node[pos<<1|1].minnum);
node[pos].minpos= node[pos<<1].minnum<node[pos<<1|1].minnum? node[pos<<1].minpos:node[pos<<1|1].minpos;
} int ef(int l,int r,long long key) {
if(l>=r-1) return l;
int mid=(l+r)>>1;
if(num[mid]==key) return mid;
if(num[mid]>key) return ef(l,mid,key);
return ef(mid+1,r,key);
} int q(int pos,int l,int r) {
if(l>r) swap(l,r);
if(node[pos].l==l&&node[pos].r==r) return node[pos].minpos;
int mid=(node[pos].l+node[pos].r)>>1;
if(l>mid) return q(pos<<1|1,l,r);
if(r<=mid) return q(pos<<1,l,r);
int ans1=q(pos<<1,l,mid),ans2=q(pos<<1|1,mid+1,r);
return node[ans1].minnum<node[ans2].minnum? ans1:ans2;
} int main() {
n=read();m=read();
for(int i=1;i<=n;++i) {
pp[i]=read();
G.insert(pp[i]);
}
for(int i=1;i<=n;++i) pr[i]=read();
for(int i=1;i<=m;++i) {
kk[i]=getchar();
while(kk[i]<'A'||kk[i]>'Z') kk[i]=getchar();
rr[i]=read();
if(kk[i]!='D') rp[i]=read();
if(kk[i]=='I') G.insert(rr[i]);
}
for(it=G.begin();it!=G.end();++it) num[++tot]=*it;
bld(1,1,tot);
for(int i=1;i<=n;++i) chge(1,ef(1,tot+1,pp[i]),pr[i]);
for(int i=1;i<=m;++i) {
if(kk[i]=='I') chge(1,ef(1,tot+1,rr[i]),rp[i]);
else if(kk[i]=='D') chge(1,ef(1,tot+1,rr[i]),INF);
else printf("%lld\n",num[node[q(1,ef(1,tot+1,rr[i]),ef(1,tot+1,rp[i]))].l]);
}
return 0;
}

  

BZOJ2770: YY的Treap的更多相关文章

  1. 【BZOJ2770】YY的Treap 结论+线段树

    [BZOJ2770]YY的Treap Description 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了Y ...

  2. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  3. bzoj 2770 YY的Treap

    Written with StackEdit. Description 志向远大的\(YY\)小朋友在学完快速排序之后决定学习平衡树,左思右想再加上\(SY\)的教唆,\(YY\)决定学习\(Trea ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. Treap初步

    模板题 bzoj3224: Tyvj 1728 普通平衡树 #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...

  6. 「FHQ Treap」学习笔记

    话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...

  7. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  8. 【BZOJ1112】[POI2008]砖块Klo Treap

    [BZOJ1112][POI2008]砖块Klo Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出 ...

  9. #503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

    题目: 题解: 比较容易发现 : \(x,y\) 的贡献是独立的. 所以可以分开考虑. 假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\ ...

随机推荐

  1. HZOI20190906模拟39 工业,卡常,玄学

    题面:https://www.cnblogs.com/Juve/articles/11484209.html 工业: 推一个式子,AC 没有用组合数....推了2个多小时 我sbsbsbsbsbsbs ...

  2. 自动化运维工具Ansible工具

    目录 一.初识Ansible 二.Ansible的架构 三.Ansible基础使用 安装 主机清单 管理主机 四.Ansible用脚本管理主机 五.Ansible模块Module 六.Ansible常 ...

  3. 转:LPC2214的PLL与定时器设置

    原地址:http://blog.sina.com.cn/s/blog_4419d72d0100mu7h.html LPC2214的PLL与定时器设置 http://www.dpj365.cn/bbs/ ...

  4. 巧用having

    mysql学习教程参考:https://www.w3school.com.cn/sql/index.asp where 与 having实例运用参考:https://www.2cto.com/data ...

  5. 桥接模式(Bridge、Implementor)(具体不同平台日志记录,抽象与实现分离)

    桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式 ...

  6. JasperReport填充报表6

    任何报告工具的主要目的是为了生产出高品质的文档.举报填充过程有助于报告工具通过操纵数据集来实现这一目标.需要报表填充过程的主要输入是: 报表模板:这是实际的JasperReport文件 报告参数:这些 ...

  7. 在PyCharm中导入Numpy和Pygame模块 (win8.1)

    我用的是anaconda安装python3.6 已经在终端 pip install numpy 但是在pycharm运行程序出现错误:ImportError: No module named nump ...

  8. PHP学习1.5-预定义超全局数组变量

    1.PHP 预定义的超全局变量数组 特性: a.特殊的数组,操作方式没有区别 b.不用声明,php脚本中默认存在,因为在php中不用定义,所以在自定义变量是应避免和预定的全局变量同名 c.在全局范围内 ...

  9. 通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码 可复制直接使用 娱乐 可封装 函数

       猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码   #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码 import random secrst = random.rand ...

  10. Python中3种内建数据结构:列表、元组和字典

    Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...