【第45届ICPC沈阳站J】Descent of Dragons(可持久化线段树)

题面

🔗 (提交:🔗,洛谷:🔗)

有一个序列 { a n } \{a_n\} {an},初始时全为 0 0 0,有 q q q 次操作:

  • 1 l r x :对所有 l ≤ i ≤ r l\leq i\leq r lir ,若 a i = x a_i=x ai=x ,则将 a i a_i ai 增加 1 1 1
  • 2 l r :查询区间 [ l , r ] [l,r] [l,r] 最大值。

n , q , x ≤ 5 × 1 0 5 n,q,x\leq 5\times10^5 n,q,x5×105

6 s , 1024 m b 6s,1024mb 6s,1024mb

题解

大家好啊,我是退役后正在复健的大学选手,今天来点大家想看的东西啊

看到这道题,让人不禁往值域方向思考,诶?好像可以平衡树直接模拟?……要爆?启发式合并!冲刺!冲刺!

完了,然后呢?怎么查询?

要我枚举答案吗?好像只能这样了,那肯定爆啊?怎么办,放缩一下枚举范围吗,好像不太行得通欸。

分块?想得美。分治?拿来放缩都嫌少。

看起来只能把枚举给优化一下,怎么办,分块?二分?

你平衡树怎么把值域前后连接起来?你告诉我?

好,可以想想线段树合并,那也还是爆啊。

……

于是我做不出来咯,看了眼题解。

🤣👇🤣
👉🤡👈
🤣👆🤣

题解很简单,只需要每个值动态开点一个线段树,树上每个位置 1/0 表示 [是/否] 大于等于这个值,也就是把之前想的线段树做了一个后缀或。

这个东西,是可以直接维护的!

每次修改只需要将 x x x [ l , r ] [l,r] [l,r] 这段区间粘贴到 x + 1 x+1 x+1 上就可以了,最多新建 log ⁡ n \log n logn 个点,单次复杂度等同于区间查询。

二分答案的时候也是区间查询。

于是复杂度 log ⁡ 2 n \log^2n log2n

我不会说想不到这个做法,

但我会惊讶他们怎么想到的……

CODE

对了,线段树节点建议开到64倍

