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。
实现
- #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;
- }
hiho_1141的更多相关文章
随机推荐
- C#异步编程简单的运用
当一个方法中有很多复杂的操作的时候就可以使用异步编程. 假如说这一个方法中有很多复杂的操作,把每一个复杂的操作放到一个异步方法中. 原来程序需要这些方法,上一个执行完成之后,才能执行下一个操作. 但是 ...
- 利用AdaBoost元算法提高分类性能
当做重要决定时,大家可能都会吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式. 自举汇聚法(bootstrap aggr ...
- 移动表格行 解决低版本IE fadeIn fadeOut 失效问题
在维护一个内部使用的web工具的时候,需要在表格里配置参数,并且支持参数列的上下移动,有jQuery-UI工具支持对表格列的拖动,但是此处不追求效果,而且旧系统页面兼容性很差,无奈只能做上下移动的按钮 ...
- Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略
在项目中,之前公司是使用IIS 7.0官方的URL重写模块,官方的使用说明请参见官方URLRewrite ,添加伪静态支持,后来经理问我有没有涉及伪静态,我说之前项目中我一直是用Intelligen ...
- java math library
https://github.com/jroyalty/jglm https://github.com/JOML-CI/JOML
- windows服务的创建、安装、调试全过程及引发的后续学习
前几天做项目的时候需要用到window服务,研究一段时间,算是掌握了最基本的使用方法吧,现总结如下: 引言:在项目过程中碰到一个问题:需要不断的扫描一个大型数据库表,并获取dataset,以便做后续的 ...
- 【转】数据库系统异常排查之DMV
数据库系统异常是DBA经常要面临的情景,一名有一定从业经验的DBA,都会有自己一套故障排查的方法和步骤,此文为为大家介绍一下通过系统 性能视图(SQLServer05以上版本)来排查系统异常的基本方法 ...
- 安装vim
命令安装vim sudo apt-get install vim
- 【selenium 3】 Mac 下测试环境搭建 Firefox 47+ gecko driver Mac
错误代码如下:File "/usr/local/lib/python2.7/dist-packages/selenium-3.0.0b2-py2.7.egg/selenium/webdriv ...
- 利用jquery获取html中被选中的input的值
单个按钮 <div id="wrap"> <input type="radio" name="payMethod" val ...