2016多校训练Contest5: 1012 World is Exploding hdu5792
2016-08-02 22:56
357 查看
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
一开始看错题了...然后又不小心取模计算了...各种挂
容易想到的是枚举b的位置
然后b1表示左边比它小的,b2表示右边比它小的,b3表示左边比它大的
sx表示一共可以选的cd总数
然后统计的时候假设当前是ai
那么我们只需要用(sx-b2[i]-b3[i])*b1[i]-左侧比它小的数在c的情况
最后那个可以用树状数组直接维护
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
一开始看错题了...然后又不小心取模计算了...各种挂
容易想到的是枚举b的位置
然后b1表示左边比它小的,b2表示右边比它小的,b3表示左边比它大的
sx表示一共可以选的cd总数
然后统计的时候假设当前是ai
那么我们只需要用(sx-b2[i]-b3[i])*b1[i]-左侧比它小的数在c的情况
最后那个可以用树状数组直接维护
#include<map> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct number { int x,p; }a[100001]; inline bool cmp1(number x,number y) { return x.x<y.x; } inline bool cmp2(number x,number y) { return x.p<y.p; } int tr[100001]; inline int lowbit(int x) { return x&(-x); } inline void add(int l,int x) { int i; for(i=l;i<=100000;i+=lowbit(i)) tr[i]=(tr[i]+x); } inline int sum(int x) { int i; int sx=0; for(i=x;i>=1;i-=lowbit(i)) sx+=tr[i]; return sx; } int f[100001],fx[100001]; long long b1[100001],b2[100001],b3[100001],b4[100001]; int main() { int n; while(scanf("%d",&n)!=EOF) { int i; for(i=1;i<=n;i++) { scanf("%d",&a[i].x); a[i].p=i; } sort(a+1,a+1+n,cmp1); int tot=1; f[tot]=a[1].x; fx[a[1].p]=tot; for(i=2;i<=n;i++) { if(a[i].x==a[i-1].x) fx[a[i].p]=tot; else { tot++; f[tot]=a[i].x; fx[a[i].p]=tot; } } memset(b1,0,sizeof(b1)); memset(b2,0,sizeof(b2)); memset(b3,0,sizeof(b2)); memset(tr,0,sizeof(tr)); sort(a+1,a+1+n,cmp2); for(i=1;i<=n;i++) { b1[i]=sum(fx[i]-1); add(fx[i],1); } memset(tr,0,sizeof(tr)); long long sx=0; for(i=n;i>=1;i--) { b2[i]=sum(fx[i]-1); sx=(sx+b2[i]); add(fx[i],1); } memset(tr,0,sizeof(tr)); for(i=1;i<=n;i++) { b3[i]=sum(n)-sum(fx[i]); add(fx[i],1); } sort(a+1,a+1+n,cmp1); long long ans=0; memset(tr,0,sizeof(tr)); for(i=1;i<=n;i++) { add(fx[i],b2[i]+b3[i]); long long tmp=sx-b3[i]-b2[i]; long long tx=sum(fx[i]-1); ans=(ans+b1[i]*tmp-tx); } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- 2016多校训练Contest4: 1012 Bubble Sort hdu5775
- 2016多校训练Contest5: 1004 How Many Triangles hdu5784
- 2016多校训练Contest9: 1012 Less Time, More profit hdu5855
- 2016多校训练Contest5: 1011 Two hdu5791
- 2016多校训练#5 1012 HDU 5792 树状数组 代码详解
- 2016多校训练Contest5: 1003 Divide the Sequence hdu5783
- 2016多校训练Contest7: 1012 Lights hdu5820
- 2016多校训练Contest5: 1001 ATM Mechine hdu5781
- HDU 5867 Water problem (2016 多校训练#10 1011)
- [HDU5756] Boss Bo [2016 Multi-University Training Contest 3(2016多校联合训练3) E]
- 2016多校联合训练5&&HDU5784 How Many Triangles
- [HDU5788] Level Up [2016 Multi-University Training Contest 5 1008 (2016多校联合训练5)]
- [HDU5828] Rikka with Sequence [2016 Multi-University Training Contest 8(2016多校联合训练8) 1008]
- 2016多校联合训练1 B题Chess (博弈论 SG函数)
- HDOJ 5753 (2016多校联合训练 Training Contest 3) Permutation Bo
- [HDU5739] Fantasia [2016 Multi-University Training Contest 2(多校联合训练2) F]
- 2016多校训练Contest4: 1010 The All-purpose Zero hdu5773
- 2016多校训练Contest6: 1008 To My Girlfriend hdu5800
- 2016多校训练Contest10: 1002 Hard problem hdu5858
- 2016 Multi-University Training Contest 2(2016多校训练第二场)1009