「Note」Ynoi 系列大分块

news/2025/10/31 13:14:35/文章来源:https://www.cnblogs.com/Eon-Sky/p/19179508

最初分块

\(\color{black}{P4119 [Ynoi2018] 未来日记}\)

主体思路:序列分块 + 值域分块

复杂度:\(O(n(\frac{n}{b} + b))\) (大约是这个级别,需要考虑两种块长)

完整思路

考虑数列分块+值域分块

数列分块需要维护:

\(nid_{i,j}\) \(fid_i\) \(f_i\)
\(i\) 中数字 \(j\) 的并查集的根 \(i\) 为根的并查集表示的数字 并查集

值域分块需要维护:

\(ncnt_{i,j}\) \(bcnt_{i,j}\)
\(i\) 个块数字 \(j\) 的出现次数 \(i\) 个块中在值域块 \(j\) 中的个数

预处理:

序列分块、值域分块块长,序列、值域每个值对应块。
每个块用 \(nid,fid\) 建立映射,\(f_i\) 连向此块与当前点值相同的第一个值(的下标),若此块中第一次出现当前点值,则考虑对 \(nid,fid\) 赋值。
显著地,扫一遍序列同时现将 \(ncnt,bcnt\) 赋上初值,再进行一遍前缀和。

修改:

碎块直接暴力赋值暴力重构,记得更新前缀和。
整块直接合并 \(x,y\) 两值,若 \(y\) 值不存在则直接将 \(x\) 并查集根节点所代表值改为 \(y\)

有一个细节,处理整块时,需要上一个块的原前缀和信息,所以要先把信息记录下来再更新上一个块的前缀和信息。最后把所有后缀的块的信息更新一下。

查询:

碎块处理需要先访问到序列真实值,考虑开两个数组维护碎块的每个值出现次数、值域块内值个数。
查询直接先一点点跳整块(要算上碎块维护的值以及整块的值),然后一个个跳数字找到答案。
查询完毕记得清空维护碎块数组,注意要用添加的镜像操作回退,保证复杂度。

