线段树
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
重点:
开数据大小的四倍空间
代码默认根节点是1不是0。
sum根节点1表示1-n的区间和,所有叶子节点表示a数组1-n。
lazy数组表示当前节点变化量。mid-l+1这个长度与之操作即使当前最新值。可以递归下去。
单点更新和区间更新,使用区间更新模板,统一代码。