C. Goodbye Souvenir(CDQ 或 树套树)

C. Goodbye Souvenir

∑i=LRi−preAi[preAi≥L]\sum\limits_{i = L} ^{R} i - pre_{A_i} [pre_{A_i} \geq L]i=LRipreAi[preAiL],进一步考虑即∑i−preAi[i≤R,preAi≥L]\sum i - pre_{A_i}[i \leq R, pre_{A_i} \geq L]ipreAi[iR,preAiL],

i≤Ri \leq RiR

preAi≥Lpre_{A_i} \geq LpreAiL

③ 时间ttt维度

由此这个问题被转化为了一个标准的三维偏序问题,第一维为时间ttt,第二维为iii,第三维为preAipre_{A_i}preAi,在第三维中动态插入i−preAii - pre_{A_i}ipreAi的值。

因此考虑如下一个结构体:

struct {int op, x, y, f, id;
};

依次为:存放操作种类,存放iii,存放preAipre_{A_i}preAi,存放i−preAii - pre_{A_i}ipreAi,存放对第几个询问贡献答案。

考虑修改操作,对应pre[p],p,next[p]pre[p], p, next[p]pre[p],p,next[p],我们修改的是ppp节点的信息,也就是这个节点不复存在了,

所以显然加入操作{1,p,pre[p],pre[p]−p,0}\{1, p, pre[p], pre[p] - p, 0\}{1,p,pre[p],pre[p]p,0},也就是减去之前存在的{1,p,pre[p],p−pre[p],0}\{1, p, pre[p], p - pre[p], 0\}{1,p,pre[p],ppre[p],0}

考虑其对后继的影响,显然也要减去之前存在的后继信息,也就是加入{1,next[p],p,p−next[p],0}\{1, next[p], p, p - next[p], 0\}{1,next[p],p,pnext[p],0}

然后加上修改后其后继的值{1,next[p],pre[p],next[p]−pre[p],0}\{1, next[p], pre[p], next[p] - pre[p], 0\}{1,next[p],pre[p],next[p]pre[p],0}

同样的对于修改后,也就是插入了一个新的值,我们也要先删去当前加入的点的后继,然后再加入当前点,以及后继的最新信息。

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int a[N], pre[N], n, m, top;ll ans[N], tree[N];set<int> st[N];struct Res {int op, x, y, f, id;
}Q[7 * N];bool cmpx(Res a, Res b) {return a.x < b.x;
}bool cmpid(Res a, Res b) {return a.id < b.id;
}inline int lowbit(int x) {return x & (-x);
}void clear(int x) {while (x) {tree[x] = 0;x -= lowbit(x);}
}void update(int x, int v) {while (x) {tree[x] += v;x -= lowbit(x);}
}ll query(int x) {ll res = 0;while (x <= n) {res += tree[x];x += lowbit(x);}return res;
}void CDQ(int l, int r) {if (l == r) {return ;}int mid = l + r >> 1;CDQ(l, mid), CDQ(mid + 1, r);for (int i = l, j = mid + 1; j <= r; j++) {while (i <= mid && Q[i].x <= Q[j].x) {if (Q[i].op & 1) {update(Q[i].y, Q[i].f);}i++;}if (Q[j].op == 2) {ans[Q[j].id] += query(Q[j].y);}}for (int i = l; i <= mid; i++) {clear(Q[i].y);}sort(Q + l, Q + r + 1, cmpx);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {st[i].insert(0);}for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);pre[i] = *--st[a[i]].end();st[a[i]].insert(i);Q[++top] = {1, i, pre[i], i - pre[i], 0};}for (int i = 1, op, x, y; i <= m; i++) {scanf("%d %d %d", &op, &x, &y);if (op & 1) {auto it = st[a[x]].lower_bound(x);Q[++top] = {1, x, pre[x], pre[x] - x, 0};it++;if (it != st[a[x]].end()) {Q[++top] = {1, *it, pre[*it], pre[*it] - *it, 0};pre[*it] = pre[x];Q[++top] = {1, *it, pre[*it], *it - pre[*it], 0};}st[a[x]].erase(x);a[x] = y;st[a[x]].insert(x);it = st[a[x]].lower_bound(x);it--;pre[x] = *it;Q[++top] = {1, x, pre[x], x - pre[x], 0};++it, ++it;if (it != st[a[x]].end()) {Q[++top] = {1, *it, pre[*it], pre[*it] - *it, 0};pre[*it] = x;Q[++top] = {1, *it, pre[*it], *it - pre[*it], 0};}}else {Q[++top] = {op, y, x, 0, i};}}CDQ(1, top);sort(Q + 1, Q + 1 + top, cmpid);for (int i = 1; i <= top; i++) {if (Q[i].op == 2) {printf("%lld\n", ans[Q[i].id]);}}return 0;
}

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

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

