P11660 我终将成为你的倒影 题解

news/2025/2/4 17:34:03/文章来源:https://www.cnblogs.com/ccxswl/p/18698341

P11660 我终将成为你的倒影 题解

感觉评紫比较合理。

初步思路

\(b \le 500\),这于 \(\sqrt n\) 相近,启发我们思考关于根号复杂度的做法。

考虑序列分块。散块暴力,难在整块。

最终思路

下取整可以看做取某个数的整数部分。\(f(x)\) 可以看为 \(\lfloor \frac x b \rfloor + \lfloor \frac a b \rfloor + [a \bmod b + x \bmod b < b]\)

容易发现,假若 \(f(x)=f(y)\),令 \(c = |\lfloor \frac x b \rfloor - \lfloor \frac y b \rfloor|\),那么有必要条件 \(c \le 1\)

\(y_1 = x \bmod b, y_2 = y \bmod b,t = a \bmod b\)

对于 \(c=0\)

  • \(y_1+t < b \land y_2 + t < b\)\(y_1+t \ge b \land y_2 + t \ge b\),即 \(t < \min(b-y_1,b-y_2)\)\(t \ge \max(b-y_1,b-y_2)\)。注意到这两个限制不交叉。

对于 \(c=1\)

  • \(y_1+t<b\land y_2 + t\ge b\),即 \(b-y_2\le t < b-y_1\)

对于 \(c=-1\)

  • \(y_1+t\ge b \land y_2+t<b\),即 \(b-y_1\le t < b-y_2\)

发现上述限制都是区间的形式,且 \(t<b\)。可以考虑在值域为 \(b\) 的桶上差分,再做前缀和。这样就可以支持 \(O(1)\) 查询整块内的答案。

\(b\) 很小,可以枚举。为对于每个块枚举所有的 \(b\),对于所有块内的元素计算 \(f(A_i)=f(A_{i-1})\) 的限制,预处理出上述的数组。

空间复杂度 \(O(b^2 \frac n B)\)\(B\) 为块长。

预处理时间复杂度 \(O(bn)\)

注意

  1. 注意整块间的答案也要统计。
  2. 空间 \(O(b^2 \frac n B)\),块长 \(B=\sqrt n\) 时卡空间,可以适当调大。
  3. 注意限制本身是否合法,即防止出现左边大于右边。

代码

#include <bits/stdc++.h>using namespace std;#define IL inline
#define vec vector
#define eb emplace_back
#define bg begin
#define emp emplace
#define fi first
#define se second
#define bg begin
#define lb lower_bound
using dub = double;
using ubt = long long;
using pii = pair<int, int>;IL void ckx(int &x, const int &y) { (x < y) && (x = y); }
IL void ckm(int &x, const int &y) { (x > y) && (x = y); }template <typename T = int>
IL T _R() {T s = 0, w = 1;char c = getchar();while (!isdigit(c)) w = c == '-' ? -1 : 1, c = getchar();while (isdigit(c)) s = s * 10 + c - 48, c = getchar();return s * w;
}const int N = 1e5;
const dub alpha = 1.3;
const int B = alpha * sqrt(N);
const int S = N / B + 1;
const int K = 500;
const int maxN = N + 3, maxK = K + 3, maxS = S + 3;int n, m, x[maxN];int pos[maxN], L[maxS], R[maxS];int t[maxS][maxK][maxK];int main() {n = _R(), m = _R();for (int i = 1; i <= n; i++) x[i] = _R();for (int i = 1; i <= n; i++) {pos[i] = (i - 1) / B + 1;if (!L[pos[i]]) L[pos[i]] = i;R[pos[i]] = i;}for (int u = 1; u <= pos[n]; u++) {for (int b = 1; b <= K; b++) {for (int i = L[u] + 1; i <= R[u]; i++) {int c = x[i] / b - x[i - 1] / b;if (abs(c) <= 1) {int y1 = x[i] % b, y2 = x[i - 1] % b;if (c == 0) {t[u][b][0]++, t[u][b][min(b - y1, b - y2)]--;t[u][b][max(b - y1, b - y2)]++;} else if (c == 1) {if (y1 >= y2) continue;t[u][b][b - y2]++, t[u][b][b - y1]--;} else {if (y1 <= y2) continue;t[u][b][b - y1]++, t[u][b][b - y2]--;}}}for (int i = 1; i <= K; i++)t[u][b][i] += t[u][b][i - 1];}}int ans = 0;while (m--) {int l = _R(), r = _R(), a = _R(), b = _R();l ^= ans, r ^= ans, a ^= ans, b ^= ans;if (l >= r) { printf("%d\n", ans = 0); continue; }ans = 0;if (pos[l] == pos[r]) {for (int i = l + 1; i <= r; i++)ans += (x[i] + a) / b == (x[i - 1] + a) / b;} else {for (int i = l + 1; i <= R[pos[l]]; i++)ans += (x[i] + a) / b == (x[i - 1] + a) / b;for (int i = L[pos[r]] + 1; i <= r; i++)ans += (x[i] + a) / b == (x[i - 1] + a) / b;for (int i = pos[l] + 1; i < pos[r]; i++)ans += t[i][b][a % b];for (int i = pos[l]; i < pos[r]; i++)ans += (x[R[i]] + a) / b == (x[R[i] + 1] + a) / b;}printf("%d\n", ans);}
}

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

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

