线段树优化dp,abc389F - Rated Range

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

F - Rated Range


二、解题报告

1、思路分析

考虑定义 f(i, j) 为 初始分数为j,经过i 场比赛后的最终分数

f(i, j) = f(i - 1, j) + 1,如果 l[i] <= f(i - 1, j) <= r[i]

否则,f(i, j) = f(i - 1, j)

显然具有单调性 f(i, j + 1) >= f(i, j)

那么说明 f(i) 单调不降

那么我们用懒标记线段树维护 f(i),每次读入 l(i) r(i),对f 值 在 l(i) 和 r(i) 之间的线段进行 + 1即可

2、复杂度

时间复杂度: O(nlogn + q)空间复杂度:O(nlogn)

3、代码详解

 ​
#include <bits/stdc++.h>using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;template<class Info, class Tag>
struct LazySegmentTree {int n;std::vector<Info> info;std::vector<Tag> tag;LazySegmentTree() : n(0) {}LazySegmentTree(int _n, Info _v = Info()) {init(_n, _v);}template<class T>LazySegmentTree(std::vector<T> _init) {init(_init);}void init(int _n, const Info &_v = Info()) {init(std::vector<Info>(_n, _v));}template<class T>void init(const std::vector<T> &_init) {n = _init.size();info.assign(4 << std::__lg(n), Info());tag.assign(4 << std::__lg(n), Tag());auto build = [&](auto &&self, int p, int l, int r) -> void {if (l == r) {info[p] = _init[l];return;}int m = (l + r) / 2;self(self, p * 2, l, m);self(self, p * 2 + 1, m + 1, r);pull(p);};build(build, 1, 0, n - 1);}void pull(int p) {info[p] = info[p * 2] + info[p * 2 + 1];}void apply(int p, const Tag &v) {info[p].apply(v);tag[p].apply(v);}void push(int p) {apply(2 * p, tag[p]);apply(2 * p + 1, tag[p]);tag[p] = Tag{};}void modify(int p, int l, int r, int x, const Info &v) {if (l == r) {info[p] = v;return;}int m = (l + r) / 2;push(p);if (x < m)modify(p * 2, l, m, x, v);elsemodify(p * 2 + 1, m + 1, r, x, v);pull(p);}void modify(int x, const Info &v) {modify(1, 0, n - 1, x, v);}Info rangeQuery(int p, int l, int r, int x, int y) {if (l > y || r < x)return Info{};if (x <= l && r <= y) return info[p];int m = (l + r) / 2;push(p);auto t = rangeQuery(p * 2, l, m, x, y) + rangeQuery(p * 2 + 1, m + 1, r, x, y);return t;}Info rangeQuery(int l, int r) {return rangeQuery(1, 0, n - 1, l, r);}void rangeApply(int p, int l, int r, int x, int y, const Tag &v) {if (l > y || r < x) return;if (x <= l && r <= y) {apply(p, v);return;}int m = (l + r) / 2;push(p);rangeApply(p * 2, l, m, x, y, v);rangeApply(p * 2 + 1, m + 1, r, x, y, v);pull(p);}void rangeApply(int l, int r, const Tag &v) {rangeApply(1, 0, n - 1, l, r, v);}template<class F>int findFirst(int p, int l, int r, int x, int y, F pred) {if (l > y || r < x || !pred(info[p])) {return -1;}if (l == r)return l;int m = (l + r) / 2;push(p);int res = findFirst(p * 2, l, m, x, y, pred);if (res == -1)res = findFirst(p * 2 + 1, m + 1, r, x, y, pred);return res;}template<class F>int findFirst(int l, int r, F pred) {return findFirst(1, 0, n - 1, l, r, pred);}template<class F>int findLast(int p, int l, int r, int x, int y, F pred) {if (l > y || r < x || !pred(info[p])) {return -1;}if (l == r)return l;int m = (l + r) / 2;push(p);int res = findLast(p * 2 + 1, m + 1, r, x, y, pred);if (res == -1)res = findLast(p * 2, l, m, x, y, pred);return res;}template<class F>int findLast(int l, int r, F pred) {return findLast(1, 0, n - 1, l, r, pred);}
};struct Tag{int x = 0;void apply(const Tag &t) {if (t.x) {x += t.x;}}
};struct Info{int max = 0;void apply(const Tag &t) {max += t.x;}friend Info operator+ (const Info &a, const Info &b) {return {std::max(a.max, b.max)};}
};struct F0{int t = 0;bool operator()(const Info& v) {return v.max >= t;}
};struct F1{int t = 0;bool operator()(const Info& v) {return v.max > t;}
};int main()
{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n;std::cin >> n;constexpr int N = 5E5;std::vector<Info> init(N + 1);for (int i = 0; i <= N; ++ i) {init[i].max = i;}LazySegmentTree<Info, Tag> sgt(init);for (int i = 0; i < n; ++ i) {int l, r;std::cin >> l >> r;int L = sgt.findFirst(1, N, F0{l});int R = sgt.findFirst(1, N, F1{r});if (R == -1) {R = N + 1;}sgt.rangeApply(L, R - 1, {1});}int q;std::cin >> q;while (q --) {int x;std::cin >> x;std::cout << sgt.rangeQuery(x, x).max << '\n';}return 0;
}

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

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

相关文章

MySQL 主从复制原理及其工作过程的配置

一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作…

Linux——线程条件变量(同步)

