P5251 [LnOI2019] 第二代图灵机 Solution

Description

给定序列 a = ( a 1 , a 2 , ⋯ , a n ) , b = ( b 1 , b 2 , ⋯ , b n ) a=(a_1,a_2,\cdots,a_n),b=(b_1,b_2,\cdots,b_n) a=(a1,a2,,an),b=(b1,b2,,bn) 和常数 c c c,有 m m m 个操作分四种:

  • set ⁡ ( x , v ) \operatorname{set}(x,v) set(x,v):执行 a x ← v a_x \gets v axv.
  • assign ⁡ ( l , r , k ) \operatorname{assign}(l,r,k) assign(l,r,k):对每个 i ∈ [ l , r ] i \in [l,r] i[l,r] 执行 b i ← k b_i \gets k bik.
  • query1 ⁡ ( l , r ) \operatorname{query1}(l,r) query1(l,r):求 min ⁡ [ u , v ] ∈ [ l , r ] , ∣ { b u , b u + 1 , ⋯ , b v } ∣ = c ( ∑ i = u v a i ) \min\limits_{[u,v] \in [l,r], |\{b_u,b_{u+1},\cdots,b_v\}|=c} (\sum\limits_{i=u}^v a_i) [u,v][l,r],{bu,bu+1,,bv}=cmin(i=uvai),若没有满足条件的区间,答案为 − 1 -1 1.
  • query2 ⁡ ( l , r ) \operatorname{query2}(l,r) query2(l,r):求 max ⁡ [ u , v ] ∈ [ l , r ] , ∣ { b u , b u + 1 , ⋯ , b v } ∣ = ( v − u + 1 ) ( ∑ i = u v a i ) \max\limits_{[u,v] \in [l,r], |\{b_u,b_{u+1},\cdots,b_v\}|=(v-u+1)} (\sum\limits_{i=u}^v a_i) [u,v][l,r],{bu,bu+1,,bv}=(vu+1)max(i=uvai).

Limitations

1 ≤ n , m ≤ 1 0 5 1 \le n,m \le 10^5 1n,m105
1 ≤ a i , v ≤ 1 0 4 1 \le a_i,v \le 10^4 1ai,v104
1 ≤ b i , k ≤ c ≤ 100 1 \le b_i,k \le c \le 100 1bi,kc100
1 ≤ l , r , x ≤ n , l ≤ r 1 \le l,r,x \le n,\;l \le r 1l,r,xn,lr
1 s , 256 MB 1\text{s},256\text{MB} 1s,256MB保证数据随机

Solution

显然可以用珂朵莉树维护 b b b,用线段树维护 a a a,需要支持单点改,区间和,最大,最小.
对于查询操作,由于 c c c 不大,可以直接对每种颜色开桶,然后在珂朵莉树上跑双指针,即可求出答案,具体见代码.

Code

6.23 KB , 1.20 s , 14.98 MB (in total, C++20 with O2) 6.23\text{KB},1.20\text{s},14.98\text{MB}\;\texttt{(in total, C++20 with O2)} 6.23KB,1.20s,14.98MB(in total, C++20 with O2)

