P14322 「ALFR Round 11」E 空崎ヒナ 题解 (markdown)

news/2025/10/27 21:25:18/文章来源:https://www.cnblogs.com/MyShiroko/p/19170211
## P14322 「ALFR Round 11」E 空崎ヒナ 题解**Sorasaki Hina 赛高!**也是做上 BA 的题了!也是写上 BA 的题的题解了!我们 BA 厨的日子真是蒸蒸日上啊!求审核大大通过 QvQ。求求了!题目描述:给出若干次询问,每次询问给出 $[l,r]$,求 $\sum_{i = l}^{r} [b_i \equiv x\pmod {\displaystyle\max_{l\le j\le i}a_j}]$。~~这种一句话题意总感觉在做 ynoi?~~很容易我们可以将题意转化为求 $\sum_{i = l}^{r} [\lvert b_i - x \rvert \mid {\displaystyle\max_{l\le j\le i}a_j}]$。然后怎么做呢?首先转化完题意后发现 $b$ 数组没有直接用到,可以在输入的时候直接减去 $x$。**下文中提到的 $b$ 数组都是减完 $x$ 后的 $b$ 数组**。因为发现左端点的位置对后边的贡献有影响,所以是不好直接去维护的。所以最开始我想的是用回滚莫队,将问题离线后按左端点为第一关键字,右端点为第二关键字排序,然后枚举左端点所在块,右端点直接跑即可。但是这样的话就有一个问题。那就是从左端点到块的右端点中的值会对块的右端点后边的值产生影响。这可能有点拗口,举个例子解释一下。比如说有一个询问是从 1 到 5。$b$ 数组为 1 4 2 3 4。假设 1 所在块的右端点为 2。那么我们可以直接求出 $[1,2]$ 和 $[3,5]$ 的贡献,而在这其中,参与到答案的 $max_{a_i}$ 则为1 4 2 3 4。可这显然是不对的,因为正确的 $max_{a_i}$ 应该是1 4 4 4 4。才对。我们发现,错误的贡献在于从 3 到 4 这一个区间。也就是从**右端点指针的开头**到**最大值小于左端点指针暴力遍历的最大值**的这个区间。如果还是不理解的话,可以画个图来理解一下。如下图所示,其中黑色的竖线是右端点遍历的起点,竖线右边的红线是右端点指针遍历中求的最大值。竖线左边的黑线是左端点指针暴力遍历的最大值。竖线右边的红线是对答案贡献有误的区间(因为该区间内的 $mas{a_i}$ 在统计时是错误的)。![](https://cdn.luogu.com.cn/upload/image_hosting/wd1n5d97.png)然后我们考虑怎么去除这部分错误贡献。首先,考虑到这种贡献有且仅有当左端点左移时产生,但是如果左端点右移,我们将无法处理新的贡献。所以扩展刚才我们的思想,直接上扫描线(~~其实是因为回滚莫队时间复杂度不正确~~)。考虑直接将左端点从大到小排序。每次将左端点加上即可。然后每次二分地查出其错误贡献的区间,然后修正这部分去权值即可。对于像上图竖线之后的贡献,我们可以直接从左到右遍历一遍即可。但是这样又有一个问题,如果我们询问的右端点在错误的区间之中,那么我们将无法处理。这时候,曾经被 ynoi 折磨的经历呈现在眼前,欸,好像可以吧这部分贡献二次离线下来,统一做差分处理。现在,我们的问题转化成了如何去简单地求一段区间 $[l,r]$ 内,给定 $val$ 求 $\sum_{i = l}^{r} [\lvert b_i - x \rvert \mid val]$。很容易我们想到对于每个 $b$ 去预处理出其所有的因子,每次只需要检查因子是否含有 $val$ 即可。但是我们发现处理因子是 $O(n \sqrt(n))$ 的,光预处理就会 TLE!怎么办?感谢机房巨佬 [luochaoqiang](https://www.luogu.com.cn/user/535955)的解答。我们发现,处理每个数会 TLE,但是如果处理值域内的所有数的因数,这样做是 $O(n log{n})$ 级别的。这样我们的时间复杂度就正确了!~~但是常数极大~~需要略微卡常即可通过此题。代码有注释,请放心食用。```cpp
#include <bits/stdc++.h>
#define Blue_Archive return 0
#define con putchar_unlocked(' ')
#define ent putchar_unlocked('\n')
using namespace std;
constexpr int N = 1e6 + 3;
constexpr int V = 1e6;int n;
int m;
int x;
int cnt;
int top;
int a[N];
int b[N];
int r[N];
int ans[N];
int num[N];
int zor[N];
int stk[N];
int sum[N];
int val[N];
int siz[N];
int tmp[N];struct hina 
{int l,r,id,op;
}q[N],L[N << 1];vector<int> vec[N];inline int read()
{int k = 0,f = 1;int c = getchar_unlocked();while(c < '0' || c > '9') c = getchar_unlocked();while(c >= '0' && c <= '9') k = (k << 3) + (k << 1) + (c ^ 48),c = getchar_unlocked();return k * f;
}inline void write(int x)
{if(x < 0) putchar_unlocked('-'),x = -x;if(x > 9) write(x / 10);putchar_unlocked(x % 10 + '0');
}inline int find(int val)
{int l = 1,r = top,mid = 0,res = 0;while(l <= r){mid = (l + r) >> 1;if(stk[mid] <= val) r = mid - 1,res = mid;else l = mid + 1;}return stk[res];
}signed main()
{// freopen("data.in","r",stdin);freopen("data.out","w",stdout);n = read();m = read();x = read();for(int i = 1;i <= V;i ++) // 先算好 vector 的空间,再申请内存可以减小常数(详见 P12525 [Aboi Round 1] 私は雨 ){for(int j = 1;j * i <= V;j ++){siz[i * j] ++;}}for(int i = 1;i <= V;i ++) vec[i].reserve(siz[i]); // 申请内存for(int i = 1;i <= V;i ++) // 预处理{for(int j = 1;j * i <= V;j ++){vec[i * j].emplace_back(i);}}for(int i = 1;i <= n;i ++) a[i] = read();for(int i = 1,tmp;i <= n;i ++){b[i] = read() - x; // 对于 b 数组直接减去 x (通过题意转化可得)if(b[i] < 0) b[i] = -b[i]; // 要判负!!!zor[i] = zor[i - 1] + (!b[i]); // 0 的话一定有贡献,做一个前缀和}for(int i = 1;i <= m;i ++) q[i].l = read(),q[i].id = i; // 离线处理问题for(int i = 1;i <= m;i ++) q[i].r = read(),ans[i] = zor[q[i].r] - zor[q[i].l - 1];sort(q + 1,q + m + 1,[](hina a,hina b){return a.l > b.l;}); // 将左端点从大到小排序for(int i = 1;i <= n;i ++){while(top && a[stk[top]] < a[i]) r[stk[top --]] = i - 1; // 用单调栈求出每个断点的管辖区间(即该值可能作为最大值的区间)stk[++ top] = i;}while(top) r[stk[top --]] = n;for(int i = 1;i <= n;i ++) // 差分,上扫描线{L[++ cnt] = {i,a[i],i,1};L[++ cnt] = {r[i] + 1,a[i],i,-1};}sort(L + 1,L + cnt + 1,[](hina a,hina b){return a.l > b.l;});for(int i = 1,l = n;i <= cnt;i ++){while(L[i].l <= l && l){if(b[l]) for(int v : vec[b[l]]) ++ num[v]; // 用一个桶维护因数出现次数l --;}val[L[i].id] += L[i].op * num[L[i].r];}top = cnt = 0;for(int i = 1,l = n,tot = 0,pos;i <= m;i ++){while(q[i].l <= l && l){while(top && stk[top] <= r[l]) tot -= val[stk[top --]]; // 在其掌控区间内的答案stk[++ top] = l;tot += val[l]; // 做一个后缀和sum[l] = tot;l --;}pos = find(q[i].r); // 二分查找出ans[q[i].id] += tot - sum[pos]; // 查分求答案L[++ cnt] = {pos,a[pos],q[i].id,1}; // 二次离线求剩余区间的贡献L[++ cnt] = {q[i].r + 1,a[pos],q[i].id,-1};}sort(L + 1,L + cnt + 1,[](hina a,hina b){return a.l > b.l;});for(int i = 1,l = n;i <= cnt;i ++){while(L[i].l <= l && l) // 再上一次单调栈,从后往前扫{if(b[l]) for(int v : vec[b[l]]) tmp[v] ++; // 跟上边一样l --;}ans[L[i].id] += L[i].op * tmp[L[i].r];}for(int i = 1;i <= m;i ++) write(ans[i]),con;Blue_Archive;
}

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

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

