YACS 2022年11月月赛 乙组 T1 数对统计 题解
好久没更了,闲话一句,我的初赛成绩只有
首先先考虑暴力算法,枚举两个数,设这两个数为
如果
这种方法可以优化,怎么优化呢?
假如一个序列里出现了好几个
这样我们仅需要把
然后统计最右边的
可以构成多少就是有多少不重复的,数字范围很小,开桶即可
容易证明,这两个构造的数对最多只有一个一样,即
如果
减一即可,然后除以二(
再优化,想到我们只统计
或者第一次出现的右边,这里取最后一次出现的左边(比较方便)
先证明为啥是对的,这样肯定能统计到
答:会在
离线乱搞,把区间排序之后再算,离线
代码:
#include <iostream> #include <algorithm> using namespace std; int n, t, ri; int a[100005], b[100005]; int r[100005], q[100005]; long long ans, pre; int main() { cin >> n; for (int i = 1; i <= n; i ++) { cin >> a[i]; r[a[i] ] = i; } for (int i = 1; i <= 100000; i ++) if (r[i] != 0) q[++ t] = r[i] - 1; sort (q + 1, q + t + 1); for (int i = 1; i <= t; i ++) { while (ri < q[i]) { ri ++; if (b[a[ri] ] == 0) pre ++; b[a[ri] ] ++; } ans += pre; } cout << ans << endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)