相关文章

.NET Core 微信小程序支付——(统一下单)

最近公司研发了几个电商小程序&#xff0c;还有一个核心的电商直播&#xff0c;只要是电商一般都会涉及到交易信息&#xff0c;离不开支付系统&#xff0c;这里我们统一实现小程序的支付流程&#xff08;与服务号实现步骤一样&#xff09;。目录1、开通小程序的支付能力2、商户…

P4768 [NOI2018] 归程(kruskal 重构树)

P4768 [NOI2018] 归程 给定一个nnn个点&#xff0c;mmm条边的无向联通图&#xff0c;边的描述为[u,v,l,a][u, v, l, a][u,v,l,a]&#xff0c;表示uuu&#xff0c;vvv连有一条长度为lll&#xff0c;海拔为aaa的边&#xff0c; 有QQQ个询问&#xff0c;每次给出一个出发点uuu和…

用.NET写“算命”程序

前言“算命”&#xff0c;是一种迷信&#xff0c;我父亲那一辈却执迷不悟&#xff0c;有时深陷其中&#xff0c;有时为求一“上上签”&#xff0c;甚至不惜重金&#xff0c;向“天神”保佑。我曾看到过有些算命网站&#xff0c;可以根据人的生辰八字&#xff0c;来求得这个人一…

Java线程调度

线程调度指的是系统为线程分配CPU使用权的方式。主要有协同式线程调度和抢占式线程调度。 协同式线程调度&#xff08;Cooperative Threads-Scheduling&#xff09; 在多线程系统中&#xff0c;线程的执行时间由线程自身控制&#xff0c;执行结束后要主动通知系统切换到另一线…

#3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)

#3551. [ONTAK2010]Peaks加强版 我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么。 考虑按照边权升序&#xff0c;建议kruskalkruskalkruskal重构树&#xff0c;然后倍增向上跳&#xff0c;找到困难值小于等于xxx的深度最小的节点uuu&#…

ASP.NET Core 3.0 迁移避坑指南

一.前言.NET Core 3.0将会在 .NET Conf 大会上正式发布&#xff0c;截止今日发布了9个预览版&#xff0c;改动也是不少&#xff0c;由于没有持续关注&#xff0c;今天将前面开源的动态WebApi项目迁移到.NET Core 3.0还花了不少时间踩坑&#xff0c;给大家分享一下我在迁移过程中…

kruskal 重构树(讲解 + 例题)

kruskal重构树 如何建树 模仿kruskalkruskalkruskal&#xff0c;先将所有边排序。 依次遍历每一条边&#xff0c;如果这条边的两个节点&#xff08;u,vu, vu,v&#xff09;不在同一个连通块里面&#xff0c; 则新建一个nodenodenode节点&#xff0c;更新fa[u]fa[v]nodefa[u…

打不死我的,终将使我强大!DevOps黑客马拉松参赛心得

&#xff08;IDCF DevOps黑客马拉松到底是个啥活动&#xff1f;&#xff09;长得丑活得久、长得帅也惹人爱&#xff01;大家好&#xff0c;我是刘威。隆正信息的业务架构师-花名逸云。非常荣幸可以参加在北京举办的第一届DevOps黑客马拉松比赛。黑客马拉松不是突然冒出来的&…

Java线程池面试题

1、什么是线程池 java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服…

F. Cheap Robot(kruskal 重构树)

