线段树

https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

逆序对

区间更新+lazy标记
单点更新+无lazy标记

https://www.luogu.com.cn/problem/P3372

区间更新+lazy标记

离散化核心

用有序map存,value值设置成1-n。跟是否有重复元素没有关系,2,2,5,5离散成1,1,2,2

 1 cnt = 1;
 2         s.clear();
 3         memset(t,0,sizeof(t));
 4         for(int i = 0; i < n; i++) {
 5             scanf("%d", &a[i]);
 6             s[a[i]] = 0;
 7         }
 8         for(map<int,int>::iterator it = s.begin(); it != s.end(); it++ ) {
 9             it->second = cnt++;
10         }
11         build(1, 1, cnt-1);
12         ll ans = 0;
13         for(int i = 0; i < n; i++) {
14             ans += query(1, s[a[i]]+1, cnt-1);
15             change(1, s[a[i]]);
16         }
17 ————————————————
18 版权声明:本文为CSDN博主「Aime1007」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
19 原文链接:https://blog.csdn.net/qq_44817002/article/details/107780500
View Code

 

重点:

开数据大小的四倍空间

代码默认根节点是1不是0。

sum根节点1表示1-n的区间和,所有叶子节点表示a数组1-n。

lazy数组表示当前节点变化量。mid-l+1这个长度与之操作即使当前最新值。可以递归下去。

单点更新和区间更新,使用区间更新模板,统一代码。

posted @ 2022-08-20 17:37  剩下的交给时间就好  阅读(3)  评论(0编辑  收藏  举报