相关文章

详细介绍:论文阅读 (1) :Control Flow Management in Modern GPUs

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

公众号排版2025年权威推荐:揭秘有一云AI编辑器为何高效?

01|痛点雷区清单:为什么总被“排版”拖慢?层级乱:复制到后台后行距、间距、引用样式全乱,返工 ≥ 2 轮。 版式碎:字体、分隔、留白没节奏,读者滑两屏就流失。 配图难:素材东拼西凑、风格不统一,还担心侵权。 …

P14322 「ALFR Round 11」E 空崎ヒナ 题解

Sorasaki Hina 赛高!P14322 「ALFR Round 11」E 空崎ヒナ 题解 Sorasaki Hina 赛高! 也是做上 BA 的题了!也是写上 BA 的题的题解了!我们 BA 厨的日子真是蒸蒸日上啊! 求审核大大通过 QvQ。求求了! 题目描述:给…

[题解]P7074 [CSP-J 2020] 方格取数

P7074 [CSP-J 2020] 方格取数 如果设 \(f_{i,j}\) 为 \((1,1)\) 到 \((i,j)\) 的最大权值和,上下相邻的两个元素的转移就是双向的了。有后效性,无法 DP。不过题目说“不能重复经过已经走过的方格”,也就是说每一列只…

昨天线下赛的复盘

