hiho_1141
题目
按顺序给出N个数字,求出所有的逆序对个数(逆序对指数字 Ai > Aj且 i < j)
题目链接:hiho_1141
数据规模为 100000,必须使用O(nlogn)的算法来进行求解。下标i从0到N-1,依次求出数字Ai,在A[0, i-1]中比Ai大的数字个数K,将所有的K进行加和即可得到结果。
这种动态的排序+统计,使用treap。
实现
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include<stdio.h> #include<string.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<stack> #include<unordered_map> #include<unordered_set> #include<algorithm> using namespace std; struct Node{ int val; int priority; int count; int sum; Node* childs[2]; Node( int v = 0) :val(v){ priority = rand(); childs[0] = childs[1] = NULL; count = sum = 1; } void Update(){ sum = count; if (childs[0]) sum += childs[0]->sum; if (childs[1]) sum += childs[1]->sum; } }; struct Treap{ Node* root; Treap(){ root = NULL; } void Rotate(Node*& node, bool dir){ Node* ch = node->childs[dir]; node->childs[dir] = ch->childs[!dir]; ch->childs[!dir] = node; node->Update(); node = ch; } void Insert(Node*& node, int val){ if (!node){ node = new Node(val); return ; } if (node->val == val){ node->count++; node->sum++; return ; } else { bool dir = node->val < val; Insert(node->childs[dir], val); if (node->childs[dir]->priority > node->priority){ Rotate(node, dir); } node->Update(); } } int Search(Node* node, int val){ if (!node) return 0; if (node->val == val){ if (node->childs[1]) return node->childs[1]->sum; else return 0; } else if (node->val > val){ return Search(node->childs[0], val) + (node->childs[1]? node->childs[1]->sum + node->count : node->count); } else return Search(node->childs[1], val); } }; int main(){ Treap treap; int N; scanf( "%d" , &N); long long int count = 0; int val; for ( int i = 0; i < N; i++){ scanf( "%d" , &val); count += (treap.Search(treap.root, val)); treap.Insert(treap.root, val); } printf( "%lld\n" , count); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 管理100个小程序-很难吗
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
· 使用这个工具,基于代码仓库直接生成教程文档,感觉比我自己写的还好
· 如何统计不同电话号码的个数?—位图法