hdu 5792 World is Exploding 树状数组
World is Exploding
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5792
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
Hint
题意
给你n个数,问你有多少个四元组,满足a!=b,b!=c,c!=d,a!=d,a!=c,b!=d,且A[a]<A[b],a<b,A[c]>A[d],c<d的关系的。
题解:
考虑容斥,我们知道(a,b)的对数,(c,d)的对数,两个乘起来,再减去不合法的就好了。
不合法的,显然就是长度为3的哪些重复计算的,只要减去就好了。
维护l[i]表示前面有多少个比他小,l1[i]前面有多少个比他大
r[i]后面有多少个比他小,r1[i]有多少个比他大
然后莽一波容斥。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+7;
int d[maxn],n,a[maxn],l[maxn],r[maxn],l1[maxn],r1[maxn];;
int lowbit(int x){
    return x&(-x);
}
void update(int x,int v){
    for(int i=x;i<maxn;i+=lowbit(i))
        d[i]+=v;
}
int get(int x){
    int ans = 0;
    for(int i=x;i;i-=lowbit(i))
        ans+=d[i];
    return ans;
}
map<int,int>H;
vector<int> V;
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(l1,0,sizeof(l1));
        memset(r1,0,sizeof(r1));
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        memset(d,0,sizeof(d));
        V.clear();H.clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            V.push_back(a[i]);
        }
        sort(V.begin(),V.end());
        V.erase(unique(V.begin(),V.end()),V.end());
        for(int i=0;i<V.size();i++)
            H[V[i]]=i+1;
        for(int i=1;i<=n;i++)a[i]=H[a[i]];
        long long ans1=0,ans2=0,ans3=0;
        for(int i=1;i<=n;i++){
            l[i]=get(a[i]-1);
            l1[i]=get(maxn-1)-get(a[i]);
            update(a[i],1);
        }
        memset(d,0,sizeof(d));
        for(int i=n;i>=1;i--){
            r[i]=get(a[i]-1);
            r1[i]=get(maxn-1)-get(a[i]);
            update(a[i],1);
        }
        for(int i=1;i<=n;i++){
            ans3+=1ll*l[i]*r[i];
            ans3+=1ll*l1[i]*r1[i];
            ans3+=1ll*l[i]*l1[i];
            ans3+=1ll*r[i]*r1[i];
            ans1+=l[i],ans2+=r[i];
        }
        cout<<ans1*ans2-ans3<<endl;
    }
}hdu 5792 World is Exploding 树状数组的更多相关文章
- HDU 5792 World is Exploding 树状数组+枚举
		题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Time Limit: 2000/1000 MS (Ja ... 
- hdu   5792   World is Exploding   树状数组+离散化+容斥
		World is Exploding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ... 
- HDU 5862 Counting Intersections(离散化+树状数组)
		HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ... 
- hdu 5517 Triple(二维树状数组)
		Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ... 
- 2016 Multi-University Training Contest 5 1012 World is Exploding  树状数组+离线化
		http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ... 
- HDU 1394 Minimum Inversion Number   (  树状数组求逆序数    )
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ... 
- HDU 5862 Counting Intersections (树状数组)
		Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ... 
- hdu 5592 ZYB's Game 树状数组
		ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ... 
- HDU 1394 Minimum Inversion Number (树状数组求逆序对)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ... 
随机推荐
- 第一、介绍Canvas
			canvas能做什么? canvas是HTML5中的新元素,你可以使用javascript用它来绘制图形.图标.以及其它任何视觉性图像.它也可用于创建图片特效和动画.如果你掌握了完整的命令,你可以用c ... 
- continue和break区别
			break 语句用于跳出循环. continue 用于跳过循环中的一个迭代. 一个迭代,就是一次循环,continue终止本次循环,继续下一次循环: break,循环终止不再循环. 
- HDU 4502 吉哥系列故事——临时工计划(一维动态规划)
			题意:吉哥的假期是1到n天,然后有m个工作可以让吉哥选择做,每个工作都有一个开始 t_s 和结束的时间 t_e ,都用天来表示,然后每个工作必须从第一天做到最后一天, 从头到尾做完之后就可以得到 ... 
- E - 食物链
			题目链接:https://cn.vjudge.net/contest/66964#problem/E 关系式: ra->rb=(ra->b + b->rb )%3; ra->b ... 
- hibernate的多对多关联映射
			在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ... 
- Batch Normalization 与 Caffe中的 相关layer
			在机器学习领域,通常假设训练数据与测试数据是同分布的,BatchNorm的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ... 
- Dede更新提示DedeTag Engine Create File False的解决办法
			第一种情况:列表.频道.文章等命名规则未填写或填写错误 此种情况较为少见,因为初级用户一般不会去修改这些东西,情况可以大致分为: 命名规则未填写(即为空)解决方法:只需填好相应的规则即可,重新选择栏目 ... 
- 网络图片转换到本地并转换成base64位
			/** * 网络图片转换到本地并转换成base64位 * @param $url * @return string */ public function imgzhuanhuan($url) { // ... 
- 记一些使用PyQt的问题
			本文自用,日常记录,不断更新 环境 1.使用 PyCharm IDE 2.PyQt5 3. 扩展配置 PyUIC转换后的代码处理 PyUIC 用于 将 QtDesigner 生成的 .ui 文件转换为 ... 
- 《jquery实战》javascript 必知必会(1)
			A1 javascript对象的基本原理 JS 的 Object 与其他兄弟面向对象所定义的根本对象,几乎没有什么共同之处. JS 的 Object 一旦创建,它不持有任何数据,而且不表示什么语义. ... 
