当前位置: 首页 > article >正文

P5356 [Ynoi Easy Round 2017] 由乃打扑克 Solution

Description

给定序列 a = ( a 1 , a 2 , ⋯ , a n ) a=(a_1,a_2,\cdots,a_n) a=(a1,a2,,an),有 m m m 个操作分两种:

  • add ⁡ ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x):对每个 i ∈ [ l , r ] i\in[l,r] i[l,r] 执行 a i ← a i + x a_i\gets a_i+x aiai+x.
  • kth ⁡ ( l , r , k ) \operatorname{kth}(l,r,k) kth(l,r,k):求 a l ⋯ r a_{l\cdots r} alr 中第 k k k 小的值,无解输出 − 1 -1 1.

Limitations

1 ≤ n , m ≤ 1 0 5 1\le n,m\le 10^5 1n,m105
∣ a i ∣ , ∣ x ∣ ≤ 2 × 1 0 4 |a_i|,|x| \le 2\times 10^4 ai,x2×104
2 s , 128 MB 2\text{s},128\text{MB} 2s,128MB

Solution

看到这种很难维护的操作,考虑分块,每块分别拷贝一份 p i p_i pi 并进行升序排序.
先考虑 kth ⁡ \operatorname{kth} kth,先取 a l ⋯ r a_{l\cdots r} alr 中的最小值和最大值.
k = 1 k=1 k=1,答案为最小值,若 k = r − l + 1 k=r-l+1 k=rl+1,答案为最大值,若超出范围则为 − 1 -1 1,否则以最小值和最大值为左右端点,进行二分.
对于 check ⁡ \operatorname{check} check,求出区间内不大于 mid \textit{mid} mid 的数的个数,具体就是散块暴力,整块二分,外层二分出的结果就是答案.

再考虑 add ⁡ \operatorname{add} add,整块显然打上 tag \textit{tag} tag
对于散块,由于 a i a_i ai p i p_i pi 都要更新,我们将加过 x x x 和没加过 x x x 的部分分成两个数组,再进行归并.

注意分块的标记是永久化的,计算时不要漏了.
要开 long long,否则会被 hack.

Code

4.48 KB , 11.20 s , 3.92 MB (in total, C++20 with O2) 4.48\text{KB},11.20\text{s},3.92\text{MB}\;\texttt{(in total, C++20 with O2)} 4.48KB,11.20s,3.92MB(in total, C++20 with O2)