#include<map>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<random>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 500005
#define LL long long
#define LLL __int128
#define DB double
#define lowbit(x) (-(x) & (x))
#define ENDL putchar('\n')
inline int xchar() {static const int maxn = 1000000;static char b[maxn];static int pos = 0,len = 0;if(pos == len) pos = 0,len = fread(b,1,maxn,stdin);if(pos == len) return -1;return b[pos ++];
}
// #define getchar() xchar()
inline LL read() {LL f = 1,x = 0;int s = getchar();while(s<'0'||s>'9') {if(s<0)return -1;if(s=='-')f=-f;s=getchar();}while(s>='0'&&s<='9') {x=(x<<3)+(x<<1)+(s^48);s=getchar();}return f*x;
}
void putpos(LL x) {if(!x)return;putpos(x/10);putchar((x%10)^48);}
void putnum(LL x) {if(!x) {putchar('0');return;}if(x<0) putchar('-'),x=-x;return putpos(x);
}
void AIput(LL x,int c) {putnum(x);putchar(c);}int n,m,s,o,k;
struct it{int ls,rs;int ct;it(){ls=rs=ct=0;}
}tre[MAXN*64];
int cnt;
int build(int l,int r) {int x = ++ cnt,md = (l+r)>>1;tre[x].ct = r-l+1;if(l < r) tre[x].ls = build(l,md),tre[x].rs = build(md+1,r);return x;
}
int cop(int a,int b,int l,int r,int al,int ar) {if(r < al || ar < l || !b) return a;if(al >= l && ar <= r) return b;tre[++ cnt] = tre[a]; a = cnt;int md = (al + ar) >> 1;tre[a].ls = cop(tre[a].ls,tre[b].ls,l,r,al,md);tre[a].rs = cop(tre[a].rs,tre[b].rs,l,r,md+1,ar);tre[a].ct = tre[tre[a].ls].ct + tre[tre[a].rs].ct;return a;
}
int findtree(int a,int l,int r,int al,int ar) {if(al > r || ar < l || !a) return 0;if(al >= l && ar <= r) return tre[a].ct;int md = (al + ar) >> 1;return findtree(tre[a].ls,l,r,al,md) + findtree(tre[a].rs,l,r,md+1,ar);
}
int rt[MAXN];
int main() {n = read();int Q = read(); m = 0;rt[0] = build(1,n);while(Q --) {int op = read();if(op == 1) {s = read();o = read();k = read();rt[k+1] = cop(rt[k+1],rt[k],s,o,1,n);m = max(m,k+1);}else {s = read();o = read();int as = 0;for(int i = 20;i >= 0;i --) {if(as+(1<<i) <= m && findtree(rt[as+(1<<i)],s,o,1,n)) as += (1<<i);}AIput(as,'\n');}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Docker构建轻量级Linux容器

Docker是一个开源的容器化平台&#xff0c;可以帮助用户快速创建、部署和管理应用程序的轻量级Linux容器。通过Docker&#xff0c;用户可以将应用程序及其所有依赖项打包成一个独立的容器镜像&#xff0c;并在各种环境中运行&#xff0c;无需担心环境差异和依赖冲突。下面将详细…

R语言分析糖尿病数据:多元线性模型、MANOVA、决策树、典型判别分析、HE图、Box's M检验可视化...

全文链接&#xff1a;https://tecdat.cn/?p33609 Reaven和Miller&#xff08;1979&#xff09;研究了145名非肥胖成年人的葡萄糖耐量和胰岛素血液化学指标之间的关系。他们使用斯坦福线性加速器中心的PRIM9系统将数据可视化为3D&#xff0c;并发现了一个奇特的图案&#xff0c…

h5开发网站-页面内容不够高时,如何定位footer始终位于页面的最底部

一、问题描述&#xff1a; 在使用h5开发页面时&#xff0c;会遇到这个情况&#xff1a;当整个页面高度不足以占满显示屏一屏&#xff0c;页脚不是在页面最底部&#xff0c;影响用户视觉。想让页脚始终在页面最底部&#xff0c;我们可能会想到用&#xff1a; 1.min-height来控…

VMware16安装ghost版win7

文章目录 准备工作GHO 文件装机工具 新建虚拟机配置虚拟机还需要一个 CD/DVD PE 安装步骤分区还原挂载 CD/DVD开始还原 还原之后 准备工作 GHO 文件 可以去百度搜索这种文件&#xff0c;我这里是从系统之家下载的deepin win7 ghost 系统 装机工具 因为下载的 ghost 版的 w…

【Vue】vue2使用pdfjs预览pdf文件,在线预览方式一,pdfjs文件包打开新窗口预览pdf文件

系列文章目录 【Vue】vue2预览显示quill富文本内容&#xff0c;vue-quill-editor回显页面&#xff0c;v-html回显富文本内容 【Vue】vue2项目使用swiper轮播图2023年8月21日实战保姆级教程 【Vue】vue2使用pdfjs预览pdf文件&#xff0c;在线预览方式一&#xff0c;pdfjs文件包…

什么是高阶成分(HOC)?解释 React 中 render() 的目的?

高阶成分&#xff08;HOC&#xff09;是一种基于React的组合特性而形成的设计模式。 HOC是自定义组件&#xff0c;在其中包裹了另一个组件。他们可以接受任何动态提供的子组件&#xff0c;但不会修改或复制其输入组件中的任何行为。您可以说HOC是"纯"组件1。HOC通过…

计算机丢失mfc140u.dll怎么办,mfc140u.dll丢失的解决方法分享

随着科技的飞速发展&#xff0c;计算机已经成为了人们日常生活和工作中不可或缺的工具。然而&#xff0c;在使用计算机的过程中&#xff0c;用户可能会遇到各种问题&#xff0c;其中计算机丢失 mfc140u.dll 无法运行的问题就是一个比较常见的困扰。小编将从以下几个方面对这个问…

【PythonGIS】解决GIS属性表、矢量字段乱码,中文乱码

我们平时在使用代码处理矢量数据时&#xff0c;可能会出现矢量字段出现乱码的情况。同样有什么打开别人发的矢量文件有可能也会出现这种情况。那么我们该如何解决这个问题&#xff0c;让我们属性表中的中文字符正常显示呢&#xff1f;今天就和大家一起分享一下。 1.原因 ArcGIS…

数据中心液冷服务器详情说明

目录 前言 何为液冷服务器&#xff1f; 为什么需要液冷&#xff1f; 1.数据中心降低PUE的需求 2.政策导向 3.芯片热功率已经达到风冷散热极限 4.液冷比热远大于空气 液冷VS风冷&#xff0c;区别在哪&#xff1f; 1.液冷服务器跟风冷服务器的区别 2.液冷数据中心跟风冷…

MATLAB的输入与输出函数

标题 输入&#xff1a;input() 1. 输入单个数值2. 输入字符串3. 输入以空格隔开的一行数值4. 输入以空格与换行符隔开的多行数值输出 1. disp() (1)输出单个数值(2)输出一维数组(3)输出矩阵(4)输出字符串2. fprintf() (1)输出格式化的单个数值(2)输出格式化的一维数组(3)输出格…

postman导入json脚本文件(Collection v1.0、Collection v2.0)

1. 以postman v8.5.1 版本为例 2. 在postman v5.0.2 低版本中导出json脚本文件, 请选择Collection v2.0 Export - Collection v2 3. 在postman v8.5.1 版本 导入 json脚本文件 Import - Collection v2 - Export - Import

学习尚硅谷HTML+CSS总结

今天主要学习了颜色像素的四种表达方式&#xff0c;在没学习之前也只会一种RGB颜色的表达方式&#xff0c;虽然其他三种使用的比较少&#xff0c;但有些网页会用其他的表达方式写的我们学过之后就会看得懂&#xff0c;还有文本的设置&#xff0c;字体等等&#xff0c;这些都是后…

redis缓存穿透、击穿、雪崩介绍

缓存穿透 概念 缓存穿透指某一特定时间批量请求打进来并访问了缓存和数据库都没有的key&#xff0c;此时会直接穿透缓存直达数据库&#xff0c;从而造成数据库瞬时压力倍增导致响应速度下降甚至崩溃的风险&#xff1b; 解决方案 一、通过布隆过滤器解决 原理&#xff1a;将…

springboot(40) : 数据断流告警

检测逻辑 package com.alibaba.gts.flm.push.data.client.service;import com.alibaba.fastjson.JSONObject; import com.alibaba.gts.flm.push.data.client.common.util.DateUtil; import com.alibaba.gts.flm.push.data.client.service.model.FcoWarningKeyDTO; import com.…

React 全栈体系(七)

第四章 React ajax 一、理解 1. 前置说明 React本身只关注于界面, 并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互(json数据)react应用中需要集成第三方ajax库(或自己封装) 2. 常用的ajax请求库 jQuery: 比较重, 如果需要另外引入不建议使用axios: 轻…

vue 使用canvas 详细教程

Vue.js 中使用 Canvas Vue.js 是一个流行的 JavaScript 框架&#xff0c;用于构建用户界面。它提供了一种简洁的方式来管理和渲染数据&#xff0c;同时也支持与其他库和工具的集成。要在 Vue.js 中使用 Canvas&#xff0c;您可以按照以下步骤进行操作&#xff1a; 在 Vue.js …

vueshowpdf 移动端pdf文件预览

1、安装 npm install vueshowpdf -S2、参数 属性说明类型默认值v-model是否显示pdf--pdfurlpdf的文件地址String- scale 默认放大倍数 Number1.2 minscale 最小放大倍数 Number0.8 maxscale 最大放大倍数 Number2 3、事件 名称说明回调参数closepdf pdf关闭事件-pdferr文…

Drozer安装

Drozer安装包下载 https://labs.withsecure.com/tools/drozer Drozer需要的python包下载 pip install "pip<21.0" pyOpenSSL pip install "pip<21.0" service_identity pip install "pip<21.0" twisted pip install "pip<…

.netcore对传输类设置区分大小

.Net Core中内置了对Json的转化与解析 可将PropertyNameCaseInsensitive false 设置为区分大小写。

竞赛选题 基于机器视觉的行人口罩佩戴检测

简介 2020新冠爆发以来&#xff0c;疫情牵动着全国人民的心&#xff0c;一线医护工作者在最前线抗击疫情的同时&#xff0c;我们也可以看到很多科技行业和人工智能领域的从业者&#xff0c;也在贡献着他们的力量。近些天来&#xff0c;旷视、商汤、海康、百度都多家科技公司研…