// Problem: P5251 [LnOI2019] 第二代图灵机
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5251
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#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;
}const int inf = 2e9;
struct Chtholly {int l, r;mutable int v;inline Chtholly() {}inline Chtholly(int _l, int _r, int _v): l(_l), r(_r), v(_v) {}inline bool operator<(const Chtholly& rhs) const {return l < rhs.l;}
};struct Node {int l, r, sum, max, min;
};
inline int ls(int u) { return 2 * u + 1; }
inline int rs(int u) { return 2 * u + 2; }struct SegTree {vector<Node> tr;inline SegTree() {}inline SegTree(const vector<int>& a) {const int n = a.size();tr.resize(n << 2);build(0, 0, n - 1, a);}inline void pushup(int u) {tr[u].sum = tr[ls(u)].sum + tr[rs(u)].sum;tr[u].max = std::max(tr[ls(u)].max, tr[rs(u)].max);tr[u].min = std::min(tr[ls(u)].min, tr[rs(u)].min);}inline void build(int u, int l, int r, const vector<int>& a) {tr[u].l = l;tr[u].r = r;if (l == r) {tr[u].sum = tr[u].max = tr[u].min = a[l];return;}const int mid = (l + r) >> 1;build(ls(u), l, mid, a);build(rs(u), mid + 1, r, a);pushup(u);}inline void set(int u, int p, int v) {if (tr[u].l == tr[u].r) {tr[u].sum = tr[u].max = tr[u].min = v;return;}const int mid = (tr[u].l + tr[u].r) >> 1;if (p <= mid) set(ls(u), p, v);else set(rs(u), p, v);pushup(u);}inline int sum(int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) return tr[u].sum;int ans = 0, mid = (tr[u].l + tr[u].r) >> 1;if (l <= mid) ans += sum(ls(u), l, r); if (r > mid) ans += sum(rs(u), l, r);return ans;}inline int min(int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) return tr[u].min;int ans = inf, mid = (tr[u].l + tr[u].r) >> 1;if (l <= mid) ans = std::min(ans, min(ls(u), l, r)); if (r > mid) ans = std::min(ans, min(rs(u), l, r));return ans;}inline int max(int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) return tr[u].max;int ans = 0, mid = (tr[u].l + tr[u].r) >> 1;if (l <= mid) ans = std::max(ans, max(ls(u), l, r)); if (r > mid) ans = std::max(ans, max(rs(u), l, r));return ans;}
};struct ODT {using It = set<Chtholly>::iterator;int n, c;set<Chtholly> odt;vector<int> vis;inline ODT() {}inline ODT(const vector<int>& a, int _c): n(a.size()), c(_c) {for (int i = 0; i < n; i++) odt.emplace(i, i, a[i]);}inline auto split(int p) {auto it = odt.lower_bound(Chtholly(p, -1, -1));if (it != odt.end() && it->l == p) return it;it--;int l = it->l, r = it->r, v = it->v;odt.erase(it);odt.emplace(l, p - 1, v);return odt.emplace(p, r, v).first;}inline void assign(int l, int r, int v) {auto itr = split(r + 1), itl = split(l);odt.erase(itl, itr);odt.emplace(l, r, v);}inline int query_all(int l, int r, SegTree& sgt) {vis.assign(c, 0);auto itr = split(r + 1), itl = split(l);auto ls = itl, rs = itl;int res = 1, ans = inf;vis[rs->v] = 1;while (rs != itr) {if (res == c) {if (ls == rs) ans = min(ans, sgt.min(0, ls->l, ls->r));else ans = min(ans, sgt.sum(0, ls->r, rs->l));vis[ls->v]--;res -= (vis[ls->v] == 0);ls++;}else {rs++;res += (vis[rs->v] == 0);vis[rs->v]++;}}return (ans == inf ? -1 : ans);}inline bool check(It itl, It itr) {if (itl == itr || next(itl) == itr) return false;for (auto it = next(itl); it != itr; it++) {if (it->l != it->r) return true;}return false;}inline int query_unique(int l, int r, SegTree& sgt) {vis.assign(c, 0);int ans = sgt.max(0, l, r);auto itr = split(r + 1), itl = split(l);auto ls = itl, rs = itl;for (; rs != itr; rs++) {vis[rs->v]++;while (check(ls, rs)) {vis[ls->v]--;ls++;}while (ls != rs && vis[rs->v] > 1) {vis[ls->v]--;ls++;}if (ls != rs) ans = max(ans, sgt.sum(0, ls->r, rs->l));}return ans;}
};signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m, c;scanf("%d %d %d", &n, &m, &c);vector<int> a(n), b(n);for (int i = 0; i < n; i++) scanf("%d", &a[i]);for (int i = 0; i < n; i++) scanf("%d", &b[i]), b[i]--;SegTree seg(a);ODT odt(b, c);for (int i = 0, op, x, y, v; i < m; i++) {scanf("%d", &op);if (op == 1) {scanf("%d %d", &x, &v); x--;seg.set(0, x, v);}else if (op == 2) {scanf("%d %d %d", &x, &y, &v);x--, y--, v--;odt.assign(x, y, v);}else if (op == 3) {scanf("%d %d", &x, &y);x--, y--;printf("%d\n", odt.query_all(x, y, seg));}else if (op == 4) {scanf("%d %d", &x, &y);x--, y--;printf("%d\n", odt.query_unique(x, y, seg));}}return 0;
}

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

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