#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}#ifdef LOCAL
#define getchar_unlocked getchar
#define putchar_unlocked putchar
#endiftemplate<class T>
inline T read() {T x = 0, f = 1;char ch = getchar_unlocked();while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar_unlocked();}while (ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48);ch = getchar_unlocked();}return x * f;
}template<class T>
inline void write(T x) {if (x < 0) {putchar_unlocked('-');x = -x;}if (x > 9) write(x / 10);putchar_unlocked(x % 10 + '0');return;
}constexpr int B = 256;
constexpr i64 inf = 6e18;
struct Node {i64 val;int pos;inline Node() {}inline Node(i64 _val, int _pos) : val(_val), pos(_pos) {}bool operator<(const Node& rhs) const { return val < rhs.val; }
};struct Block {int n, blocks;vector<i64> a, tag;vector<int> belong, L, R;vector<Node> p, t1, t2;inline Block() {}inline Block(const vector<i64>& _a) : a(_a) {n = a.size();blocks = (n + B - 1) / B;p.resize(n), belong.resize(n);L.resize(blocks), R.resize(blocks), tag.resize(blocks);for (int i = 0; i < blocks; i++) {L[i] = i * B;R[i] = min(L[i] + B, n) - 1;for (int j = L[i]; j <= R[i]; j++) {belong[j] = i;p[j] = Node(a[j], j);}sort(p.begin() + L[i], p.begin() + R[i] + 1);}}inline pair<i64, i64> bound(int l, int r) {int bl = belong[l], br = belong[r];i64 vl = inf, vr = -inf;if (bl == br) {for (int i = l; i <= r; i++) {vl = min(vl, a[i] + tag[bl]);vr = max(vr, a[i] + tag[bl]);}}else {for (int i = l; i <= R[bl]; i++) {vl = min(vl, a[i] + tag[bl]);vr = max(vr, a[i] + tag[bl]);}for (int i = L[br]; i <= r; i++) {vl = min(vl, a[i] + tag[br]);vr = max(vr, a[i] + tag[br]);}for (int i = bl + 1; i < br; i++) {vl = min(vl, p[L[i]].val + tag[i]);vr = max(vr, p[R[i]].val + tag[i]);}}return {vl, vr};}inline int count(int l, int r, int k) {int res = 0, bl = belong[l], br = belong[r];if (bl == br) {for (int i = l; i <= r; i++) res += (a[i] + tag[bl] <= k);}else {for (int i = l; i <= R[bl]; i++) res += (a[i] + tag[bl] <= k);for (int i = L[br]; i <= r; i++) res += (a[i] + tag[br] <= k);for (int i = bl + 1; i < br; i++) {int vl = L[i], vr = R[i];if (p[vl].val + tag[i] > k) continue;if (p[vr].val + tag[i] <= k) {res += vr - vl + 1;continue;}while (vl < vr) {int mid = ((vl + vr) >> 1) + 1;if (p[mid].val + tag[i] <= k) vl = mid;else vr = mid - 1;}if (p[vl].val + tag[i] <= k) res += vl - L[i] + 1;}}return res;}inline i64 kth(int l, int r, int k) {auto [vl, vr] = bound(l, r);const int len = r - l + 1;if (k == 1) return vl;if (k == len) return vr;if (k < 1 || k > len) return -1;i64 res = -1;while (vl <= vr) {i64 mid = (vl + vr) >> 1;if (count(l, r, mid) < k) vl = mid + 1;else vr = (res = mid) - 1;}return res;}inline void msort(int l, int r, int b, int k) {t1.clear(), t2.clear();for(int i = L[b]; i <= R[b]; i++) {if (i >= l && i <= r) a[i] += k;if (p[i].pos >= l && p[i].pos <= r) t1.push_back(Node(p[i].val + k, p[i].pos));else t2.push_back(p[i]);}int lp = 0, rp = 0, ptr = L[b];while (ptr <= R[b]) {if (lp < t1.size() && (rp >= t2.size() || t1[lp].val < t2[rp].val)) p[ptr++] = t1[lp++];else p[ptr++] = t2[rp++];}}inline void add(int l, int r, int k) {int bl = belong[l], br = belong[r];msort(l, r, bl, k);if (bl != br) {msort(l, r, br, k);for (int i = bl + 1; i < br; i++) tag[i] += k;}}
};signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);const int n = read<int>(), m = read<int>();vector<i64> a(n);for (int i = 0; i < n; i++) a[i] = read<i64>();Block blk(a);for (int i = 0, op, l, r, k; i < m; i++) {op = read<int>(), l = read<int>(), r = read<int>(), k = read<int>();l--, r--;if (op == 1) write(blk.kth(l, r, k)), putchar_unlocked('\n');else blk.add(l, r, k);}return 0;
}

相关文章:

P5356 [Ynoi Easy Round 2017] 由乃打扑克 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; add ⁡ ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x)&#xff1a;对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...

【线程安全问题的原因和方法】【java形式】【图片详解】

在本章节中采用实例图片的方式&#xff0c;以一个学习者的姿态进行描述问题解决问题&#xff0c;更加清晰明了&#xff0c;以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释&#xff1a; 将上述代码进行修改【从并行转化成穿行的方式】不会出…...

MySQL-----视图与索引

目录 视图 1.视图 2.操作 11.索引 1.定义 2.优缺点: 3.分类 4.索引的设计原则 5.索引的使用 作业 视图 1.视图 ❓如果需要在原表中隐藏部分字段时&#xff0c;怎么办&#xff1f; 视图 &#x1f4d6;视图: 是一个没有存储任何数据的表&#xff0c;可以对其CRUD视图…...

【差分隐私相关概念】约束下的列联表边缘分布计算方法

列联表及其边缘分布的详细解释 一、列联表的定义 列联表&#xff08;Contingency Table&#xff09; 是一种用于表示 多个分类变量联合分布 的表格。其核心是通过多维数组记录不同属性组合的频次。以下是关键点&#xff1a; 分类属性&#xff1a; 设有 k k k 个分类属性 A …...

解决IDEA中maven找不到依赖项的问题

