POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
2024-10-19 08:06:13
我用的线段树写的。
num数组表示已插入的数值的个数。
由于a[i]数值很大,但是n不是很大,所以要离散化处理
9 1 0 5 4
离散化后
4 1 0 3 2
这样保证最大值不会超过n
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std; typedef long long ll;
const int MAXN = 543210;
int a[MAXN], mp[MAXN], num[MAXN<<2]; void push_up(int rt)
{
num[rt] = num[rt<<1] + num[rt<<1|1];
} void update(int p, int l, int r, int rt)
{
if(l == r)
{
num[rt]++;
return;
}
int m = (l + r) >> 1;
if(p <= m) update(p, lson);
else update(p, rson);
push_up(rt);
} int query(int L, int R, int l, int r, int rt)
{
if(L <= l && r <= R) return num[rt];
int m = (l + r) >> 1;
int ret = 0;
if(L <= m) ret += query(L, R, lson);
if(R > m) ret += query(L, R, rson);
return ret;
} bool cmp(int A, int B)
{
return a[A] < a[B];
} int main()
{
// freopen("in.txt", "r" ,stdin);
int n;
while(~scanf("%d", &n) && n)
{
for(int i=0; i<n; i++)
{
scanf("%d", &a[i]);
mp[i] = i;
}
//离散化,排序后处理
sort(mp, mp+n, cmp); //离散化排序
for(int i=0; i<n; i++)
a[mp[i]] = i; //离散化处理
ll ans = 0;
memset(num, 0, sizeof(num));
for(int i=0; i<n; i++)
{
ans += query(a[i], n-1, 0, n-1, 1);
update(a[i], 0, n-1, 1);
}
printf("%I64d\n", ans);
}
return 0;
}
最新文章
- crawler4j 学习
- error the @annotation pointcut expression is only supported at Java 5 compliance
- 天气webservices
- Mac系统如何编辑hosts文件
- MySQL版本介绍
- Oracle中创建MD5方法
- 控制Wordpress对搜索引擎的可见性
- 停止某个机房所有机器上包的脚本 pack_idc_stop.py
- 【Hadoop代码笔记】Hadoop作业提交之Child启动reduce任务
- android设置组件所占的比例
- BestR #31
- JSP/Servlet(一)
- linux小白成长之路9————打包部署SpringBoot项目
- 棋盘 chess
- [译文]Domain Driven Design Reference(七)—— 大型战略设计结构
- SkylineGlobe TerraExplorer for Web 7.1.0版本 接口示例
- IntelliJ IDEA 导入Spring源码
- Docker(一)基本概念
- C和C++内存模型
- 读DataSnap源代码(四)
热门文章
- Deepin/Uos系统更新源失败。提示:E: 仓库 “http://packages.chinauos.cn/uos eagle
- 桌面支持qt版本是多少检查
- CentOS下cpu分析 top
- Linux中级之ansible配置(playbook)
- readlink 函数用法 -(转自 JK198310的专栏)
- 8.8-9 fsck、dd
- (数据科学学习手札123)Python+Dash快速web应用开发——部署发布篇
- python操作kafka
- Python+Selenium学习笔记13 - 窗口截图及关闭
- 使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存