http://acm.hdu.edu.cn/showproblem.php?pid=5792

World is Exploding

Problem Description
 
Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ad.
 
Input
 
The input consists of multiple test cases. 
Each test case begin with an integer n in a single line.

The next line contains n integers A1,A2⋯An.
1≤n≤50000
0≤Ai≤1e9

 
Output
 
For each test case,output a line contains an integer.
 
Sample Input
 
4
2 4 1 3
4
1 2 3 4
 
Sample Output
 
1
0

Insipired by http://blog.csdn.net/libin66/article/details/52098019

题意:比较简单直接看。

思路:分别求出在 i 的时候前面有多少比它小的(即像Aa,Ab这样升序的有多少对),用up记录,后面有多少比它小的(像Ac,Ad这样降序的有多少对),用down记录,然后ans = up * down,因为有很多重复。用树状数组维护四个数组,ls —— 在[1,i-1]有多少比a[i]小的,rs —— 在[i+1,n]有多少比a[i]小的,lb —— 在[1,i-1]有多少比a[i]大的,rb —— 在[i+1,n]有多少比a[i]大的。由容斥原理要减去 (  ls * lb + rs * rb + ls * rs + lb * rb )。

 #include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 50005
#define MOD 1000000007
typedef long long LL;
LL ls[N], lb[N], rs[N], rb[N], bit[N];
int a[N], num[N], n, m; /*
ls和lb是[1,i-1]中比a[i]小的数的数量,比a[i]大的数的数量
rs和rb是[i+1, n]中比a[i]小的数的数量,比a[i]大的数的数量
这些都可以通过树状数组实现
由于答案会多算进去a=c || a=d || b=c || b=d的情况,那么枚举这四种情况减去就可以了(a=c那么必定b!=d,同理其他
a=c:ans-=rs[i]*rb[i]
a=d:ans-=lb[i]*rb[i]
b=c:ans-=ls[i]*rs[i]
b=d:ans-=lb[i]*ls[i]
*/ void init()
{
memset(ls, , sizeof(ls));
memset(lb, , sizeof(lb));
memset(rs, , sizeof(rs));
memset(rb, , sizeof(rb));
memset(sum, , sizeof(sum));
} int lowbit(int x)
{
return x & (-x);
} void update(int pos)
{
while(pos <= m) {
bit[pos]++;
pos += lowbit(pos);
}
} LL query(int pos)
{
LL ans = ;
while(pos > ) {
ans += bit[pos];
pos -= lowbit(pos);
}
return ans;
} int main()
{
while(~scanf("%d", &n)) {
init();
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
num[i] = a[i];
}
sort(a+, a++n);
m = unique(a+, a++n) - (a+);
for(int i = ; i <= n; i++)
num[i] = lower_bound(a+, a++m, num[i]) - a; LL up = , down = ;
memset(bit, , sizeof(bit));
for(int i = ; i <= n; i++) {
ls[i] = query(num[i] - );
lb[i] = query(m) - query(num[i]);
up += ls[i];
update(num[i]);
} memset(bit, , sizeof(bit));
for(int i = n; i >= ; i--) {
rs[i] = query(num[i] - );
rb[i] = query(m) - query(num[i]);
down += rs[i];
update(num[i]);
} LL ans = ; for(int i = ; i <= n; i++) {
ans -= ls[i] * lb[i];
ans -= rs[i] * ls[i];
ans -= rb[i] * lb[i];
ans -= rb[i] * rs[i];
} printf("%I64d\n", up * down + ans);
}
return ;
}

HDU 5792:World is Exploding(树状数组求逆序对)的更多相关文章

  1. HDU 1394 Minimum Inversion Number (树状数组求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...

  2. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  3. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  4. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  5. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  6. 【bzoj2789】[Poi2012]Letters 树状数组求逆序对

    题目描述 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. 输入 第一行一个正整数n ...

  7. “浪潮杯”第九届山东省ACM大学生程序设计竞赛(重现赛)E.sequence(树状数组求逆序对(划掉))

    传送门 E.sequence •题意 定义序列 p 中的 "good",只要 i 之前存在 pj < pi,那么,pi就是 "good": 求删除一个数, ...

  8. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

  9. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)

    对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...

  10. poj3067 Japan 树状数组求逆序对

    题目链接:http://poj.org/problem?id=3067 题目就是让我们求连线后交点的个数 很容易想到将左端点从小到大排序,如果左端点相同则右端点从小到大排序 那么答案即为逆序对的个数 ...

随机推荐

  1. ADT eclipse的几个快捷键

    智能内容感知 Alt+/ ,该快捷键可以方便的匹配我们使用的类信息,/ 在键盘上和?是同一个按键. ctrl+.及ctrl+1:下一个错误及快速修改 ctrl+.将光标移动至当前文件中的下一个报错处或 ...

  2. WPF利用VisualTreeHelper遍历寻找对象的子级对象或者父级对象

    原文:WPF利用VisualTreeHelper遍历寻找对象的子级对象或者父级对象 简介 本文将完整叙述我利用VisualTreeHelper实现题述功能的全部过程,想直接看函数实现的朋友可以跳到函数 ...

  3. VS发布到IIS Express外网Debug(如微信开发)

    主要效果是本机调试网站,将网站发布到某域名(如m16758r728.iok.la),可以进入VS断点,不必再用远程调试!!! 环境 VS2015windows 10操作系统花生壳(可以用其他内网穿透的 ...

  4. WPF属性(一)依赖属性

    原文:WPF属性(一)依赖属性 依赖属性是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性,拥有依赖属性的对象称为依赖对象,在传统开发中,一个对象所占用的内存在调用new操作符进行实 ...

  5. 起调UWP的几种方法

    原文:起调UWP的几种方法 由于种种原因吧,我需要使用一个WPF程序起调一个UWP程序,下面总结一下,给自己个备份. 启动UWP程序的关键是协议启动 给我们的UWP应用添加一个协议,like this ...

  6. iOS UIScrollView使用Autolayout

    最近项目在迭代更新的时候,需要在之前用Autolayout写的界面里添加一个button,添加完这个button后,iPhone5,iPhone4显示不全了.遇到整个问题后很自然就想到了用UIScro ...

  7. 同城快递公司Postmates近日完成1亿美元融资,美国外卖餐饮迎来一波融资热潮

    美国外卖市场尚未出现一家独大的巨头,一部分原因是与中国的外卖平台相比,在美国,外卖平台要克服的难题可能更多. 4个月之前才完成3亿美元融资的美国同城快递公司Postmates近日又完成1亿美元融资,估 ...

  8. SignalR---服务端

    原文:SignalR---服务端 前段时间把SignalR的官网教程大致看了一下,算是翻译了一遍,加上了自己的个人理解, 一下上传三个文件,分别是服务端.web客户端.DOTNET客户端相关文档,供大 ...

  9. C++的标准库函数默认都是操作字节,而不是字符,非常痛苦,所以引入了u16string和u32string(Linux上的wchar_t是32位的原因,utf16对unicode的支持是有缺陷的)good

    时至今日,字符串使用unicode已经是不需要理由的常识,但对一些有着悠久历史的编程语言来说,这仍然是个头痛的问题.如果抛开第三方库的支持,C++其实并不能实际有效地支持unicode,即使是utf8 ...

  10. Delphi中inherited问题

    inherited Create(AOwner); 和直接写inherited有区别吗 有区别,inherited Create是指定调用父类的Create方法,当然你也可以inherited Des ...