相关文章

如何优化垃圾回收机制?

垃圾回收机制 掌握 GC 算法之前&#xff0c;我们需要先弄清楚 3 个问题。第一&#xff0c;回收发生在哪里&#xff1f;第二&#xff0c;对象在 什么时候可以被回收&#xff1f;第三&#xff0c;如何回收这些对象&#xff1f; 回收发生在哪里&#xff1f; JVM 的内存区域中&…

吴签磁力_简单多功能的磁力搜索工具

磁力搜索&#xff0c;一个比较冷门的话题&#xff0c;但是它能解决我们对于音乐、影视、游戏、软件等资源的需求&#xff0c;今天给大家安利一款深夜学习必备的磁力搜索引擎——吴签磁力。 “吴签磁力”是一款集搜索、下载于一体的多功能磁力搜索引擎&#xff0c;它巧妙地将百度…

spring基础总结

先修知识&#xff1a;依赖注入&#xff0c;反转控制&#xff0c;生命周期 IDEA快捷键 Ctrl Altm:提取方法&#xff0c;设置trycatch 通用快捷键&#xff1a; Ctrl F&#xff1a;在当前文件中查找文本。Ctrl R&#xff1a;在当前文件中替换文本。Ctrl Z&#xff1a;撤销…

MyBatis XML文件配置

目录 一、 配置连接字符串和MyBatis 二、书写持久层代码 2.1 添加Mapper接口 2.2 添加UserlnfoXMLMapper.xml 三、增删改查 3.1 、增&#xff08;Insert&#xff09; 3.2、删&#xff08;Delete) 3.3、改 (Update) 3.4、查 (Select) MyBatisXML的方式需要以下两步&am…

QT:对象树

1.概念 Qt 中的对象树是一种以树形结构组织 Qt 对象的方式。当创建一个QObject&#xff08;Qt 中大多数类的基类&#xff09;或其派生类的对象时&#xff0c;可以为其指定一个父对象&#xff08;parent&#xff09;。这个对象就会被添加到其父对象的子对象列表中&#xff0c;形…

设备通过国标GB28181接入EasyCVR,显示在线但视频无法播放的原因排查

安防监控EasyCVR平台支持多种视频源接入&#xff0c;包括但不限于IP摄像头、NVR、编码器、流媒体服务器等。平台采用高效的视频流接入技术&#xff0c;支持大规模视频流的并发接入&#xff0c;确保视频流的稳定性和流畅性。 有用户反馈&#xff0c;项目现场使用国标GB28181接入…

本地安装部署deepseek

在截图下载工具(地址不方便粘贴过不审核)复制安装程序链接下载模型管理工具ollama&#xff0c;下一步下一步&#xff0c;有需要也可以下载linux版的 githup&#xff1a;https://github.com/ollama/ollama/releases/tag/v0.5.7 安装程序&#xff1a;https://github.com/ollama…

熟练掌握Http协议

目录 基本概念请求数据Get请求方式和Post请求方式 响应数据响应状态码 基本概念 Http协议全称超文本传输协议(HyperText Transfer Protocol)&#xff0c;是网络通信中应用层的协议&#xff0c;规定了浏览器和web服务器数据传输的格式和规则 Http应用层协议具有以下特点&#…