相关文章

探索Java动态代理的奥秘:JDK vs CGLIB

动态代理是一种在 运行时动态生成代理类的技术,无需手动编写代理类代码。它通过拦截目标方法的调用,实现对核心逻辑的 无侵入式增强(如日志、事务、权限控制等)。一、关于动态代理 1.1 简介 动态代理是一种在 运行时动态生成代理类 的技术,无需手动编写代理类代码。它通过…

Esp32s3(立创实战派)移植LVGL

Esp32s3(立创实战派)移植LVGL 移植: 使用软件EEZ studio 创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能根据屏幕像素调整画布为320*240复制ui文件至工程 将生成的ui文件夹复制到main文件夹同级目录(ui文件夹在工程文件src中) 工程结构:修改声明头文件路径 首先将u…

字节系AI代码编辑器Trae:免费双模大模型+「Builder模式」

字节跳动技术团队近日正式推出AI代码编辑器Trae(官网:https://www.trae.ai/),这款定位为「自适应AI IDE」的开发工具,凭借其创新功能组合在技术圈引发关注。作为面向下一代开发者的智能编程平台,Trae正在重新定义人机协作的编码体验。 一、核心亮点解析双模大模型免费开放…

RocketMQ实战—3.基于RocketMQ升级订单系统架构

大纲 1.基于MQ实现订单系统核心流程的异步化改造 2.基于MQ实现订单系统和第三方系统的解耦 3.基于MQ实现将订单数据同步给大数据团队 4.秒杀系统的技术难点以及秒杀商详页的架构设计 5.基于MQ实现秒杀系统的异步化架构 6.全面引入MQ的订单系统架构的思维导图1.基于MQ实现订单系…

昆明理工大学2025通信复试真题及答案-通信核心课程综合

0854通信工程信号与系统 吴大正信号与线性系统分析昆工昆明理工大学通信工程817信号与系统考研信号与信息处理通信与信息系统通信工程F002通信核心课程综合通信工程(含宽带网络、移动通信等)

pytorch | softmax(x,dim=-1)参数dim的理解

转自:https://zhuanlan.zhihu.com/p/525276061 首先说一下Softmax函数,公式如下:1. 三维tensor(C,H,W) 一般会设置成dim=0,1,2,-1的情况(可理解为维度索引)。其中2与-1等价,相同效果。 用一张图片来更好理解这个参数dim数值变化:当dim=0时, 是对每一维度相同位置的数值进行…

私人订制新功能——日常

最近开发了一个新功能,以前我都是用纸质笔记做记录的日常生活,后来发现有点麻烦,比如写英语日记的时候,哪天的日记忘记写了还得往前翻太麻烦了,现在打算制作一个功能把这个事情记录下来;功能:是否已经写英语日记记录、举哑铃记录、锻炼握力器记录;

2025 PVC

短线有波上涨

静态代理模式:代码世界的“替身演员”

静态代理是代理模式的一种**实现方式**,其特点是**代理类在编译时就已经确定**,代理类的代码是在程序编译阶段生成的,而不是运行时动态生成。一、关于静态代理 1.1 简介 静态代理是代理模式的一种实现方式,其特点是代理类在编译时就已经确定,代理类的代码是在程序编译阶段…

一个 .NET 开源、免费、功能强大的Windows应用卸载神器

前言 今天大姚给大家分享一个基于 .NET 开源(Apache License)、免费、功能强大的Windows应用卸载神器:Bulk Crap Uninstaller。 项目介绍 Bulk Crap Uninstaller 是一款基于 .NET 开源(Apache License)、免费、功能强大的Windows应用卸载工具,旨在帮助用户快速且有效地移…

强化学习驱动的自适应模型选择与融合用于监督学习

图片来源:Unsplash 上的 Agence Olloweb引言 机器学习模型的选择一直是一个挑战。无论是预测股票价格、诊断疾病,还是优化营销活动,问题始终是:哪个模型最适合我的数据? 传统上,我们依赖交叉验证来测试多个模型——XGBoost、LGBM、随机森林等——然后根据验证性能选择最佳…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的数…