题解:CF2115F1 Gellyfish and Lycoris Radiata (Easy Version)

news/2025/10/23 19:01:17/文章来源:https://www.cnblogs.com/JPGOJCZX/p/19161415

节选自:Codeforces Round 1028 (Div. 1)

这题非常好玩,也非常达芬,我做了 \(1\) 天半才过。

我们考虑到问题是在线,因此可以想到支持在线的操作分块(虽然我没想到),每 \(\sqrt q\) 个操作分成一个操作块。考虑到一次操作最多会使序列新增一个颜色段(颜色段内的所有集合都是一样的),因此一个操作块最多会使一个序列分成 \(\mathcal O(\sqrt q)\) 个颜色段,对于每个颜色段 \(i = [l_i, r_i]\),我们维护一个队列 \(q_i\) 表示段内的集合,\(rev_i\) 表示该段是否翻转,\([rl_i, rr_i]\) 表示这个颜色段对应原序列中的哪一段。

此时 \(1\) 操作和 \(2\) 操作比较好维护。我们找到所有需要插入或翻转的颜色段,如果 \(r\) 正好在一个颜色段 \(i\) 中间,我们就需要将该颜色段分裂。注意此时 \([rl_i, rr_i]\) 的分裂和 \(rev_i\) 有关。假设我们要将颜色段 \(i = [6, 10]\)\(7\) 处分裂,\(i\) 对应的原序列中的区间为 \([1, 5]\)。如果 \(rev_i = 0\),那么直接将 \([1, 5]\) 分裂成 \([1, 2]\)\([3, 5]\) 即可;否则就应该分裂成 \([4, 5]\)\([1, 3]\)。队列 \(q_i\) 就直接复制,时间复杂度将在后文分析。

操作 \(3\) 不好维护,但是我们可以延迟删除。如果 \(x\) 小于等于当前操作数,就将 \(x\) 标记成删除。不过此时队列还需要维护一个 \(be_i\),表示最小的没被删除的数字。由于每次被插入集合的都是当前操作编号,而编号是单增的,因此 \(be_i\) 也是最靠前的没被删除的数字。

