我在博客修文物

news/2025/10/27 21:54:39/文章来源:https://www.cnblogs.com/S-Keep-Kiding/p/19170268
## P14322 「ALFR Round 11」E 空崎ヒナ 题解**Sorasaki Hina 赛高!**  题目描述:给出若干次询问,每次询问给出 $[l,r]$,求:   
$$\sum_{i = l}^{r} [b_i \equiv x\pmod {\displaystyle\max_{l\le j\le i}a_j}]$$很容易我们可以将题意转化为求: 
$$\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]$ 这一个区间。  
也就是从**右端点指针的开头**到**最大值小于左端点指针暴力遍历的最大值**的这个区间。如果还是不理解的话,可以画个图来理解一下。如下图所示,其中黑色的竖线是右端点遍历的起点,竖线右边的红线是右端点指针遍历中求的最大值。  
竖线左边的黑线是左端点指针暴力遍历的最大值。  
竖线右边的红线是对答案贡献有误的区间(因为该区间内的 $max_{a_i}$ 在统计时是错误的)。  ![](https://cdn.luogu.com.cn/upload/image_hosting/wd1n5d97.png)然后我们考虑怎么去除这部分错误贡献。首先,考虑到这种贡献有且仅有当左端点左移时产生,但是如果左端点右移,我们将无法处理新的贡献。  
所以扩展刚才我们的思想,直接上扫描线(~~其实是因为回滚莫队时间复杂度不正确~~)。考虑直接将左端点从大到小排序。每次将左端点加上即可。  
然后每次二分地查出其错误贡献的区间,然后修正这部分去权值即可。  
对于像上图竖线之后的贡献,我们可以直接从左到右遍历一遍即可。  但是这样又有一个问题,如果我们询问的右端点在错误的区间之中,那么我们将无法处理。这时候我们发现,欸,好像可以吧这部分贡献二次离线下来,统一做差分处理。  现在,我们的问题转化成了如何去简单地求一段区间 $[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/948117.shtml

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

相关文章

CSP-S模拟40

前言: 谢谢 养鸡大户 帮我调 \(T1\) 的代码。 谢谢 小青蛙 给我讲解 \(T2\) 。 T1:公约数神庙(gcd) 思路: 其实大体思路不是很难,但是特判的情况真的好多啊。能在赛时水水的大数据下想到所有特判情况的大佬真的存…

CF1608F MEX counting 题解

\(\text{CF1608F MEX counting 题解}\) 求方案数显然是考虑 dp。考虑每次填一个数时 MEX 的变化:显然不降,但增幅不确定。我们并没有办法通过状压等技巧维护各个数的取值,考虑在 MEX 变化的时候维护每次大于当前 ME…

[题解]P7914 [CSP-S 2021] 括号序列

P7914 [CSP-S 2021] 括号序列 学习了 题解 P7914 【[CSP-S 2021] 括号序列】 - enucai 后进行记录。感谢原作者~下文用 \(K\) 表示输入的 \(k\)。 考虑区间 DP。 定义 \(f_{i,j,k\in\{0,1,2,3,4,5\}}\) 为区间 \([i,j…

Windows11安装miniconda

Windows11安装miniconda1. 下载地址https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda操作系统和芯片架构 文件MacOS Intel Chip Miniconda3-latest-MacOSX-x86_64.shMacOS Apple Silicon Miniconda3-latest-M…

【中份薯条】雷柏MT760鼠标上手改装

🍟现在登场的是 Master3 的异父异母亲兄弟 雷柏MT760 改装笔记。兄弟,你也要来点薯条吗?这里有中份的🍟 前言之前买的罗技 G502无线版 和 MX ERGO 在我的高强度使用下,都是先坏微动再坏外壳,罗技发挥相当稳定�…

102302116 田自豪 作业1

作业1 1)用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。 代码与运行结果点击查看代码 import requests from bs4 imp…

实验二:现代C++编程初体验

T.h#pragma once #include <string> // 类T: 声明 class T {// 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T& t); // 复制构造函数T(T&& t); // 移动构造函数~T(); /…

公众号排版神器:2025年最新顶级AI排版软件索引指南

导语:公众号排版设计总是耗时耗力,容易出错,有什么高效工具能解决这个问题? 公众号运营者常面临排版慢、样式不统一、平台合规风险等痛点。例如,一篇千字文章手动排版需1-2小时,稍不留神可能触发违规词,导致被平…

第四篇:docker底层原理

第四篇:docker底层原理chroot技术(容器底层使用了chroot技术) chroot是一种通过改变进程的根目录来创建隔离文件系统环境的技术ldd命令用于显示二进制可执行文件或共享库所依赖的所有动态链接库# 1.创建工作目录 [r…

【中份薯条】雷柏MT760上手改装

兄弟,你也要来点薯条吗?这里有中份的🍟 前言之前买的罗技 G502无线版 和 MX ERGO 在我的高强度使用下,都是先坏微动再坏外壳,罗技发挥相当稳定🤤 那么接替 G502 的是: Master3 的异父异母亲兄弟 雷柏 MT760�…

软件测试和DevOps的关系

软件测试是 DevOps 成功实践的基石和保障,而 DevOps 为软件测试带来了革命性的挑战和机遇。它们不是对立的关系,而是深度融合、相互依赖的共生关系。你可以把测试看作是贯穿 DevOps 流水线的“质量守护神”。下面我们…

PyPDF无限循环漏洞CVE-2025-62707技术分析

本文详细分析了PyPDF库中的CVE-2025-62707安全漏洞,该漏洞在处理缺少EOF标记的DCT内联图像时会导致无限循环。文章包含漏洞描述、影响版本、解决方案和CVSS评分等技术细节,帮助开发者理解和防范此类安全问题。CVE-20…

重组蛋白技术概述

重组蛋白技术概述重组蛋白是通过基因工程技术在体外表达的蛋白质分子。该技术将目标基因序列导入表达载体,转化至宿主细胞中,利用细胞的转录翻译机制合成蛋白质。重组蛋白技术在生命科学研究中已成为不可或缺的工具,…

题解:luogu P4948 数列求和

题解:luogu P4948 数列求和 要求: \[\sum_{i = 1}^{n}{i^k a^i} \]其中 \(n \leq 10^{18},k \leq 2000\) 这种 \(k\) 次方但是 \(k\) 特别小的一般都是将 \(i^k\) 通过斯特林数展开。 由: \[x^n=\sum_{i = 0}^{n}{i…

关于springboot+Servlet报错404的问题

假如遇到使用springboot+Servlet的方式进行开发或者学习(一般是作业),其中有个经常遇到的问题是访问不到,会报404的错误,资源未加载; 网上有很多解决方法,例如加ServletComponentScan()包扫描路径,但是我帮一…

10.27 CSP-S模拟40 改题记录

爆零场HZOJ 写在前面 没想到离CSP还有4天然后创造了一次保龄的经历。。。然后就是读假题专场。其实感觉没有太难但是。。。好吧,碍于时间不多,也不说废话了。A. 公约数神庙 我无言。我以为我败在了空间,结果其实是败…

Codechef Painting Tree 题解 [ 蓝 ] [ 树形 DP ] [ 概率期望 ] [ 分类讨论 ]

Painting Tree 若干个月前模拟赛切的题,当时写了 3h+,被细节恶心坏了,遂记之。 题意可以转化为求树上存在相交链的期望时间。 考虑如何计算这个期望。显然我们可以枚举选取链的个数,根据期望的定义式来算: \[E(X)…

Linux运行命令三种方式对比

三种方式临时测试 → nohup 稳定运行 → supervisor 系统级守护 → systemd测试用例/data/test.sh #!/bin/bash # /data/test.sh - Linux 简单输出时间的 demo 脚本while true doecho "$(date +%Y-%m-%d %H:%M:%S…

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

P14322 「ALFR Round 11」E 空崎ヒナ 题解 (markdown)## P14322 「ALFR Round 11」E 空崎ヒナ 题解**Sorasaki Hina 赛高!**也是做上 BA 的题了!也是写上 BA 的题的题解了!我们 BA 厨的日子真是蒸蒸日上啊!求审核大…

详细介绍:论文阅读 (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", …