直接去官网找到对应的依赖项jar包&#xff0c;并且下载到本地&#xff0c;然后安装到本地厂库中。 Maven官网&#xff1a;https://mvnrepository.com/ 一、使用mvn install:install-file命令 Maven提供了install:install-file插件&#xff0c;用于手动将jar包安装到本地仓库…...

pyside6的QGraphicsView体系,当鼠标位于不同的物体,显示不同的右键菜单

代码&#xff1a; # 设置样本图片的QGraphicsView模型 from PySide6.QtCore import Qt, QRectF, QObject from PySide6.QtGui import QPainter, QPen, QColor, QAction, QMouseEvent from PySide6.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QGra…...

Python自动化测试 之 DrissionPage 的下载、安装、基本使用详解

Python自动化测试 之 DrissionPage 使用详解 &#x1f3e1;前言&#xff1a;一、☀️DrissionPage的基本概述二、 &#x1f5fa;️环境安装2.1 ✅️️运行环境2.2 ✅️️一键安装 三、&#x1f5fa;️快速入门3.1 页面类&#x1f6f0;️ChromiumPage&#x1f6eb; SessionPage&…...

Java替换jar包中class文件

在更新java应用版本的运维工作中&#xff0c;由于一些原因&#xff0c;开发没办法给到完整的jar包&#xff0c;这个时候&#xff0c;就可以只将修改后的某个Java类的class文件替换掉原来iar包中的class文件&#xff0c;重新启动服务即可&#xff1a; 1、将jar包和将要替换的cl…...

unix网络编程

unix网络编程 AI出来以后&#xff0c;软件不可能找到工作的&#xff0c;就算找到了也在走下坡路。再过几年&#xff0c;机器人发展起来&#xff0c;连流水线都找不到。人为什么整体不值钱&#xff0c;每个部位却很值钱。你说我初中辍学就去开直播结局会不会比现在好。 更新in…...

常考计算机操作系统面试习题(一下)

目录 操作系统基本类型 操作系统的功能 操作系统的主要任务 进程与线程 进程状态转变 内存管理 文件系统与文件管理 虚拟存储器 设备管理 磁盘调度 死锁 信号量机制 文件打开与管理 进程与线程的互斥与同步 进程同步 进程调度 文件分配磁盘块的方法 程序执行…...

2025_0321_生活记录

刚刚写完待会儿早上要汇报的文档&#xff0c;看了一眼时间&#xff0c;现在已经是凌晨2点多了。一直说要早睡&#xff0c;但是一直都没做到。。。算了&#xff0c;不苛求自己了。 昨天是春分&#xff0c;春分秋分&#xff0c;昼夜平分。不知不觉就到春天了&#xff0c;但房间里…...

三层网络 (服务器1 和 服务器2 在不同网段)

服务器1 和 服务器2 在不同网段&#xff0c;并且通过三层交换机实现通信 1. 网络拓扑 假设网络拓扑如下&#xff1a; 服务器1&#xff1a; mac0&#xff1a;IP 地址 192.168.1.10/24&#xff0c;网关 192.168.1.1 mac1&#xff1a;IP 地址 10.0.1.10/24&#xff0c;网关 10.0…...

AI Tokenization

AI Tokenization 人工智能分词初步了解 类似现在这个&#xff0c;一格子 一格子&#xff0c;拼接出来的&#xff0c;一行或者一句&#xff0c;像不像&#xff0c;我们人类思考的时候组装出来的话&#xff0c;并用嘴说出来了呢。...

关于大数据的基础知识(四)——大数据的意义与趋势

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;四&a…...

某视频的解密下载

下面讲一下怎么爬取视频&#xff0c;这个还是比小白的稍微有一点绕的 首先打开网址&#xff1a;aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA 首页 看一下&#xff1a; 有一个标题和一个href&#xff0c;href只是一个片段&#xff0c;待会肯定要拼接&#xff0c; 先找一…...

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…...

从切图仔到鸿蒙开发01-文本样式

从切图仔到鸿蒙开发01-文本样式 本系列教程适合 HarmonyOS 初学者&#xff0c;为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。 本系列教程会将 HTML/CSS 代码片段替换为等价的 HarmonyOS/ArkUI 代码。 页面结构 HTML 与 ArkUI 在 Web 开发中&#xff0c;HTML 文档结…...

菱形虚拟继承的原理