现在来处理查询操作。对于一个位置 \(p\),我们可以二分查找出当前操作块中包含 \(p\) 的颜色段 \(i\),然后遍历 \(i\) 的队列 \(q_i\),如果枚举到的数字没被删除,那么根据刚才的推导,这一定是这个队列中最小的元素,用它更新答案即可;否则就将 \(be_i\)\(1\)。由于我们记录了 \([rl_i, rr_i]\),因此我们知道 \(p\) 在经过当前操作块之前所处的位置 \(p'\),也就是 \(p\) 在上一个操作块中所处的位置,因此我们不断往下查找即可。

现在来分析时间复杂度。先来考虑修改操作,我们发现一个操作块中最多会被插入 \(\mathcal O(\sqrt q)\) 个数字,而最多只会分裂 \(\mathcal O(\sqrt q)\) 次,每次都会将这 \(\mathcal O(\sqrt q)\) 个数字复制一遍,因此一个操作块内操作的时间复杂度是 \(\mathcal O(q)\),这部分的总时间复杂度就是 \(\mathcal O(q \sqrt q)\)。而查询时,由于我们记录了 \(be_i\),而 \(be_i\) 是单调不降的,因此每个颜色段只会被扫一遍,而颜色段的数量长度和是 \(\mathcal O(n \sqrt q)\) 的。加上二分查找的时间复杂度,这一部分的时间复杂度就是 \(\mathcal O(n \sqrt q \log \sqrt q)\),总时间复杂度就是 \(\mathcal O(q \sqrt q + n \sqrt q \log \sqrt q)\)

完整代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
inline int read(){int x = 0; bool f(0); char ch = getchar();while(!isdigit(ch)) f = (ch == '-'), ch = getchar();while(isdigit(ch)) x = (x<<3) + (x<<1) + (ch^48), ch = getchar();return f ? -x : x;
}
inline void write(int x){if(x < 0) x = -x, putchar('-'); static short Stack[64], top(0);do Stack[++ top] = x % 10, x /= 10; while(x);while(top) putchar(Stack[top--] | 48);
}
const int N = 2e5 + 9, B = 319, INF = 1e9 + 9;
struct Segment{int l, r, rl, rr;inline bool operator < (const Segment &a) const{return l < a.l;}
} t[N];
struct Node{int pre, nex;
} e[N];
int head[N];
inline void add(int id, int x){//在 id 后面插入 xe[x].nex = e[id].nex;e[x].pre = id;e[id].nex = x;
}
inline void del(int id){e[e[id].nex].pre = e[id].pre;e[e[id].pre].nex = e[id].nex;
}
int era[N], rev[N], q[N][B], be[N], ed[N], n, qq, tot = 1, cnt, num = 1, lastans;
void split(int i, int b){tot++;for(int j = be[i]; j <= ed[i]; j++)q[tot][++ed[tot]] = q[i][j];rev[tot] = rev[i];int tmp1, tmp2, tmp3, tmp4;if(rev[i]){tmp1 = t[i].rr - (b - t[i].l + 1) + 1;tmp2 = t[i].rr;tmp3 = t[i].rl;tmp4 = t[i].rr - (b - t[i].l + 1);} else {tmp1 = t[i].rl;tmp2 = t[i].rl + (b - t[i].l + 1) - 1;tmp3 = t[i].rl + (b - t[i].l + 1);tmp4 = t[i].rr;}t[tot] = Segment{b + 1, t[i].r, tmp3, tmp4};t[i].r = b;t[i].rl = tmp1;t[i].rr = tmp2;add(i, tot);
}
int st[N][B], sum[B];
vector <int> vec;
int main(){for(int i = 1; i < N; i++)be[i] = 1;n = read();qq = read();int k = sqrt(qq), qqq = qq;t[tot]= Segment{1, n, 1, n};e[tot].pre = 0;e[0].pre = -1;e[0].nex = tot;e[tot].nex = 2 * n;e[2 * n].pre = tot;e[2 * n].nex = -1;head[1] = tot;while(qqq--){cnt++;int a, b, c;a = read();b = read();c = read();if(a == 1 || a == 2)b = (b + lastans - 1) % n + 1;elseb = (b + lastans - 1) % qq + 1;c = (c + lastans - 1) % n + 1;if(a == 1){int he = 0;for(int i = head[num]; i != 2 * n; i = e[i].nex){he += t[i].r - t[i].l + 1;if(he == b){q[i][++ed[i]] = cnt;break;}if(he > b){split(i, b);q[i][++ed[i]] = cnt;break;}q[i][++ed[i]] = cnt;}} else if(a == 2){int he = 0;vec.clear();for(int i = head[num]; i != 2 * n; i = e[i].nex){he += t[i].r - t[i].l + 1;if(he == b){vec.push_back(i);del(i);break;}if(he > b){split(i, b);vec.push_back(i);del(i);break;}vec.push_back(i);del(i);}for(int i = 0; i <= (int)vec.size() - 1; i++){int L = t[vec[i]].l, R = t[vec[i]].r;t[vec[i]].l = b - R + 1;t[vec[i]].r = b - L + 1;add(0, vec[i]);rev[vec[i]] ^= 1;}head[num] = vec[vec.size() - 1];} else if(a == 3){if(b <= cnt)era[b] = true;}sum[num] = 0;for(int i = head[num]; i != 2 * n; i = e[i].nex)st[num][++sum[num]] = i;int ans = INF;for(int i = num; i >= 1; i--){int L = 1, R = sum[i], res = 0, j;while(L <= R){int mid = (L + R) >> 1;if(t[st[i][mid]].l <= c)L = mid + 1, res = mid;elseR = mid - 1;}j = st[i][res];for(int l = be[j]; l <= ed[j]; l++){if(!era[q[j][l]]){ans = min(ans, q[j][l]);break;} elsebe[j]++;}c = t[j].rl + (c - t[j].l + 1) - 1;if(rev[j])c = t[j].rl + t[j].rr - c;}if(ans == INF)ans = 0;write(lastans = ans);putchar('\n');if(cnt % k == 0){sum[num] = 0;for(int i = head[num]; i != 2 * n; i = e[i].nex)st[num][++sum[num]] = i;num++, tot++;t[tot] = Segment{1, n, 1, n};e[tot].pre = 0;e[0].pre = -1;e[0].nex = tot;e[tot].nex = 2 * n;e[2 * n].pre = tot;e[2 * n].nex = -1;head[num] = tot;}}return 0;
}

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

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

相关文章

项目管理软件是不是伪需求?

我发现尤其是这几年,和老板们聊天,只要一说到项目管理,就绕不开工具这个话题。现在市面上各种项目管理软件层出不穷,从任务看板到进度甘特图,从即时沟通到自动汇报,功能越来越多,让人眼花缭乱。 所以老板们也常…

2025内窥镜/内窥镜电缆线/B超线厂家推荐明秀电子,专业制造品质可靠

2025内窥镜/内窥镜电缆线/B超线厂家推荐明秀电子,专业制造品质可靠 技术挑战与行业痛点:数据揭示的严峻现实 医疗内窥镜领域正面临前所未有的技术挑战。据统计,全球内窥镜设备故障中,电缆线相关问题占比高达42%,其…

2025低烟无卤/UL3302/UL3767/UL4413辐照线厂家推荐明秀电子,专业认证品质保障

2025低烟无卤/UL3302/UL3767/UL4413辐照线厂家推荐明秀电子,专业认证品质保障 技术挑战:安全标准升级下的行业困境 随着全球电子设备安全标准的不断提升,低烟无卤线缆行业正面临着前所未有的技术挑战。UL3302低烟无…

2025.10.23考试记录

T1 题意 将给定的正整数 \(n\),表示为只包含数字 \(1\) 的加数的和,每个加数可正可负。 分析 看起来是一道构造题,令 \(a_i\) 表示由 \(i\) 个 \(1\) 组成的正整数,注意到每个 \(a_i\) 的使用次数都可以通过增加 \…

低代码如何成为业务与IT的沟通桥梁?破解数字化转型中的协作难题

在企业数字化转型的漫长旅途中,最令人疲惫的或许不是技术的复杂度,而是沟通的摩擦力。业务部门用“市场语言”描绘着一幅宏伟蓝图,而IT部门用“技术语言”回应着一串现实约束。双方都在为同一个目标努力,却仿佛说着…

2025铁氟龙/极细铁氟龙/UL系列高温线厂家推荐明秀电子,专业耐用品质保障!

2025铁氟龙/极细铁氟龙/UL系列高温线技术突破与行业趋势分析 在电子设备日益精密化、微型化的今天,高温线材作为关键连接组件,其性能表现直接影响整个系统的可靠性和使用寿命。铁氟龙高温线、极细铁氟龙线以及UL1006…

LIS 略解

这是一个非常经典的问题。 有两种解法,一种是 \(\mathcal O(n ^ 2)\) 的动态规划做法,一种是 \(\mathcal O(n \log n)\) 的贪心做法。动态规划做法设 \(dp_i\) 为以第 \(i\) 个数字结尾的最长单调增加序列。 然后枚举…

低代码如何引爆全员创新?揭秘技术民主化背后的蒲公英效应

创新,对于许多企业而言,曾是一种奢侈的、被集中管理的资源。它通常被禁锢在特定的研发部门或创新实验室里,依赖于少数“天才”的灵光一现。然而,在当今瞬息万变的市场环境中,这种“中心化”的创新模式已显得力不从…

低代码如何重塑IT部门价值?

在传统的企业财务报表上,IT部门常常被归类为“成本中心”。这个标签背后,是无数个日夜的加班运维、应对不完的业务需求、以及难以量化的价值输出。IT团队深陷于开发“救火”和系统“补漏”的循环中,虽有苦劳,却难论…

2025工业冰水机/冷水机厂家推荐东莞市凯诺机械,高效制冷稳定运行

2025工业冰水机/冷水机厂家推荐:高效制冷稳定运行新标杆 当前工业温控设备领域的技术挑战与突破 工业冰水机、工业冷水机作为现代制造业不可或缺的温控设备,正面临着前所未有的技术挑战。根据行业数据显示,传统工业…

2025小型低温/工业/风冷/一体式螺杆冷冻机厂家推荐:东莞凯诺机械专业制冷解决方案

2025小型低温/工业/风冷/一体式螺杆冷冻机厂家推荐:东莞凯诺机械专业制冷解决方案 在工业制冷领域,小型低温冷冻机、工业风冷机组和一体式螺杆冷冻机正面临着前所未有的技术挑战。随着2025年制造业升级的加速推进,这…

2025水冷螺杆/风冷螺杆冷水机厂家推荐东莞市凯诺机械,高效制冷稳定可靠

2025水冷螺杆/风冷螺杆冷水机厂家推荐东莞市凯诺机械,高效制冷稳定可靠 在工业制冷领域,水冷螺杆和风冷螺杆冷水机作为关键温控设备,其性能表现直接关系到生产效率和能源消耗。随着2025年能效标准的逐步实施,行业面…

(例题)HTTPS 电商商品页抓包与关键数据提取

HTTPS 电商商品页抓包与关键数据提取 实践目标 1.成功抓取京东商品详情页的 HTTPS 请求 2.从响应体中提取商品名称、库存关键数据 前置条件 1.Fiddler 已完成 HTTPS 证书配置(根证书安装并信任) 2.电脑浏览器代理已指…

qoj.4878 Easy Problem 做题记录

高手。link 惯性思维很容易想到 Hall 定理 + 线段树 去处理,我一直想了 2h+,事实上有另外一种思路。 由于保留的所有区间都覆盖了位置 \(i\),我们考虑贪心做最大匹配:从左到右扫描每个位置,优先用 \(r\) 小的区间…

LLM学习笔记DAY10

📘 大语言模型全面学习笔记 一、大语言模型评测体系 1.1 常见评测指标任务类型 评测指标 说明分类任务 精确率、召回率、F1 基于混淆矩阵计算语言建模 困惑度(PPL) 衡量文本建模概率文本生成 BLEU、ROUGE 衡量与参…

日志级别

日志级别日志级别(Log Levels) 🔊 五种日志级别(从低到高):级别 含义说明 使用场景TRACE 追踪,最详细 用于追踪程序执行的每一步,如方法入参、变量变化。DEBUG 调试,用于诊断问题 记录流程细节,如“用户登录…

noipd8t2 - Slayer

要理解这段代码,需结合题目要求和题解的逆变换 + 辗转相除思路,逐部分分析:题目核心与题解思路 回顾题目要求:给定两个线性变换 \(T1((x,y))=(x+y,y)\)、\(T2((x,y))=(x,x+y)\),对于每个查询向量 \((x,y)\),统计…

OJ模拟面试3(异步判题架构)

1、请详细描述一条判题消息从生产到消费的完整生命周期。你在生产者端、Broker端和消费者端分别做了哪些具体配置和编码保证? 这是一个考察消息队列端到端可靠性的经典问题。我的设计目标是:消息绝不能丢。生产者端 …

Edge浏览器网页设置深色模式(仅搜索结果界面)

偶然清除了Edge的浏览数据后发现搜索结果界面变成了白色,很不适应,于是在网络搜索,基本都非常相似,主要分为两种方法Edge浏览器网页设置深色模式/暗模式的小技巧_网页深色模式-CSDN博客①在Edge浏览器打开edge://f…

2025 年 AI 编程工具 TOP5 排名:谁在重新定义研发效率?

当 “写代码” 从 “手动敲” 变成 “AI 帮你想”,研发效率的天花板被彻底打破。2025 年最新出炉的 AI 编程工具排名,不仅是技术实力的较量,更是企业降本增效的 “选型指南”—— 这 5 款工具,已经帮数万家企业实现…