这次最大的感受:Re做题的时候不要啥都没分析出来就去写代码,不要觉得自己写着写着就能看懂,不可能的,不如先分析好,即使是先猜一下呢,还有就是测试数据不要写0,会和本身就是空的数据混了 Re1 分最少的一题,附件…

10 27

P11833因为我们有 \(a_i < a_{i+1}\) 且 \(b_i < b_{i+1}\) 这里我是想怎么样才能统计两两之间的影响,发现十分复杂并且是 \(O(N^2)\) 的也无法优化 然后我就发现时间限制的深意是否可以说是按照时间顺序从小到…

同余最短路学习报告

笑点解析:高一了终于知道同余最短路是什么了。谁家好人同余最短路真的写最短路啊同余最短路,一种题目类型,隶属于图论板块,一般是问你有 n 个值,重复选取能拼出多少值,或者拼出模 k 余 p 要多少个值等等等等。 对…

打包exe出错了:

打包exe出错了: Traceback (most recent call last): File "huu.py", line 6, in n = int(input(enter:)) RuntimeError: input(): lost sys.stdin 源码: python print(判断一个数是否为素数) print()whi…

19 lambda表达式的简化过程

19 lambda表达式的简化过程Lambda表达式 为什么引入lambda表达式?避免内部类定义过多 去掉无意义代码,只留下核心逻辑函数式接口 定义:任何借口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。 对于函数…

详细介绍:Redis多租户资源隔离方案:基于ACL的权限控制与管理

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

二分查找边界

二分查找边界二分查找边界Q:给定一个长度为𝑛的有序数组nums ,其中可能包含重复元素。请返回数组中最左一个元素target的索引。若数组中不包含该元素,则返回−1 。查找左边界 回忆二分查找插入点的方法,搜索完成…

求解 LCA 的三种方法及其比较

本文写于 2025 年 10 月 24 日。 昨天看到岁岁似今朝以“学不成名誓不还”的勇气学 LCA(树上最近公共祖先),并感叹“LCA 是我最严厉的母亲”,心血来潮,也学了一下。翻看着洛谷玲琅满目的题解,竟学会了三种方法,…

策略模式优化if-else

class Calculator:def __init__(self):self.strategy = Nonedef set_strategy(self, strategy):self.strategy = strategydef calculate_result(self, num1, num2):return self.strategy.execute(num1, num2)class Add…

捐赠

题目 题目描述 有 \(A\)、\(B\) 两类物品。 paper 打算每类各选 \(k\) 个(\(k\) 可自由决定,可取 \(0\))一起捐出。捐赠的总贡献为所选物品的价值总和。 初始时 paper 没有物品,但是 paper 可以通过一些操作改变物…

学习笔记:重链剖分

本文写于 2025 年 9 月 28 日。 前言 这几天一下课,班里的某位同学就走到我座位旁边,念叨着“来学树剖”。在他的 传销 诈骗 怂恿 鼓励之下,我也终于来到了这座大山面前,但发现似乎也并不难…… 何为重链剖分 考虑…

P3232 [HNOI2013] 游走

考虑贪心。 随机游走则显然每条边期望经过次数越大则其编号应越小。 每条边的期望经过次数难以计数,考虑每个店期望经过次数,设计状态 \(f_i\) 表示点 \(i\) 期望经过次数。 转移: \(f_i=\sum_{v\in e_i}f_v\cdot \…

FRP 后端无法获取请求者IP解决方案

FRP 后端无法获取请求者IP解决方案📝 FRP 后端无法获取请求者真实 IP?别慌,解决方案来啦!🧐 问题背景 当你使用 FRP 进行内网穿透或代理服务时,是否遇到过这样的困扰: 后端服务拿到的客户端 IP 全都是 FRP 服…

正睿 2025 NOIP 20连测 Day9

坐在前面的老哥 AK 了。他怎么这么成功,我怎么这么失败/ll。 T1小 W 有 \(n\) 个球,每个球都有一种颜色,其中第 \(i\) 个球初始的颜色可以用正整数 \(a_i\) 来表示,一共有 \(m\) 种颜色。 在一次染色操作中,小 W …

计算几何初步:CCW 与判断两线段的相交性

本文写于 2025 年 9 月 18 日。 前言 昨天在正睿的“IOI 普及联赛”中,有这样一道题,极大地冲击了本蒟蒻的心灵。赛后查看题解,此题竟然涉及计算几何,这更是本蒟蒻从未涉足的领域。我遂查询资料,学习了 CCW 算法以…

如何选择合适的团队共享网盘?坚果云、亿方云等15款产品横向测评

面对市场上琳琅满目的产品,管理者和技术决策者往往在可靠性、性能、安全性与成本之间难以取舍。本篇文章将围绕企业共享网盘,从功能覆盖、同步效率、安全合规、协作体验等维度,深度评测并对比市面上15款主流产品,帮…