树状数组求逆序对 附HDU1394

摘要:
算法>11#包括<(-x);i+=磅(i)){28++c[i];29}30}3132英寸(intinx){33英寸=0;34英寸(inti=inx;&sizeof(c));i<=n;50}51英寸最小值=tot;i<=n最小值);68};

清楚的图解,解释树状数组求逆序对的方法,转载:https://blog.csdn.net/ssimple_y/article/details/53744096

题目:https://vjudge.net/problem/HDU-1394

思路:因为数字[1,n],把a[i]放到末尾,逆序对数量会增加n-a[i]个,即比它大的数字个数,

减少a[i]-1个,即比它小的数字个数

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <map>
 4 #include <queue>
 5 #include <string>
 6 #include <stack>
 7 #include <vector>
 8 #include <list>
 9 #include <cstdio>
10 #include <cstring>
11 #include <cmath>
12 using namespace std;
13 #define ll long long
14 #define pb push_back
15 #define fi first
16 #define se second
17 
18 const int N = 5e3+10;
19 int a[N],c[N];
20 int n;
21 
22 inline int lb(int x){
23     return x&(-x);
24 }
25 
26 void update(int inx){
27     for(int i = inx; i <= n; i += lb(i)){
28         ++c[i];
29     }
30 }
31 
32 int sum(int inx){
33     int res = 0;
34     for(int i = inx; i >= 1; i -= lb(i)){
35         res += c[i]; 
36     }
37 
38     return res;
39 }
40 
41 void solve(){
42 
43     while(~scanf("%d",&n)){
44         memset(c,0,sizeof(c));
45         int tot = 0;
46         for(int i = 1; i <= n; ++i){
47             scanf("%d",a+i);
48             update(++a[i]);  //这里处理一下0,使得更新和查询不会死循环
49             tot += i - sum(a[i]);
50         }
51         int Min = tot;
52         for(int i = 1; i <= n; ++i){
53             tot += n - 2*a[i] + 1;
54             Min = min(tot,Min);
55         }
56         printf("%d
",Min);
57     }
58 
59 }
60 
61 int main(){
62  
63   //  ios::sync_with_stdio(false);
64   //  cin.tie(0); cout.tie(0);
65     solve();
66 
67     return 0;
68 }

免责声明:文章转载自《树状数组求逆序对 附HDU1394》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++中find_if【Java学习】Maven原理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SUSE12SP3-Mysql5.7安装

1、将以下安装包复制到服务器 mysql-community-client-5.7.24-1.sles12.x86_64.rpm mysql-community-server-5.7.24-1.sles12.x86_64.rpm mysql-community-libs-5.7.24-1.sles12.x86_64.rpm mysql-community-...

网页支付页面代码

<html xmlns:ns1="og" lang="zh" xmlns="http://www.w3.org/1999/xhtml" ns1:xmlns="http://ogp.me/ns#" class=" jsEnabled"><head><meta http-equiv="Content-Type" content="...

php 命名空间(要求php5.3以上)

要求php5.3以上 <?phpnamespace test;// 命名空间与目录类似功能,也可定义子命名空间,用分层的方式定义:/*namespace mydirokproject; 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前: */const...

数据库中的连接

1简单连接 mysql> SELECT ORDER_NUM,AMOUNT,COMPANY,CREDIT_LIMIT FROM ORDERS,CUSTOMERS WHERE CUST=CUST_NUM;+-----------+----------+-------------------+--------------+| ORDER_NUM | A...

Qt开源作品30-农历控件

一、前言 农历控件在国产linux中必备的控件之一,毕竟要适应国人的习惯,你看win10系统的日历,现在点开来直接就有农历在上面,非常方便人性化,所以在很多用Qt做的项目中,也有农历控件的应用场景,而Qt自带的日历控件比较简单,仔细看过源码的人也只知道,其实就是一堆微调框,下拉框,表格组成的,于是打算借用此方法造一个农历控件,本控件的算法是倪大侠提供的,个...

WPF中元素拖拽的两个实例

  今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListView的某一个节点,从而将该子元素作为当前节点的子节点。第二个例子就是将ListView的某一项拖拽到另外一项上从而使两个子项位置互换,这两个例子的原理类...