Linux——多线程的控制-CSDN博客 文章目录 目录 文章目录 前言 一、条件变量是什么&#xff1f; 1、死锁的必要条件 1. 互斥条件&#xff08;Mutual Exclusion&#xff09; 2. 请求和保持条件&#xff08;Hold and Wait&#xff09; 3. 不可剥夺条件&#xff08;No Preemption&…

# [Unity] 【游戏开发】获取物体和组件的脚本方法

在Unity开发中,获取游戏物体(GameObject)及其组件(Component)是脚本编程的核心技能。本文将详细介绍如何在脚本中访问游戏物体及其组件,深入讲解常用的获取方法及优化策略,以帮助开发者高效编写Unity脚本。 1. 理解游戏物体与组件的关系 游戏物体(GameObject):Unity场…

【Android】蓝牙电话HFP连接源码分析

一、概述 在Android系统中&#xff0c;HF&#xff08;Hands-Free Profile&#xff09;客户端与AG&#xff08;Audio Gateway&#xff09;端之间的HFP&#xff08;Hands-Free Profile&#xff09;连接是蓝牙音频通信的重要组成部分。这一过程涉及多个层次和组件的协同工作&…

【机器学习实战入门】使用Pandas和OpenCV进行颜色检测

Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道&#xff0c;并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的&#xff0c;它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测&#xff1f; 颜色检测是检测任何颜色名称的过程…

《CPython Internals》阅读笔记:p232-p249

《CPython Internals》学习第 13天&#xff0c;p232-p249 总结&#xff0c;总计 18 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;1) 1.overhead (1)overhead: over-(“above”) head(“top part, uppermost section”) overhead的字面意思是&#xff1a;above…

动手学大数据-3社区开源实践

目录 数据库概览&#xff1a; MaxComput&#xff1a; HAWQ&#xff1a; Hologres&#xff1a; TiDB&#xff1a; Spark&#xff1a; ClickHouse&#xff1a; Apache Calcite 概览 Calcite RBO HepPlanner 优化规则&#xff08;Rule&#xff09; 内置有100优化规则 …

多平台下Informatica在医疗数据抽取中的应用

一、引言 1.医疗数据抽取与 Informatica 概述 1.1 医疗数据的特点与来源 1.1.1 数据特点 医疗数据具有显著的多样性特点。从数据类型来看&#xff0c;涵盖了结构化数据&#xff0c;如患者的基本信息、检验检查结果等&#xff0c;这些数据通常以表格形式存储&#xff0c;便于…

HTTP / 2

序言 在之前的文章中我们介绍过了 HTTP/1.1 协议&#xff0c;现在再来认识一下迭代版本 2。了解比起 1.1 版本&#xff0c;后面的版本改进在哪里&#xff0c;特点在哪里&#xff1f;话不多说&#xff0c;开始吧⭐️&#xff01; 一、 HTTP / 1.1 存在的问题 很多时候新的版本的…

BUUCTF_Web(October 2019 Twice SQL injection)

October 2019 Twice SQL injection 知识点&#xff1a; 二次注入&#xff1a; 当用户提交的恶意数据被存入数据库后&#xff0c;应用程序再把它读取出来用于生成新的SQL语句时&#xff0c;如果没有相应的安全措施&#xff0c;是有可能发生SQL注入的&#xff0c;这种注入就叫…

Jenkins-pipeline语法说明

一. 简述&#xff1a; Jenkins Pipeline 是一种持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile&#xff1a; 1. Sections部分&#xff1a; Pipeline里的Sections通常包含一个或多个Direc…

电商项目高级篇08-springCache

电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…

【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接

背景 当服务器建立好节点&#xff0c;一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的&#xff0c;所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接&#xff01; sudo apt update sudo apt in…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…

[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()

目录 1. 项目介绍 2. 技术选型 3. 开发环境和环境搭建 Ubuntu-22.04环境搭建 1. 安装 wget&#xff08;一般情况下默认会自带&#xff09; 2. 更换国内软件源 ① 备份原始 /etc/apt/sources.list 文件 ② 编辑软件源文件 ③ 更新软件包列表 3. 安装常用工具 3.1 安装…

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架&#xff0c;探索了它的关键特性&#xff0c;并建立了简单入门的应用程序。在这系列教程里&#xff0c;我们会探索Gin的主要特性&#xff0c;如路由、中间件、数据库集成等&#xff0c;最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…

Node.js 与 JavaScript 是什么关系

JavaScript 是一种编程语言&#xff0c;而 Node.js 是 JavaScript 的一个运行环境&#xff0c;它们在不同的环境中使用&#xff0c;具有一些共同的语言基础&#xff0c;但也有各自独特的 API 和模块&#xff0c;共同推动着 JavaScript 在前后端开发中的广泛应用。 一、基础语言…

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…

IO多路复用详解-selectpollepoll

目录 1.IO多路复用概念 2.系统调用函数 2.1select 2.1.1select函数细节 2.2基于select实现并发处理 2.2.1处理流程 2.2.2服务端通信代码 2.2.3客户端通信代码 2.3基于poll函数实现并发处理 2.3.1select与poll函数区别 2.3.2poll函数 2.3.3服务器端代码实现 2.3.4客…

IDEA下载安装

目录 IDEAWin下载安装 Mac下载安装 IDEA中基本配置&注释修改背景主题为白色修改字体大小鼠标滚轮控制字体大小控制字母大小写提示&#xff08;取消勾选&#xff09;设置自动编译&#xff08;打勾&#xff09;自动保存&#xff08;参数为1&#xff09;设定参数提示&#xff…