题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180

解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组。因为这题中的数列有重复的而且范围特别大,所以要进行离散化,离散化的方法是,

首先按照输入的数字排个序,然后把整个数列扫一遍,得出每个数字离散化的结果,然后再按照输入的顺序把顺序调整回来就OK 了。线段树部分就不说了。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 INT;
const int maxn = +; struct node
{
int data,cixu,dd;
}que[maxn]; struct Node
{
INT data;
int l,r;
}tree[*maxn]; bool cmp1(node a,node b)
{
return a.data <= b.data;
}
bool cmp2(node a,node b)
{
return a.cixu < b.cixu;
}
void maketree(int p)
{
if(tree[p].l == tree[p].r)
return ;
int mid = (tree[p].l + tree[p].r) / ;
tree[*p].data = ;
tree[*p].l = tree[p].l;
tree[*p].r = mid;
maketree(*p);
tree[*p+].data = ;
tree[*p+].l = mid + ;
tree[*p+].r = tree[p].r;
maketree(*p+);
}
INT find(int p,int l,int r)
{
if(l > r)
return ;
if(tree[p].l == l && tree[p].r == r)
return tree[p].data;
int mid = (tree[p].l + tree[p].r) / ;
if(r <= mid)
return find(*p,l,r);
else if(l <= mid && r > mid)
return find(*p,l,mid) + find(*p+,mid + ,r);
else return find(*p+,l,r);
}
void push(int p,int d)
{
tree[p].data++;
if(tree[p].l == tree[p].r)
return ;
int mid = (tree[p].l + tree[p].r) / ;
if(d <= mid)
push(*p,d);
else push(*p+,d);
}
int main()
{
int n;
scanf("%d",&n);
for(int i = ;i <= n;++i)
{
scanf("%d",&que[i].data);
que[i].cixu = i;
}
sort(que+,que+n+,cmp1);
int f = -;
que[].data = 0x7fffffff; //只要一个跟所有输入的数都不同的就行了
for(int i = ;i <= n;++i)
{
if(que[i].data != que[i-].data)
f++;
que[i].dd = f;
}
tree[].data = ;
tree[].l = ;
tree[].r = f;
maketree();
sort(que+,que+n+,cmp2);
INT tot = ;
for(int i = ;i <= n;++i)
{
tot += find(,que[i].dd + ,f);
push(,que[i].dd);
}
printf("%I64d\n",tot);
return ;
}

SGU 180 Inversions(离散化 + 线段树求逆序对)的更多相关文章

  1. 4163 hzwer与逆序对 (codevs + 权值线段树 + 求逆序对)

    题目链接:http://codevs.cn/problem/4163/ 题目:

  2. BNU 2418 Ultra-QuickSort (线段树求逆序对)

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...

  3. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

  4. hdu1394(线段树求逆序对)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 线段树功能:update:单点增减 query:区间求和 分析:如果是0到n-1的排列,那么如果 ...

  5. poj2299 Ultra-QuickSort(线段树求逆序对)

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...

  6. hdu 6318 Swaps and Inversions (线段树求逆序对数)

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. FZU2018级算法第五次作业 m_sort(归并排序或线段树求逆序对)

    首先对某人在未经冰少允许情况下登录冰少账号原模原样复制其代码并且直接提交的赤裸裸剽窃行为,并且最终被评为优秀作业提出抗议! 题目大意: 给一个数组含n个数(1<=n<=5e5),求使用冒泡 ...

  8. HDU 1394 线段树求逆序对

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  9. POJ 2188线段树求逆序对

    题目给的输入是大坑,算法倒是很简单-- 输入的是绳子的编号wire ID,而不是上(或下)挂钩对应下(或上)挂钩的编号. 所以要转换编号,转换成挂钩的顺序,然后再求逆序数. 知道了这个以后直接乱搞就可 ...

随机推荐

  1. Fiddler工具的基本功能

    Fiddler是一款用于网页数据分析,抓取的工具,里面集成了对网页强大的功能外,还可以通过设置,使其对手机的数据也可以进行抓取 Fiddler的原理是: 通过在客户端和服务器之间创建一个代理服务器来对 ...

  2. [USACO2005][POJ2454]Jersey Politics(随机化)

    题目:http://poj.org/problem?id=2454 题意:给你3*k(k<=60)个数,你要将它们分成3个长度为k的序列,使得其中至少有两个序列的和大于k*500 分析:以为有高 ...

  3. 每天一个linux命令(12):head 命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  4. Servlet学习 (HttpServletRequest HttpServletResponse)

    1.什么事servlet? 答:服务器端程序, 自定义的服务类型.tomcat是一个容器,这个容器提供各种菜的服务, 我们需要为里面放菜! web服务器就是我们的开发环境和开发基础. 实现了servl ...

  5. MVC4学习笔记(一)

    1.查询 1)Controllers /// <summary> /// 数据上下文对象 /// </summary> OumindBlogEntities db = new ...

  6. iOS开发中的错误整理,通过storyboard做项目,遇到view看不见,或者view被压缩的情况

    前言:在网易新闻的练习中遇到了这个错误 注意:练习中遇到了如图的bug,主要是因为用storyboard布局 600 * 600   显示的时候要经过自动布局,缩小到相应手机的屏幕大小.也就是有的尺寸 ...

  7. mysql JDBC URL格式

    mysql JDBC URL格式如下:   jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参 ...

  8. collections_python

    代码 import collections#counter继承字典的方法,items(),keys(),vavle() obj = collections.Counter('acbdafcbad') ...

  9. mysql库大小

    1.进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2.查询所有数据的大小: select concat(round(su ...

  10. JEECMS页面中常用标签

    (1)在段落前给每一行加序号 从0开始:${a_index}从1开始:${a_index+1} (2)标记说明 [文章导航]:[@cms.Position /] [文章标题]:${arti.title ...