P1908 逆序对
输入格式
第一行,一个数 n,表示序列中有 n个数。
第二行 n 个数,表示给定的序列。序列中每个数字不超过 109109。
输出格式
输出序列中逆序对的数目。
依次输入n个数,输入的过程中将树状数组第a[i]加上1,统计比a[i]大的数字的个数的和,依次相加,便是逆序对的个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <iostream> #include <algorithm> using namespace std; #define int long long int n, m, tree[500010], ans, b[500010]; struct A { int w, i; } a[500010]; bool cmp(A a, A b) { //注意当两个数大小相等时,以它们的下标排序 return a.w == b.w ? a.i < b.i : a.w < b.w; } int lowbit( int x) { return x & -x; } void add( int pos, int x) { while (pos <= n) { tree[pos] += x; pos += lowbit(pos); } } int query( int pos) { int ans(0); while (pos > 0) { ans += tree[pos]; pos -= lowbit(pos); } return ans; } signed main() { cin >> n; for ( int i(1); i <= n; ++i) { cin >> a[i].w; a[i].i = i; } //将a排序,并离散化 sort(a + 1, a + 1 + n, cmp); for ( int i(1); i <= n; ++i) { b[a[i].i] = i; }<br> //统计答案<br> for ( int i(1); i <= n; ++i) { add(b[i], 1); ans += query(n) - query(b[i]); } cout << ans; system ( "pause" ); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现