F. Cheap Robot 给定一个无向连通图&#xff0c;每条边有边权&#xff0c;路过需要消耗对应的电量&#xff08;边权&#xff09;&#xff0c;有kkk个中心点&#xff0c; 问从a−>ba-> ba−>b&#xff0c;我们最少需要带多少电&#xff0c;设最小为CCC&#xff0c;当…

「标签管理」使用标签管理有道云笔记资料

因着大家对文件标签化比较高难道&#xff0c;需要熟悉一个标签工具软件&#xff0c;所以今天暂时来介绍个简单一些的网络资料的标签化管理&#xff0c;使用有道云笔记作为落地工具&#xff0c;同理在OneNote、印象笔记上原理类似。有道云笔记免费功能够用为了选择哪个笔记产品&…

JDK线程池实现

参见&#xff1a; https://www.cnblogs.com/trust-freedom/p/6594270.html http://ifeve.com/java-threadpool/ https://blog.csdn.net/u010963948/article/details/80573898 https://blog.csdn.net/moakun/article/details/80606029 https://www.cnblogs.com/liuzhihu/p/81773…

Problem G. Pandaria(线段树合并 + Kruskal 重构树)

Problem G. Pandaria 给定一个有nnn条边的无向连通图&#xff0c;每条边有对应的边权&#xff0c;每个点有一个颜色&#xff0c; 问从一个点出发&#xff0c;经过不超过www的边权&#xff0c;所能到达的点中&#xff0c;颜色出现次数做多且颜色编号最小的是什么颜色。 不超过…

我如何吸引Elastic创始人一起对高并发写入进行优化?

导语&#xff1a;在腾讯金融科技数据应用部的全民 BI 项目里&#xff0c;我们每天面对超过 10 亿级的数据写入&#xff0c;提高 ES 写入性能迫在眉睫&#xff0c;在最近的一次优化中&#xff0c;有幸参与到了 Elasticsearch 开源社区中。背景为了更便捷地分析数据&#xff0c;腾…

Java线程安全

Java 线程安全 什么是线程安全&#xff1f; 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 一&#xff1a;基本概念 共享资源&#xff1a;能够被多个线程同时访问的资源竞态条件&#xff1a;当两个线程竞争统…

P4899 [IOI2018] werewolf 狼人(kruskal 重构树 + 主席树)

P4899 [IOI2018] werewolf 狼人 给定一个有nnn个点mmm条边的无向图&#xff0c;有QQQ个询问 每次输入S,E,L,RS, E, L, RS,E,L,R&#xff0c;表示你在SSS点出发&#xff0c;要到EEE点&#xff0c;且初始时你是人形态&#xff0c;你只能走[L,n][L, n][L,n]的点&#xff0c; 但…

微软+开源,那些亲爱的以及热爱的

微软 Reactor 社区空间开幕式暨 Azure Meetup 社区活动已于9月7日在上海圆满结束&#xff01;但是…如何构建一个可持续发展的社区未来的路&#xff0c;仍然很长...你应该知道的微软 Reactor微软 Reactor 是微软为构建开发者社区而提供的一个社区空间&#xff0c;以“予力多元…

Java线程问题问答

1、多线程的作用&#xff1f; 发挥多核CPU的优势&#xff0c;提高效率防止阻塞便于建模&#xff1a;将一个任务拆分成多个子任务&#xff0c;分别建立程序模型 2&#xff1a;平时项目中使用锁和synchronized比较多&#xff0c;而很少使用volatile&#xff0c;难道就没有保证可见…

ASP.NET Core 2.2 项目升级至 3.0 备忘录

.NET Core 3.0及ASP.NET Core 3.0 前瞻ASP.NET Core 3.0 迁移避坑指南将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中。TargetFramework 改为 netcoreapp3.0 <TargetFramework>netcoreapp3.0</TargetFramework>从 Web 项目&#xff…

Java 死锁

目录&#xff1a; 什么是死锁&#xff1f;死锁是怎么产生的&#xff1f;怎么排查死锁&#xff1f;死锁的预防拓展&#xff1a;Java CPU 100%排查 一 什么是死锁&#xff1f; 注&#xff1a;线程和进程都可能会产生死锁&#xff0c;以下以线程为例 死锁是指两个或两个以上的…