转载自:http://blog.csdn.net/queuelovestack/article/details/52096337

【题意】
给你一个序列A,选出四个下标不同的元素,下标记为a,b,c,d

a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n

满足Aa<Ab,Ac>Ad

问能找到多少个这样的四元组(a,b,c,d)

【类型】
树状数组应用

【分析】
因为a<b,c<d,Aa<Ab,Ac>Ad

所以我们暂时称(a,b)为递增对,(c,d)为递减对

题目就转化成递增对*递减对-重复对

重复对包括如下四种:

①b,c一致

②a,c一致

③b,d一致

④a,d一致

那么我们该如何计算重复对呢?

考虑一致点下标为i,我们需要事先处理出位置i左边比它大的数的个数w[i],比它小的数的个数l[i];右边比它大的数的个数v[i],比它小的数的个数r[i],这样所有重复对的对数为l[i]*r[i]+l[i]*v[i]+w[i]*r[i]+w[i]*v[i]

而计算这些个数可以通过树状数组求解

【时间复杂度&&优化】
O(nlogn)

题目链接→HDU 5792 World is Exploding

感觉他写的真的很好,看完之后就大致可以懂了,但树状数组求的那块太简略,我补充下:

首先要做的是把输入s[i]离散化,因为题目说的是1e9。离散化之后就是每次检查前n项和,求l w数组,同理,更新v r数组,但注意,每次都要初始化c数组,因为c数组代表的就是第几位出现的次数,这两次相求会影响,所以每次都跟新。

这题还说明一个问题:树状数组和离散化合到一起有很大作用,比如这题,他就能求出递增对个数,利用的就是当求i的递增对个数时,求0~i-1中所有出现次数之和。

#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int INF=0x3f3f3f3f;
const ll LINF=0x3f3f3f3f3f3f3f3f;
#define PI(A) cout<<(A)<<endl
#define SI(N) cin>>(N)
#define SII(N,M) cin>>(N)>>(M)
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
#define reRep(i,a,b) for(int i=(a);i>=(b);i--)
#define dbg(x) cout <<#x<<" = "<<(x)<<endl
#define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
#define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
const double EPS= 1e- ; /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */ const int MAXN= + ; int n,s[MAXN],c[MAXN],a[MAXN];
ll l[MAXN],r[MAXN],w[MAXN],v[MAXN];
//树状数组
int lowbit(int t){return t&(-t);}
//在c[i]上加x
void add(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
}
//求c[]的前n项和
int sum(int n)
{
int s=;
while(n>)
{
s+=c[n];
n-=lowbit(n);
}
return s;
} int main()
{
while(SI(n))
{
int k,Max=;
//su1是递增对个数 su2是递减对个数
ll ans=,su1=,su2=;
//输入
rep(i,n) {SI(s[i]);a[i]=s[i];}
//将s[]离散化
sort(a,a+n);
k=unique(a,a+n)-a;
rep(i,n)
{
s[i]=lower_bound(a,a+k,s[i])-a+;
Max=max(Max,s[i]);
}
//求递增对个数 和l w数组
cle(c,);
rep(i,n)
{
l[i]=sum(s[i]-);
w[i]=sum(Max)-sum(s[i]);
add(s[i],);
su1+=l[i];
}
//求递减对个数 和r v数组
cle(c,);
reRep(i,n-,)
{
r[i]=sum(s[i]-);
v[i]=sum(Max)-sum(s[i]);
add(s[i],);
su2+=r[i];
}
ans=su1*su2;
//减去重复的
rep(i,n)
ans-=l[i]*r[i]+l[i]*w[i]+v[i]*r[i]+v[i]*w[i];
PI(ans);
}
return ;
}

2016 Multi-University Training Contest 5 World is Exploding的更多相关文章

  1. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  2. 2016 Al-Baath University Training Camp Contest-1 E

    Description ACM-SCPC-2017 is approaching every university is trying to do its best in order to be th ...

  3. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  4. 2016 Al-Baath University Training Camp Contest-1 J

    Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...

  5. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  6. 2016 Al-Baath University Training Camp Contest-1 H

     Description You've possibly heard about 'The Endless River'. However, if not, we are introducing it ...

  7. 2016 Al-Baath University Training Camp Contest-1 G

    Description The forces of evil are about to disappear since our hero is now on top on the tower of e ...

  8. 2016 Al-Baath University Training Camp Contest-1 F

    Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...

  9. 2016 Al-Baath University Training Camp Contest-1 D

    Description X is well known artist, no one knows the secrete behind the beautiful paintings of X exc ...

  10. 2016 Al-Baath University Training Camp Contest-1 C

    Description Rami went back from school and he had an easy homework about bitwise operations (and,or, ...

随机推荐

  1. squid代理服务器搭建及配置

    系统环境:CentOS release 6.5 (Final)(最小化安装) 一.安装squid # yum -y install squid 二.编辑配置文件(正向代理) # vim /etc/sq ...

  2. Java基础了解

    今天刚开始学习Java,除了老师讲的之外,又进一步上网去了解了下Java的相关知识: Java语言的主要特点: 1. 跨平台性 所谓的跨平台性,是指软件可以不受计算机硬件和操作系统的约束而在任意计算机 ...

  3. 黑马程序员——JAVA基础之构造函数,构造代码块

    ------- android培训.java培训.期待与您交流! ---------- 构造函数特点: 1.  函数名与类名相同 2.  不用定义返回值类型 3.  不可以写return语句 构造函数 ...

  4. lua堆栈操作常用函数学习二

    /* ** basic stack manipulation */ LUA_API int  <strong> (lua_gettop) (lua_State *L);  </str ...

  5. Js文本溢出自动添加省略号ellipsis

    原文: ellipsis: function(value, len, word) {         //判断value有没有超过指定长度         if (value && v ...

  6. SharePoint List 查看器

    using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.ComponentMo ...

  7. 怎么让OCR文字识别软件转换别的语言文档

    ABBYY PDF Transformer+让您可创建或转换希伯来语.意第绪语.日语.中文.泰语.韩语和阿拉伯语的文档.那么如何顺利使用这些复杂语言文字呢?小编教你两步骤轻松快速处理包含以下复杂语言文 ...

  8. 021. asp.net两个DataSet数据集的合并

    protected void Page_Load(object sender, EventArgs e) { DataSet dsSource = new DataSet(); //创建源数据集 Da ...

  9. mysql 多行合并一列

    mysql  多行合并一列 使用的函数为: GROUP_CONCAT(exp) 其中exp 的参数类似如下: (field order  by field   desc  separator ';') ...

  10. 15条变量&方法命名的最佳实践【转】

    原文地址:15 Best Practices of Variable & Method Naming 不同的代码段采用不同的命名长度.通常来说,循环计数器(loop counters)采用1位 ...