今天入门了树状数组 习题链接 https://blog.csdn.net/liuqiyao_01/article/details/26963913

离散化数据:用一个数组来记录每个值在数列中的排名,不能用map,会超时

开结构体存储每个数在数列中原来的位置,排序后用a数组求出原来状态下每个数的排名。

/*
线段树求逆序对的话是按顺序把数字插到数字对应的线段树下标里,然后统计该下标右边的数个数
树状数组求逆序对思路:按顺序一个个插到数组中,统计比它小的个数,逆序数=当前数的下标-当前比它小的个数 */
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 500500
#define ll long long
using namespace std;
struct node{
int val,pos;
bool operator<(const node & a)const {
return val<a.val;
}
}p[maxn];
int n,bit[maxn],a[maxn];
//树状数组bit[i]维护的信息是排名在一个区间内的数字个数
//数组a表示第i个数的排名是多少
void add(int i){
while(i<=n){
bit[i]+=;
i+=i&-i;
}
}
int sum(int i){
int s=;
while(i>){
s+=bit[i];
i-=i&-i;
}
return s;
}
void solve(){
for(int i=;i<=n;i++){scanf("%d",&p[i].val);p[i].pos=i;}
sort(p+,p++n);
for(int i=;i<=n;i++)a[p[i].pos]=i;
memset(bit,,sizeof bit);
ll ans=;
for(int i=;i<=n;i++){
add(a[i]);//排名为a[i]的地方加1
ans+=i-sum(a[i]);//当前所有被加入的数个数-排名在第i的数之前的数=增加的逆序对数
}
printf("%lld\n",ans);
}
int main(){
while(scanf("%d",&n),n)solve();
}

poj2299树状数组入门,求逆序对的更多相关文章

  1. POJ 3067 - Japan - [归并排序/树状数组(BIT)求逆序对]

    Time Limit: 1000MS Memory Limit: 65536K Description Japan plans to welcome the ACM ICPC World Finals ...

  2. POJ 2299 树状数组+离散化求逆序对

    给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的 其实就是问冒泡往后 最多多少次 但是按普通冒泡记录次数一定会超时 冒泡记录次数的本质是每个数的逆序数 ...

  3. 树状数组||归并排序求逆序对+离散化 nlogn

    我好咸鱼. 归并排序之前写过,树状数组就是维护从后往前插入,找比现在插入的数大的数的数量. 如果值域大,可以离散化 #include <cstdio> #include <cstri ...

  4. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  5. POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  6. 【BZOJ3295】【块状链表+树状数组】动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  7. CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序

    http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...

  8. hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

    题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...

  9. POJ 2299 Ultra-QuickSort 求逆序数 (归并或者数状数组)此题为树状数组入门题!!!

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 70674   Accepted: 26538 ...

随机推荐

  1. go 练习

    1.判断 101-200 之间有多少个素数,并输出所有素数 定义:为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. package main import ( "fmt& ...

  2. 基于URL的HAProxy负载均衡设置

    例子包括ACL的url_beg. url_beg提交URL中使用的字符串相匹配. 使用URL /blog(cnblog/api)所有请求重定向到WEB服务器的6200端口.所有其他请求将重定向到服务器 ...

  3. shell中使用>/dev/null 2>&1 丢弃信息

    在一些Shell脚本中,特别是Crontab的脚本中,经常会看到 >/dev/null 2>&1这样的写法. 其实这个很好理解.我们分两部分解释. 1.  >/dev/nul ...

  4. 设计模式---对象创建模式之构建器模式(Builder)

    一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象 ...

  5. 一个简单的"RPC框架"代码分析

    0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string) ...

  6. vue项目中安装使用echarts

    安装:cnpm install echarts -S (安装依赖并引入到 package.json) 官网安装说明:http://echarts.baidu.com/tutorial.html#%E5 ...

  7. OBS 录制视频 自己留存

    1. 下载安装 软件下载地址:https://github.com/jp9000/obs-studio/releases/download/19.0.2/OBS-Studio-19.0.2-Full- ...

  8. Linux 流量控制总结(TC)

    TC对带宽的描述:    mbps = 1024 kbps = 1024 * 1024 bps => byte/s    mbit = 1024 kbit => kilo bit/s.   ...

  9. java线程池如何合理的设置大小

    线程池究竟设置多大要看你的线程池执行的什么任务了,CPU密集型.IO密集型.混合型,任务类型不同,设置的方式也不一样 任务一般分为:CPU密集型.IO密集型.混合型,对于不同类型的任务需要分配不同大小 ...

  10. python 新式类的 __getattribute__

    这个方法定义在object中,所以所有的新式类都继承有该方法,所有的新式类的实例在获取属性value的时候都会调用该方法,为了验证这一结论,我们重写一下该方法: class C(object): a ...