尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

5 qoj14553 序列与整数对 题解

5 qoj14553 序列与整数对 题解
📅 发布时间:2026/6/18 6:06:40

序列与整数对

题面

给定一个长度为 \(n\) 的正整数序列 \(A_1, A_2, \cdots,A_n\) ,有 \(m\) 次询问,每次给定两个正整数 \(x, y\) ,求有多少个整数对 \((i,j)\) 满足 \(1 \le i < j \le n,A_i = x, A_j = y\)。

\(1 \le n, m \le 10^5\)

\(1 \le A_i, x, y \le 10^9\)

题解

这道题用根号分治思想来解决。

先挑出这道题的难点,就是对于每个询问,我们无法快速找到有多少个对应的整数对。

朴素做法:先离散化,然后对每个数记录其出现位置,询问枚举 \(x/y\) 的出现位置,然后再另外一个出现位置中查找,符合条件的解,单次时间复杂度 \(O(n^2)\) ,可以用双指针优化到 \(O(n)\)。总时间复杂度 \(O(nm)\)

我们应用轻重分治思想来解决这道题。

首先我们考虑朴素解法,如果我们不进行处理,那么每次查询是 \(O(n)\) 的。

我们定义 \(B\) 表示一个分界线,如果出现次数 \(\le B\) 那么我们定义其为轻,否则为重。

对每个询问分类讨论:

  • \(x, y\) 两个都为轻

    我们枚举 \(x\) 的出现位置,然后用双指针即可实现 \(O(cnt_x + cnt_y)\),单次时间复杂度 \(O(B)\)

  • \(x, y\) 其中一个为重

    那么如果我们还是枚举,那么最坏就是 \(O(n)\) 的,所以我们将其进行预处理,对于每个出现次数 \(>B\) 的 \(x\)。

    我们预处理出 \(mp1[x][y]\) 表示询问 \((x,y)\) 的答案,\(mp2[x][y]\) 表示询问 \((y,x)\) 的答案。

    对于每个 \(x\),这两个都可以 \(O(n)\) 求,因为每个 \(cnt_x > B\) 所以这样的 \(x\) 的个数不会超过 \(\frac n B\) 个

    预处理时间复杂度 \(O(n \frac n B)\)。

总时间复杂度 \(O(n(B + \frac n B))\)。

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
#include <cmath>using namespace std;typedef long long ll;const int N = 1e5 + 10;int n, m;
int a[N], b[N], cnt;
int sum[N];
map <pair <int, int>, ll> mp1, mp2;
vector <int> pos[N];int main () {// freopen ("test/test.in", "r", stdin);// freopen ("test/test.out", "w", stdout);cin >> n >> m;int B = sqrt (n);for (int i = 1; i <= n; i ++) {cin >> a[i];b[i] = a[i];}sort (b + 1, b + 1 + n);cnt = unique (b + 1, b + 1 + n) - 1 - b;for (int i = 1; i <= n; i ++) {a[i] = lower_bound (b + 1, b + 1 + cnt, a[i]) - b;pos[a[i]].push_back (i);}for (int i = 1; i <= cnt; i ++) {if (pos[i].size () > B) {sum[0] = 0, sum[n + 1] = 0;for (int j = 1; j <= n; j ++) {if (a[j] == i) {sum[j] = sum[j - 1] + 1;} else {sum[j] = sum[j - 1];mp1[{i, a[j]}] += sum[j];}}for (int j = n; j >= 1; j --) {if (a[j] == i) {sum[j] = sum[j + 1] + 1;} else {sum[j] = sum[j + 1];mp2[{i, a[j]}] += sum[j];}}}}for (int i = 1; i <= m; i ++) {int fx, fy, x, y;cin >> fx >> fy;x = lower_bound (b + 1, b + 1 + cnt, fx) - b;y = lower_bound (b + 1, b + 1 + cnt, fy) - b;if (b[x] != fx || b[y] != fy) {cout << 0 <<  endl;continue;}ll ans = 0;if (x == y) {ll cnt = pos[x].size ();ans = cnt * (cnt - 1) / 2;} else if (pos[x].size () <= B && pos[y].size () <= B) {int cnt1 = pos[x].size (), cnt2 = pos[y].size ();int p1 = 0, p2 = 0;for (; p1 < cnt1; p1 ++) {// 保证 y 在 x 右边while (p2 < cnt2 && pos[x][p1] >= pos[y][p2]) p2 ++;ans += cnt2 - p2;}} else {if (pos[x].size () > B) ans = mp1[{x, y}];else ans = mp2[{y, x}];}cout << ans << endl;}return 0;
}

相关新闻

  • 从免疫原性突破到技术迭代:全人源抗体如何重塑靶向治疗格局?
  • 欧几里得算法与扩展欧几里得算法详解
  • 完整教程:flink批处理-时间和窗口

最新新闻

  • 如何对泉州电力负荷数据集进行有效的分析和预测 如何对泉州电力负荷数据集进行有效的分析和预测 深入对泉州电力负荷数据集的分析和建模
  • SSL 免费证书安装(Let‘s Encrypt)
  • 靠谱的上海公司律所怎么选 3个核心判断标准 - 资讯纵览
  • 2026年吉林职称代办选购指南:吉林工程师职称、长春职称申报、建筑职称咨询机构选择指南,服务、流程、合规三维度客观解析 - 海棠依旧大
  • 河北养鹿勾花网厂家实力排行:聚焦专业适配性 - 起跑123
  • VMware虚拟机安装Ubuntu 22.04 LTS全攻略:从配置优化到排错

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号