首页 > 其他分享 >题解 洛谷 P3793 由乃救爷爷

题解 洛谷 P3793 由乃救爷爷

时间:2022-12-11 20:23:38浏览次数:86  
标签:由乃救 le 洛谷 笛卡尔 题解 最大值 lca LCA z1

1. 题面描述

题目链接

给定长为 \(n\) 的序列,\(m\) 次询问,查询区间最大值。

\(n,m\le 10^7\),数据随机。

2. 分析

经典的静态区间最小值问题,经典题目配经典算法,考虑到 ST 表和笛卡尔树。

而时间复杂度为 \(O(nlogn)\) 的 ST 表无法通过本题,于是考虑笛卡尔树。

首先构建一颗笛卡尔树。

根据笛卡尔树性质可知,对于区间 \([l,r]\),最大值即为笛卡尔树上 \(lca(l,r)\) 的值。

说明:

根据二叉搜索树性质,可知 \(l\le lca(l,r)\le r\),满足最大值在 \([l,r]\) 范围内。

根据大根堆性质,可知 \(lca(l,r)\) 为区间 \([l,r]\) 的最大值。

于是问题就转变为 \(n\) 个节点的树,\(m\) 次询问,查询 LCA。

这里可以选择 Tarjan 算法离线以 \(O(m)\) 的时间复杂度求解 LCA。

不过因为本体数据随机,笛卡尔树期望树高为 \(logn\) 数量级。同时询问随机,每次询问所查询的 LCA 不会过深,于是可以考虑从根开始暴力寻找 LCA。经测试,可以通过本题。

3. 代码

#include <bits/stdc++.h>
using namespace std;
const int N=20000005;

namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
    using namespace GenHelper;
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}

int n,m,s,top;
int a[N],son[N][2],sta[N];

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m>>s;
	srand(s);
	for (int i=1; i<=n; i++) {
		a[i]=read();
		while (top && a[sta[top]]<a[i]) son[i][0]=sta[top--];
		if (top) son[sta[top]][1]=i;
		sta[++top]=i;
	}
	int rt=sta[1];
	unsigned long long ans=0;
	while (m--) {
		int l=read()%n+1,r=read()%n+1;
		if (l>r) swap(l,r);
		int p=rt;
		while (true) {
			if (l<=p && p<=r) {ans+=a[p]; break;}
			p=son[p][p<l];
		}
	}
	cout<<ans<<'\n';
	return 0;
}

本文完。

标签:由乃救,le,洛谷,笛卡尔,题解,最大值,lca,LCA,z1
From: https://www.cnblogs.com/XeRnHe/p/16974338.html

相关文章

  • NOIP2022 题解
    A.种花枚举\((x_2,y_0)\),考虑\(x_1\)可能在哪些位置,显然是在\(x_2\)往上的一个极长连续0段上。考虑如果固定了\(x_1\)的位置后怎么计算C形的数量,我们预处理......
  • CF1182E 题解
    前言题目传送门!更好的阅读体验?\(\text{zltqwq}\)推荐矩阵快速幂题目。思路......
  • P4902 乘积 题解
    乘积给出\(A\),\(B\),求下面的式子的值.\[\prod_{i=A}^{B}\prod_{j=1}^{i}(\frac{i}{j})^{\left\lfloor\frac{i}{j}\right\rfloor}\(\bmod\19260817)\]包含\(T\)组......
  • 【题解】CF1764C Doremy's City Construction
    题目传送门思路首先我们思考一个性质,由于不能有连续单调不升/不降的三个点连在一起,所以对于单个点来讲,显然要么只和比它大的连边(称为A类点),要么只和比它小的连边(称为B类点......
  • SP8547 题解
    SP8547题解题意简述:给定\(n\),找到能够使得辗转相除法执行\(n\)次的两个数,使得这两个数的和最小,输出这两个数。\(n\le10^{18}\)分析:对于这种题,一看就是猜结论的题,因......
  • [NOIP2022] 喵了个喵 题解
    [NOIP2022]喵了个喵题解先考虑\(k=2n-2\),这个数字提示我们每个栈放两种颜色,剩下一个栈辅助操作。那么颜色被分为两类在栈底,可以通过操作2消去。在栈顶,可以通过操作1......
  • VUE3 API之reactive和ref常见问题解决
    reactive解构最深的一层,失去响应性问题<scriptsetuplang="ts">lettarget={a:{b:1}};lettarget1={c:1};constobj=reactive(target)constobj1=......
  • MySQL8.0登录提示caching_sha2_password问题解决方法
    背景用​​docker​​构建mysql容器后连接遇到以下问题问题Authenticationplugin'caching_sha2_password'cannotbeloaded:dlopen(/usr/local/mysql/lib/plugin/cachin......
  • 牛客题解——牛牛家的房子
    题目描述城市有n排n列的房子。牛牛在每个格点(x,y)[0≤x,y≤n]建了一所房子,冬天来了,(x,y)的室内温度为t[x*n+y]度。从(x1,y1)处的房子移动到(x2,y2)处的房子需要......
  • ABC281 DEF 简短题解
    G有时间想,但不太擅长这种图论计数,就摆了。Ex直接润。感觉这场打得很烂,全程梦游,吃了5发罚时,很棒。D-MaxMultiple给定\(n\)个数\(a_1\sima_n\),选出\(k\)个......