http://codeforces.com/problemset/problem/61/E

题意是求 i<j<k && a[i]>a[j]>a[k] 的对数

会树状数组求逆序数的话,这个推一下就能出结果:

做法:

1、离散化,由于a[i]能够达到1e9

2、插入a[i]的时候,记录x[i]=i-sum(a[i]); a[i]之前比a[i]大的有x[i]个

3、插入完毕后,求a[i] 之后比a[i]小的数的个数y[i]

ans=segma(x[i]*y[i])   注意x[i]*y[i]会超出int  由于这wa了一次

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int INF = 100000000;
const int MAXN = 1e6+100;
ll x[MAXN],y[MAXN];
int a[MAXN],tmp[MAXN];
ll c[MAXN];
int n; inline int lowb(int x) {return x&(-x);} void update(int x, int d)
{
while(x<=n)
{
c[x]+=d;
x+=lowb(x);
}
} ll sum(int x)
{
ll ret=0;
while(x>0)
{
ret+=c[x];
x-=lowb(x);
}
return ret;
} bool cmp(const int i, const int j)
{
return a[i]<a[j];
} void dis()
{
sort(tmp+1,tmp+1+n,cmp);
int tt=0,pre=a[tmp[1]]-1;
for(int i=1;i<=n;i++)
{
if(pre!=a[tmp[i]])
{
pre=a[tmp[i]];
a[tmp[i]]=++tt;
}
else
a[tmp[i]]=tt;
}
} int main()
{
//IN("B.txt");
ll ans=0;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
tmp[i]=i;
}
dis();
/////////////////
/*for(int i=1;i<=n;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}*/
/////////////////
CL(c,0);
ans=0;
for(int i=1;i<=n;i++)
{
update(a[i],1);
x[i]=i-sum(a[i]);//a[i]之前比a[i]大的有`x[i]个
y[i]=sum(a[i]-1);//a[i]之前比a[i]小的数
}
for(int i=1;i<=n;i++)
{
y[i]=sum(a[i]-1)-y[i];//a[i] 之后比a[i]小的数的个数
ans+=x[i]*y[i];
}
/////////////////
/* for(int i=1;i<=n;i++)
printf("i=%d x=%d y=%d\n",i,x[i],y[i]);*/
/////////////////
printf("%I64d\n",ans);
} return 0;
}

CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序的更多相关文章

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

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

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

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

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

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

  4. POJ 2299 【树状数组 离散化】

    题目链接:POJ 2299 Ultra-QuickSort Description In this problem, you have to analyze a particular sorting ...

  5. Ultra-QuickSort---poj2299 (归并排序.逆序数.树状数组.离散化)

    题目链接:http://poj.org/problem?id=2299 题意就是求把数组按从小到大的顺序排列,每次只能交换相邻的两个数, 求至少交换了几次 就是求逆序数 #include<std ...

  6. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  7. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

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

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

  9. HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意: weak pair的要求: 1.u是v的祖先(注意不一定是父亲) 2.val[u]*va ...

随机推荐

  1. CSS 之 margin知识点

    1.margin的百分比值 普通元素的百分比maigin相对于容器元素的宽度(width) 进行计算的. 这里我们在图片外面设置一个宽高分别为800 * 600的容器.设置img{ margin: 1 ...

  2. nginx环境下搭建nagios 3.5.0,及配置pnp4nagios画图

    本文基于<LNMP最新源码安装脚本>,Nagios依赖PHP环境和perl环境,由于Nginx不支持Perl的CGI,需先来搭建Perl环境,Nagios原理介绍略.一.下载最新稳定源码包 ...

  3. js页面跳转

    js方式的页面跳转1.window.location.href方式    <script language="javascript" type="text/java ...

  4. PKCS5Padding与PKCS7Padding的区别

    工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的问题,例如C#与JAVA中的常见的填充算法如下: .Net中的填充算法: 成员 ...

  5. Visual Studio使用技巧记录

    1.关闭调试,iis express仍显示在托盘中: 工具 ---> 选项 ---> 调试 ---> 编辑并继续,取消选择“编辑并继续”的选择框 2.关闭浏览器一直请求: 在调试旁边 ...

  6. 使用 pm2 来守护 NoderCMS

    pm2 是一个带有负载均衡功能的Node应用的进程管理器,使用 pm2 可以帮助你守护和监控 NoderCMS 的正常运行,   基于Node.js+MongoDB的轻量级内容管理系统NoderCMS ...

  7. JDK1.5新特性随手记

    1.静态导入 import static 静态导入前写法: public class TestStatic { public static void main(String[] args) { Sys ...

  8. Linux定时任务crontab命令使用详解

    1.crontab功能介绍: crontab的功能是在一定的时间间隔内定时执行一些命令. 2.crontab参数详解: 1 crontab -u //设定某个用户的cron服务,一般root用户在执行 ...

  9. js鼠标滑动图片显示隐藏效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. The initialize list of C++ Class

    性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 Error1(constchar* constmsg ...