在Mapbox GL JS中“line-pattern”的使用详解

在Mapbox GL JS中&#xff0c;line-pattern 是一种用于在地图上绘制带有图案的线条的样式属性。通过 line-pattern&#xff0c;你可以使用自定义的图像作为线条的图案&#xff0c;而不是使用纯色或渐变。 1. 基本概念 line-pattern: 该属性允许你指定一个图像作为线条的图案。…

QT:信号和槽

目录 1.概念 2.信号和槽的使用 2.1代码的方式使用 2.1.1.使用connect关联 2.2图形化界面的方式使用 2.2.1使用流程 2.2.2使用名字关联槽函数 3.自定义信号和槽函数 3.1自定义槽函数 3.2自定义信号 4.总结 1.概念 信号和槽是QT特有的一种机制&#xff0c;信号和槽都是…

【数据分析】豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)

豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…

simpleQtLogger日志库的使用

simpleQtLogger日志库的使用 simpleQtLogger日志库的使用1. 使用2. 修改点控制台中文乱码修复qt6没有setCodec()修复void*强转数值修复打印日志级别修改 simpleQtLogger日志库的使用 B站上看到一个简单的qt日志库&#xff0c;这里记录一下它的使用。 但是我并不知道源码是谁写…

Linux中安装rabbitMQ

使用docker安装 Linux中还没有安装docker的可以看我之前的视频&#xff0c;先把docker安装了。 Docker的安装_docker version 25.0.1-CSDN博客 检查是否有docker docker -v 上传mq的tar包 我们把mq的tar包上传到我们的Linux服务器中&#xff0c;随后加载成docker的镜像。 加载…

PostgreSQL技术内幕24:定时任务调度插件pg_cron

文章目录 0.简介1.基础知识2.pg_cron安装使用方式2.1 安装pg_cron2.2 使用方式 3.实现原理3.1 启动过程3.2 任务添加和管理3.3 调度过程3.4 执行原理 0.简介 pg_cron是PostgreSQL中的一个简单的基于cron的任务调度插件&#xff0c;本文将从其基础知识&#xff08;Linux中Cron的…

【回溯+剪枝】找出所有子集的异或总和再求和 全排列Ⅱ

文章目录 1863. 找出所有子集的异或总和再求和解题思路&#xff1a;子集问题解法&#xff08;回溯 剪枝&#xff09;47. 全排列 II解题思路&#xff1a;排序 回溯 剪枝 1863. 找出所有子集的异或总和再求和 1863. 找出所有子集的异或总和再求和 一个数组的 异或总和 定义为…

每日一题洛谷P5721 【深基4.例6】数字直角三角形c++

#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }

Hackmyvm Blackhat

简介 难度&#xff1a;简单 靶机地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmBlackhat 参考wp&#xff1a;https://emvee-nl.github.io/posts/HackMyVM-Writeup-Blackhat/#privilege-escalation 环境 kali&#xff1a;192.168.194.9 靶机&#xff1a;192.…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

《redis哨兵机制》

【redis哨兵机制导读】上一节介绍了redis主从同步的机制&#xff0c;但大家有没有想过一种场景&#xff0c;比如&#xff1a;主库突然挂了&#xff0c;那么按照读写分离的设计思想&#xff0c;此时redis集群只有从库才能提供读服务&#xff0c;那么写服务该如何提供&#xff0c…

用python实现进度条

前言 在Python中&#xff0c;可以使用多种方式实现进度条。以下是几种常见的进度条格式的实现方法&#xff1a; 1. 使用 tqdm 库 tqdm 是一个非常流行的库&#xff0c;可以轻松地在循环中显示进度条。 from tqdm import tqdm import time# 示例&#xff1a;简单的进度条 fo…