当前位置: 首页 > news >正文

CF848C Goodbye Souvenir 题解(CDQ分治)

考虑到可以将每个数最后一次出现与第一次出现的位置之差拆成若干个相邻位置之差:

\[last_i - first_i = \sum i-pre_i \]

且每次修改一个点,对 \(pre\) 的影响是 \(O(1)\) 的,所以我们可以将所求的答案转为一个(带权的)二维偏序:

\[\sum_{l \le pre_i, i\le r} i - pre_i \]

将时间维加上,差分将这个“四维偏序”转为三维偏序:在每一个点出现时,添加一个贡献为 \(+v\) 的点,删除时,添加一个贡献为 \(-v\) 的点。

最后,用 CDQ 分治做三维偏序即可。复杂度 \(O(n\log ^2 n)\)

const int MAXN = 1e5 + 5;
int n, m, a[MAXN], pre[MAXN], ans[MAXN], cnt;
struct _point {int type;int x, y, v, id;
};
vector<_point> points;
set<int> st[MAXN];
struct _bit {int tr[MAXN];int lowbit(int x) { return x & (-x); };void modify(int x, int v) {while (x <= n) {tr[x] += v;x += lowbit(x);}}int query(int x) {int ret = 0;while (x) {ret += tr[x];x -= lowbit(x);}return ret;}
} t;void solve(int l, int r) {if (l == r) return;solve(l, mid); solve(mid + 1, r);vector<_point> v;for (int i = l; i <= mid; ++i) {if (points[i].type == 1) v.push_back(points[i]);}for (int i = mid + 1; i <= r; ++i) {if (points[i].type == 2) v.push_back(points[i]);}sort(v.begin(), v.end(), [](_point x, _point y) {if (x.y == y.y) return x.type < y.type;return x.y < y.y;});for (auto p:v) {if (p.type == 1) {t.modify(p.x, p.v);} else {ans[p.id] += t.query(n) - t.query(p.x - 1);}}for (auto p:v) {if (p.type == 1) {t.modify(p.x, -p.v);}}assert(t.query(n) == 0);
}void work() {cin >> n >> m;for (int i = 1; i <= n; ++i)cin >> a[i];for (int i = 1; i <= n; ++i) {if (pre[a[i]]) points.push_back({1, pre[a[i]], i, i - pre[a[i]]});pre[a[i]] = i;st[a[i]].insert(i);}for (int i = 1; i <= m; ++i) {int op; cin >> op;if (op == 1) {int p, x; cin >> p >> x;if (a[p] == x) continue;auto it = st[a[p]].find(p);if (next(it) != st[a[p]].end()) {auto nxt = next(it);points.push_back({1, p, *nxt, p - *nxt});if (it != st[a[p]].begin()) {auto lst = prev(it);points.push_back({1, *lst, *nxt, *nxt - *lst});}}if (it != st[a[p]].begin()) {auto lst = prev(it);points.push_back({1, *lst, p, *lst - p});}st[a[p]].erase(it);it = st[x].lower_bound(p);if (it != st[x].begin() && it != st[x].end()) {auto lst = prev(it);points.push_back({1, *lst, *it, *lst - *it});}if (it != st[x].begin()) {auto lst = prev(it);points.push_back({1, *lst, p, p - *lst});}if (it != st[x].end()) {points.push_back({1, p, *it, *it - p});}st[x].insert(p);a[p] = x;} else {int l, r; cin >> l >> r;points.push_back({2, l, r, 0, ++cnt});}}int N = points.size();solve(0, N - 1);for (int i = 1; i <= cnt; ++i)cout << ans[i] << endl;
}
http://www.hskmm.com/?act=detail&tid=28478

相关文章:

  • 2025 年汽车刹车卡钳厂家最新推荐榜单:原厂适配 / 高性能 / 新能源专用等多类型产品深度解析及选购指南分体锻造/大轮毂/高性能/新能源汽车刹车卡钳厂家推荐
  • 2025年开发者必看:本土化代码管理平台Gitee如何助力中国开发者高效协作
  • 2025 年消防设施检测 / 电气防火检测 / 防雷装置检测 / 消防维保 / 环境检测服务公司推荐:北京市通雷防雷装置安全检测有限公司提供专业技术支持
  • 直播app开发,如何快速获取系统时间? - 云豹科技
  • 2025 年泡棉厂家最新推荐榜:全方位解析 EPE 泡棉 / EVA 泡棉 / 珍珠棉泡棉 / 泡棉内衬优质企业,助采购商精准选对品牌
  • C. awoos Favorite Problem
  • Outlook邮箱大附件邮件是什么?
  • 2025 年过滤机厂家最新推荐排行榜:胶带式 / 盘式真空 / 脱水 / 带式真空 / 水平带式过滤机企业权威选购指南
  • 国产代码管理平台Gitee:破解企业级Git自建难题的密钥
  • 2025 年蜂巢/高强/HDPE/PET/高分子/塑料/插接/土工格室厂家口碑推荐榜:聚焦品质与服务,助力工程选材更高效
  • 基于K近邻(KNN)算法在MATLAB中实现人脸识别
  • 2025 年最新推荐灭火器维修公司榜单:覆盖干粉 / 水基 / 二氧化碳 / 七氟丙烷 / 锂电池灭火器维修,帮您选到专业可靠服务单位
  • Vue大屏可视化自适应(等比列缩放)方案✔️✔️✔️✨
  • VonaJS AOP编程:全局中间件全攻略
  • 单调队列 (1) - 详解
  • 2025 年 密度 / 净化 / 零醛添加 / 装修 / 生态板 / 指接板板材厂家推荐:纯品梅花深耕高端定制,打造健康家居板材优质选择
  • 深入解析:考研复习-线性代数-第二章-矩阵
  • PHP 与 HTML 混写基础
  • 2025 年隧道/车丝/打孔/矿用/R780/钢花钢管厂家推荐榜:精准匹配施工需求,优选可靠供应商
  • 2025 年最新推荐!空压机租赁公司综合实力榜单:涵盖无油 / 高压 / 阿特拉斯等机型及二手买卖置换回收,助力企业精准选靠谱服务商
  • 小波神经网络(WNN)预测代码
  • 2025 年报警器厂家最新推荐权威榜单:海湾 / 青鸟 / 利达等品牌全覆盖,详解优质服务商助力安全选购NB烟感/松江烟感/三江烟感/燃气报警器厂家推荐
  • 优秀的研发经理,如何布局一周的工作?
  • Numerical Heat Transfer and Fluid Flow(《传热与流体流动的数值计算》)
  • 2025天文台圆顶加工厂家最新推荐榜:专业工艺与品质保障之选
  • 2025风机盘管厂家实力推荐:技术领先与品质保障的行业标杆
  • 2025蒸发式冷气机厂家TOP5推荐:节能降温与耐用品质深度
  • 2025 电缆绝缘材料生产厂家最新推荐榜单:技术实力型企业揭晓,选购指南同步发布
  • 基于Java+Springboot+Vue开发的体育场馆预约管理系统源码+运行步骤
  • Linux 终端查看最消耗 CPU 内存的进程