HDU
来源:互联网 发布:古墓丽影8mac配置要求 编辑:程序博客网 时间:2024/06/07 02:04
题目链接
题意:
给出一个长度为n的整数序列,要求输出有多少个四元组{a,b,c,d}。
满足1<=a<b<=n,1<=c<d<=n,a!=b!=c!=d 且 Va<Vb && Vc>Vd
思路:
我们先定义几个数组:
lmi[i] 表示1...i-1 比i小的有几个
lmx[i] 表示1...i-1比i大的有几个
rmi[i] 表示i+1...n比i小的有几个
rmx[i] 表示i+1..n比i大的有几个.
这四个数组我们可以通过维护一个树状数组来实现,由于A很大,所以这里离散化一下.
再定义一个sum数组,sun[i]表示1..i,lm[i]的和,这样就相当于求出有多少对Aa<Ab。
那么总结过为lmx[i]*sum[n]。
可是你会发现题目要求abcd不相等,我们这样会有重复,所以需要分情况讨论.
a=c(当a==c,b一定!=d,其余同理) ans -= rmi[i]*rmx[i];
a=d ans -= lmx[i]*rmx[i];
b=c ans -= lmi[i]*rmi[i];
b=d ans -= lmx[i]*lmi[i];
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=1e9+7;const int maxn=5e4+10;int a[maxn],Hash[maxn];ll lmi[maxn],rmi[maxn],lmx[maxn],rmx[maxn];int n,m,s[maxn];ll sum[maxn];int lowbit(int x){return x&-x;}void add(int x,int d){while(x < maxn){s[x] += d;x += lowbit(x);}}ll _sum(int x){ll res = 0;while(x >= 1){res += s[x];x -= lowbit(x);}return res;}int main(){while(~scanf("%d",&n)){for(int i=1;i<=n;i++){scanf("%d",&a[i]);Hash[i]=a[i];}sort(Hash+1,Hash+1+n);m = unique(Hash+1,Hash+1+n) - (Hash+1);for(int i=1;i<=n;i++)a[i] = lower_bound(Hash+1,Hash+1+m,a[i]) - Hash;memset(s,0,sizeof s);sum[0]=0;for(int i=1;i<=n;i++){lmi[i] = _sum(a[i]-1);lmx[i] = (i-1) - _sum(a[i]);//printf("1 %d %d\n",i,_sum(m)); sum[i] = sum[i-1] + lmi[i];add(a[i],1);}memset(s,0,sizeof s);for(int i=n;i>=1;i--){rmi[i] = _sum(a[i]-1);rmx[i] = (n-i) - _sum(a[i]);//printf("2 %d %d\n",n-i+1,_sum(m)); add(a[i],1);}ll ans = 0;for(int i=1;i<=n;i++)ans += sum[n]*lmx[i];for(int i=1;i<=n;i++){ans -= rmi[i]*rmx[i];ans -= lmx[i]*rmx[i];ans -= lmi[i]*rmi[i];ans -= lmx[i]*lmi[i];}printf("%lld\n",ans);}return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 字母数字、字母、汉字验证码 (java)
- 数模算法-一些连续离散化方法
- Threejs开发笔记之三光源
- 第八章 拦截器机制(三) 自定义拦截器
- MyBatis学习(四)-实现一对多的关联表
- HDU
- python识别验证码
- 数模算法-数值分析算法
- 利用SVD的方法求解ICP(详细推导)
- 使用Java8 Files类读写文件
- 数模算法-图象处理算法
- 生活随笔:怀念在广州大学的日子
- python基础4
- Reinforcement Learning强化学习系列之一:model-based learning