C. Goodbye Souvenir

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

① i≤Ri \leq Ri≤R,

② preAi≥Lpre_{A_i} \geq LpreAi​​≥L

③ 时间ttt维度

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

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

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

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

考虑修改操作,对应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],p−pre[p],0},

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

C. Goodbye Souvenir(CDQ 或 树套树)相关推荐

  1. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

  2. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  3. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

  4. #4604. The kth maximum number(整体二分 + 树套树)

    #4604. The kth maximum number 给定一个大小不超过5×1055 \times 10 ^ 55×105的矩形区域,有一些点有点权. 每次询问给定x1,y1,x2,y2,kx_ ...

  5. [树套树] 网络管理

    A:[CTSC2008]网络管理 此题本来是平衡树板块的,但俺写的是树套树,平衡树会多个log 题目 查询第kkk大,天然主席树可以维护 就不用了平衡树二分,多个logloglog了 将树上(u,v) ...

  6. jzoj5699-[GDOI2018day1]涛涛接苹果【树套树】

    正题 题目链接:https://gmoj.net/senior/#main/show/5699 题目大意 一棵树,每个节点有权值,每天所有权值会往它的父节点滑一位,然后有操作会在某一天的某个节点加权值 ...

  7. P2617-Dynamic Rankings【树套树】

    正题 题目链接:https://www.luogu.com.cn/problem/P2617 题目大意 给出一个序列,要求支持 区间查询第kkk大 单点修改 解题思路 区间查询第kkk大需要使用主席树 ...

  8. P3332-[ZJOI2013]K大数查询【树套树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3332 题目大意 开始nnn个可以重复的集合,要求支持操作 1lrc:1\ l\ r\ c:1 l r c:将cc ...

  9. [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】

    题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...

  10. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

最新文章

  1. python中__dict__与dir()区别
  2. 华大 MCU 之七 DMA 导致 SPI 异常停止的原因分析、DMA 配置的那些坑
  3. 物体检测轻松上手:精度与速度实现兼得
  4. ansible+Jenkins+supervisor(Jenkins守护进程)
  5. pyltp环境的搭建
  6. 学一点Git--20分钟git快速上手 [Neil]
  7. atomic一定线程安全吗
  8. Oracle 触发器详解
  9. 计算机组成原理与汇编语言试题,2069电大《计算机组成原理与汇编语言》试题和答案2005...
  10. Java的高并发编程系列(三)
  11. GPS vs DGPS (差分GPS)
  12. 最值得看的电影,一生必看的50部电影,您看过几部影
  13. ARM公司发展历程 - 从1985年至今
  14. java qq聊天界面_【附源码】用Java写了一个类QQ界面聊天小项目,可在线聊天!...
  15. Html控制大华摄像头
  16. android assets大小限制200m,使用 AssetsManager 解决微信小游戏包体积尺寸限制问题
  17. 为什么北京人和上海人都成了“杭漂“?
  18. 日期函数months_between的用法
  19. 更换头像功能(前端)
  20. Compound学习(一) README.md

热门文章

  1. mysql 添加用户_mysql创建用户与授权
  2. vscode搜索文件_VS Code 新图标来临 —— 侧边栏、文件管理器、搜索、调试等区域的图标迎来全新设计...
  3. 送什么给女朋友最致命?
  4. 数学界最恐怖的存在,学过数学的人,一辈子都不会忘记!
  5. 数学知识点大集合!有了它学数学真的很简单!
  6. 撤回的微信消息真的看不到?78行Python代码帮你看穿一切!
  7. 鉴别一个人是否 js 入门的标准竟然是?!
  8. ios把数据传递到另一个页面_iOS 委托 页面之间传递数值
  9. linux创建备用管理员,sql server 创建备用管理员和只读用户
  10. 计算机bq,BQ24721部分翻译