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的更多相关文章
随机推荐
- 【后台测试】Linux下小试jmeter
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5784288.html 前言 上一篇主要讲了在Window ...
- frameset
- iScroll.js和swiper.js
最近系统地学习了iScroll.js和swiper.js,感觉它们在移动端特别好用:http://www.360doc.com/content/14/0724/11/16276861_39669990 ...
- LeetCode Remove Duplicate Letters
原题链接在这里:https://leetcode.com/problems/remove-duplicate-letters/ 题目: Given a string which contains on ...
- 开发不改bug?给你支个招
在测试过程中,不免会遇到开发人员因为一些原因不想修改个别bug的情况.那一般遇到这种问题时,我们该如何去推进开发修改bug呢? 我们先来分析下到底会有哪些原因会导致开发不修改bug 1. 开发与测试对 ...
- SEO之HTML优化:让你的网站HTML代码更符合SEO规范
摘要HTML优化是网站内部优化的重点,可能对SEO新手来说,容易忽略.符合搜索引擎习惯的HTML代码是极利于SEO的,可以让你的网站获得更好的搜索引擎排名.如何制作一个标准的HTML网页,如何做HTM ...
- HTML两张图片叠加问题的进一步修改
要想两张图片叠加,只需在circle添加一个Position:absolute就OK了 以上几步,很多大侠前辈都已经说过,相信不用再啰嗦,我想说的是一种扩展,将示例放到右边,可能因为我悟性低,研究了一 ...
- First insmod a module
不得不说网上坑爹的文章比虱子还多,参考这位仁兄调试成功 喜欢C的人却靠着Java产业吃饭,人艰不拆... 对于未知的东西,有个习惯,run success first,then research en ...
- Timer的用法
目的实现一个间隔轮询执行的功能. 从网上看到java中可以使用Timer,于是本篇文件就对自己的使用记录,进行一次记录. 主函数: package cn.test.timer; import java ...
- .net下的跨域问题
环境: IIS7.0 MVC 4.0 公司官网 asp.net 需要的报名系统,需要有后台管理 由于是配合传统产业,所以MVC系统的数据,是由AIPS系统提供. (制作前是考虑去年用 ...