一 &#xff1a;菱形继承的问题 普通的菱形继承存在数据冗余和二义性的问题 &#xff0c;如下代码&#xff1a; class Person { public:string _name; //姓名 };class Student : public Person { protected:int _num; //学号 };class Teacher : public Person { protected:int…...

【数据结构】C语言实现树和森林的遍历

C语言实现树和森林的遍历 导读一、树的遍历二、森林的遍历2.1 为什么森林没有后序遍历?2.2 森林中存不存在层序遍历?三、C语言实现3.1 准备工作3.2 数据结构的选择3.3 树与森林的创建3.4 树与森林的遍历3.4.1 先根遍历3.4.2 后根遍历3.4.3 森林的遍历3.5 树与森林的销毁3.6 算…...

第四天 开始Unity Shader的学习之旅之Unity中的基础光照

Unity Shader的学习笔记 第四天 开始Unity Shader的学习之旅之Unity中的基础光照 文章目录 Unity Shader的学习笔记前言一、我们是如何看到这个世界的1. 光源2.吸收和散射3.着色 二、标准光照模型1. 自发光2. 高光反射① Phong模型② Blinn-Phong模型 3.漫反射4.环境光 总结 前…...

基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统模块功能结构图 局部E-R图 系统首…...

React Native集成到现有原生Android应用

使用React Native(以下简称RN)从头开始制作一个新的应用会是一个非常好的选择。但如果只想给现有的原生应用中添加一两个视图或是业务流程,RN也同样不在话下。只需简单几步,就可以给原有应用加上新的基于RN的特性、画面和视图等。 一、核心概念 把 React Native 组件集成…...

Java-空链基础入门

经过调研和细致观察&#xff0c;我们发现空链对于初次接触或是对Stream和Optional不太熟悉的人来说&#xff0c;确实存在一定的上手难度&#xff0c;宛如开启了“地狱模式”。为了降低这一门槛&#xff0c;我们决定通过一系列由简入深的案例演示&#xff0c;来逐步引导大家掌握…...

【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同&#xff0c;不同时区通过…...

PCDN网络设备

PCDN&#xff08;Peer-to-Peer Content Delivery Network&#xff0c;点对点内容分发网络&#xff09;是一种基于P2P技术的内容分发网络。它利用用户终端设备之间的直接数据传输来减少中心服务器的压力&#xff0c;并提高内容交付的速度和效率。 PCDN的工作原理 节点共享&…...

3.17-3.23 Web3 游戏周报:Pixudi 双榜领跑,The Forgotten Runiverse 登陆三大主机平台

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.17–3.23】Web3 游戏行业动态 Ronin 将与 Alpha Growth 等合作推出 1300 万美元增长计划&#xff0c;以向 DeFi 扩张Notcoin 开发工作室 Open Builders 宣布推出 Not Games …...

AppInventor2生成3位数的水仙花数

生成3位水仙花数&#xff08;每位数字的立方之和刚好等于这个数字&#xff09;的代码&#xff0c;如下&#xff1a; 来源&#xff1a;【生成Python】AppInventor2中文网已支持代码块转换Python源码&#xff01; - App Inventor 2 中文网 - 清泛IT社区&#xff0c;为创新赋能&…...

【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类

【聚类算法解析系列02】经典聚类算法&#xff08;上&#xff09;——K-Means与层次聚类 引言&#xff1a;算法背后的认知革命 K-Means与层次聚类&#xff0c;这两个诞生于1960年代的算法&#xff0c;至今仍是工业界使用率最高的聚类工具。它们分别代表了两种根本性的世界观&am…...

shadcn如何给dialog增加关闭按钮和隐藏右上角关闭按钮

增加关闭按钮&#xff1a; <DialogFooter><DialogClose asChild><button className"rounded-sm bg-black/100 px-3 py-2 text-xs font-semibold text-white shadow-xs hover:bg-black/90" >Close</button></DialogClose> </DialogF…...

华为机试牛客刷题之HJ59 找出字符串中第一个只出现一次的字符

HJ59 找出字符串中第一个只出现一次的字符 描述 对于给定的字符串&#xff0c;找出第一个只出现一次的字符。如果不存在&#xff0c;则输出 −1。 输入描述&#xff1a; 在一行上输入一个长度为 1≦len(s)≦10^3 、仅由小写字母构成的字符串 s。 输出描述&#xff1a; 如果存…...