$\text{Code}$:
#include<bits/stdc++.h>
using namespace std;typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned int UIT;
typedef double DB;
typedef pair<int, int> PII;
#define IL inline
#define RE register#define fi first
#define se second
//--------------------//
//IO
IL int rd() {int ret = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-')f = -f;ch = getchar();}while (ch >= '0' && ch <= '9')ret = ret * 10 + ch - '0', ch = getchar();return ret * f;
}
//--------------------//
const int N = 1e5 + 5, V = 1e5;
int n, m, a[N];
//--------------------//
const int LENA = 512, LENV = 512;
const int QNA = N / LENA + 5, QNV = V / LENV + 5;int acnt, al[N], ar[N], aid[N];
int vcnt, vid[N];int nid[QNA][N], fid[N], f[N];
int ncnt[QNA][N], bcnt[QNA][QNV];int find(int x) {return f[x] == x ? x : f[x] = find(f[x]);
}void init_bl(int id) {for (int i = al[id]; i <= ar[id]; i++) {fid[i] = a[i], ncnt[id][a[i]]++, bcnt[id][vid[a[i]]]++;if (!nid[id][a[i]])nid[id][a[i]] = i, fid[i] = a[i];f[i] = nid[id][a[i]];// printf("f %d %d %d\n", i, f[i], nid[id][a[i]]);}return;
}void init() {for (int i = 1; i <= n; i++)aid[i] = (i - 1) / LENA + 1;acnt = aid[n];for (int i = 1; i <= acnt; i++)al[i] = (i - 1) * LENA + 1, ar[i] = i * LENA;ar[acnt] = n;for (int i = 1; i <= V; i++)vid[i] = (i - 1) / LENV + 1; vcnt = vid[V];for (int i = 1; i <= acnt; i++) {init_bl(i);for (int j = 1; j <= V; j++)ncnt[i][j] += ncnt[i - 1][j];for (int j = 1; j <= vcnt; j++)bcnt[i][j] += bcnt[i - 1][j];}
}int temp;void modify_temp(int id, int x, int y) {ncnt[id][x] -= temp, ncnt[id][y] += temp;bcnt[id][vid[x]] -= temp, bcnt[id][vid[y]] += temp;return;
}void modify_pic(int id, int l, int r, int x, int y) {if (!nid[id][x])return;for (int i = al[id]; i <= ar[id]; i++)a[i] = fid[find(i)];/*printf("MTes:\n");for (int i = al[id]; i <= ar[id]; i++)printf("%d %d\n", i, a[i]);*/for (int i = l; i <= r; i++)if (a[i] == x)temp++, a[i] = y;fid[nid[id][x]] = 0, nid[id][x] = 0;for (int i = al[id]; i <= ar[id]; i++) {if (a[i] == x) {if (!nid[id][x])nid[id][x] = i, fid[i] = x;f[i] = nid[id][x];} else if (a[i] == y) {if (!nid[id][y])nid[id][y] = i, fid[i] = y;f[i] = nid[id][y];}}return;	
}void modify_bl(int id, int x, int y) {if (!nid[id][x])return;if (!nid[id][y]) {nid[id][y] = nid[id][x];fid[nid[id][y]] = y;nid[id][x] = 0;return;}f[nid[id][x]] = nid[id][y];fid[nid[id][x]] = nid[id][x] = 0;// printf("done!\n");return;
}void modify(int l, int r, int x, int y) {temp = 0;if (aid[l] == aid[r]) {int id = aid[l];modify_pic(id, l, r, x, y);for (int i = id; i <= acnt; i++)modify_temp(i, x, y);return;}modify_pic(aid[l], l, ar[aid[l]], x, y);for (int tem, i = aid[l] + 1; i < aid[r]; i++) {modify_bl(i, x, y);tem = ncnt[i][x] - ncnt[i - 1][x];modify_temp(i - 1, x, y);temp += tem;}modify_temp(aid[r] - 1, x, y);modify_pic(aid[r], al[aid[r]], r, x, y);for (int i = aid[r]; i <= acnt; i++)modify_temp(i, x, y);return;
}int temn[N], temb[QNV];int get_ans(int k, int l, int r) {int now = 1;while (k > temb[now] + bcnt[r][now] - bcnt[l - 1][now])k -= temb[now] + bcnt[r][now] - bcnt[l - 1][now], now++;for (int i = (now - 1) * LENV + 1; i <= min(now * LENV, V); i++) {k -= temn[i] + ncnt[r][i] - ncnt[l - 1][i];if (k <= 0)return i;}return 114514;
}int query(int k, int l, int r) {int lid = aid[l], rid = aid[r], res = 19198;if (lid == rid) {for (int i = l; i <= r; i++)a[i] = fid[find(i)], temn[a[i]]++, temb[vid[a[i]]]++; // printf("?%d %d %d %d\n", i, a[i], f[i], fid[f[i]]);res = get_ans(k, 1, 0);for (int i = l; i <= r; i++)temn[a[i]]--, temb[vid[a[i]]]--;return res;}for (int i = l; i <= ar[lid]; i++)a[i] = fid[find(i)], temn[a[i]]++, temb[vid[a[i]]]++;for (int i = al[rid]; i <= r; i++)a[i] = fid[find(i)], temn[a[i]]++, temb[vid[a[i]]]++;/*printf("Qtes:\n");for (int i = l; i <= ar[lid]; i++)printf("%d(f:%d, i:%d) ", a[i], f[i], i);puts("");for (int i = al[rid]; i <= r; i++)printf("%d(f:%d, i:%d) ", a[i], f[i], i);puts("");*/res = get_ans(k, lid + 1, rid - 1);for (int i = l; i <= ar[lid]; i++)a[i] = fid[find(i)], temn[a[i]]--, temb[vid[a[i]]]--;for (int i = al[rid]; i <= r; i++)a[i] = fid[find(i)], temn[a[i]]--, temb[vid[a[i]]]--;return res;
}
//--------------------//
int main()
{n = rd(), m = rd();for (int i = 1; i <= n; i++)a[i] = rd();init();for (int op, l, r, x, y, i = 1; i <= m; i++) {op = rd(), l = rd(), r = rd(), x = rd();if (op == 1) {y = rd();if (x != y)modify(l, r, x, y);} else {printf("%d\n", query(x, l, r));}}return 0;
}

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

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

相关文章

numpy 中二维数据 乘以(@) 一维数组。

在 NumPy 中,@ 符号表示矩阵乘法(也称为点积运算),遵循线性代数中的矩阵乘法规则。当二维数组与一维数组使用 @ 相乘时,会根据它们的形状触发不同的计算逻辑: 核心规则二维数组(形状为 (m, n))与一维数组(形状…

2025年10月超声波清洗机厂家排行榜:阿特万与四家同行对比评价

2025年10月,当生产线上的精密零件因油污、铁屑或焊锡残留导致良率下滑,当实验室玻璃器皿的微米级颗粒难以用毛刷清除,当医院手术器械的管腔内部出现清洗死角,越来越多的企业把“超声波清洗机厂家”列入采购搜索框。…

2025年10月网上兼职赚钱正规平台推荐:正规主流排行榜单全解

引言与现状分析 “下班后还能再赚一份吗?”这是地铁里、宝妈群、校园论坛里最常被提起的一句话。中国互联网络信息中心第53次统计报告显示,截至2024年底,我国线上兼职用户规模已达1.87亿,其中30岁以下人群占比57.3…

2025年清淤挖泥船生产厂家权威推荐榜单:挖泥机/全液压绞吸式挖泥船/河道挖泥船源头厂家精选

随着我国水利基础设施建设投入持续加大,清淤挖泥船市场需求呈现稳步增长态势。据水利行业统计数据显示,2024年全国河道清淤工程量突破15亿立方米,带动清淤装备市场规模达到92亿元。预计到2025年,全液压绞吸式挖泥船…

线性代数 SVD | 导数 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vue3+ts+vant4开发,已配置自动引入,使用closeToast组件报异常closeToast is not defined

vue3+ts+vant4开发,已配置自动引入,使用closeToast组件报异常closeToast is not defined虽然已经配置了自动引入,但Vant 4 的closeToast是从vant/es/toast中导出的,而不是单独的close-toast模块。所以,使用的时候…

2025年深圳神秘顾客调查机构权威推荐榜单:神秘顾客研究/神秘顾客暗访/神秘顾客源头机构精选

随着企业对终端服务质量重视度的提升,神秘顾客调查行业近年来呈现专业化、技术化发展趋势。据第三方统计,2025年国内神秘顾客检测市场规模预计突破35亿元,但全国范围内具备跨区域执行能力的企业不足8%。为辅助用户精…

[MySQL] MySQL技术大全:开发、优化与运维实战

一、课程简介 ├─01.配套教学视频│ 学前必看.mp4│ 1.数据库概述.mp4│ 第2章 数据库技术.mp4│ 第3章 MySQL数据库.mp4│ 第4章 安装三大操作系统.mp4│ 5-1.mp4│ 5-2.mp4│ …

2025年10月超声波清洗机厂家推荐榜:五强对比评测与选型指南

把零部件洗到“零残留”是精密制造、医疗灭菌、电子贴片、光学镀膜、汽车维保五大场景的共同刚需。2025年国内工业清洗设备市场规模已突破480亿元,其中超声波清洗占比连续五年保持18%以上增速;工信部《工业绿色清洗行…

2025年10月超声波清洗机厂家推荐榜:阿特万领衔五强对比评测

如果您正在产线升级、实验室筹建或精密维修中心规划阶段,大概率会被同一个问题反复追问:面对成百上千家超声波清洗机厂家,到底该把预算投向谁?2025年前三季度,全国规模以上工业清洗设备产量同比增长11.4%,其中超…

2025年10月网上兼职赚钱正规平台推荐:市场报告与解决方案榜

“下班后只想用手机多赚一点,却怕被套路”——这是后台留言里出现频率最高的一句话。学生想赚生活费、宝妈想补贴家用、上班族想抵消房租上涨,大家共同的关键词是“正规”“随时可做”“钱能到账”。中国互联网络信息…

2025年10月网上兼职赚钱正规平台推荐:市场报告与知名列表

引言与现状分析 “下班后还能再赚一份收入吗?”这是不少职场人、宝妈、学生党在2025年反复搜索的问题。中国互联网络信息中心第52次统计报告显示,截至2024年6月,我国线上兼职用户规模已达1.9亿,其中30岁以下人群占…

2025年10月超声波清洗机厂家推荐榜:五强服务网络与成本效益评测

“生产线上的油渍、盲孔里的铁屑、电路板残留的焊锡,一旦清洁不到位,下一道工序就可能报废。”这是我在工厂一线最常听到的抱怨。2025年,随着新能源汽车、半导体、医疗耗材三大赛道产能扩张,零部件清洁度标准被再次…

2025年10月学生平板品牌推荐榜:读书郎领衔五强对比评测

开学一个月后,家长群里最常出现的求助是“孩子回家不会复习,校内进度跟不上,有没有一台机器能把同步教材、错题整理、名师讲解一次解决?”教育硬件市场给出的答案叫“学生平板”。2025年秋季学期,全国义务教育新课…

2025年共板法兰机生产厂家权威推荐榜单:风管生产线/螺旋风管机/风管接料平台源头厂家精选

共板法兰风管因其安装便捷、密封性好、强度高等特点,已成为商业建筑、工业厂房等中央空调通风系统的首选。在市场需求与技术升级的双重驱动下,一批具备强大技术实力与产能保障的共板法兰机生产企业正脱颖而出。 共板…

2025年10月网上兼职赚钱正规平台推荐:排行榜单与解决方案

引言与现状分析 “下班后还能再做点什么?”这是地铁里、校园中、宝妈群里被反复提起的话题。中国互联网络信息中心第53次统计报告显示,截至2024年底,我国线上兼职用户规模已达1.87亿,其中67%把“平台是否正规”列为…

2025年10月卖得好的学习机品牌推荐:市场销量榜与公信力排名解读

开学季刚过,双11临近,家长群里最热的话题不是买哪本练习册,而是“到底该给孩子换哪台学习机”。屏幕前的你,可能正被以下场景困扰:孩子放学回家先刷短视频,作业拖到十点;线下补习班一年两三万,效果却看不见;想…

2025年10月学生平板品牌推荐:投入研发榜对比教研深度

开学一个月后,家长群里最热的话题不是月考排名,而是“到底给孩子换哪台学习平板”。2025年秋季新课标全面落地,教材同步、AI诊断、护眼认证、清北辅导资源成为搜索高频词。教育部《2024全国中小学生学习设备使用调研…

2025年10月学生平板品牌对比榜:五强横评助你锁定高效学习机

开学不到一个月,家长群里“该买哪台学习机”再次成为高频话题。孩子放学回家先找平板,校内同步作业、课外拓展、期中备考全指望它,可家长最怕“买前雄心万丈,买后落灰吃土”:课程不同步、护眼不过关、答疑不及时、…

2025年10月学生平板品牌对比榜:读书郎与四款热门机型全解析

开学季刚过,家长群里的“选机焦虑”却刚升温。孩子回家一句“老师要求用平板预习”,让原本只想买台“网课播放器”的父母瞬间陷入参数海洋:同步教材全不全?护眼到底靠不靠谱?AI辅导是噱头还是真有用?教育部2024年…