标签:
主题链接:
PKU:http://poj.org/problem?id=3928
HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2492
Description
Input
Output
Sample Input
1 3 1 2 3
Sample Output
1
Source
代码例如以下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=100017; int n; int a[maxn], c[maxn]; int leftMax[maxn], leftMin[maxn]; int rightMax[maxn], rightMin[maxn]; typedef __int64 LL; int Lowbit(int x) //2^k { return x&(-x); } void update(int i, int x)//i点增量为x { while(i <= maxn)//注意此处 { c[i] += x; i += Lowbit(i); } } int sum(int x)//区间求和 [1,x] { int sum=0; while(x>0) { sum+=c[x]; x-=Lowbit(x); } return sum; } int main() { int t; int n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); } memset(c,0,sizeof(c)); for(int i = 1; i <= n; i++) { leftMin[i] = sum(a[i]);//计算左边小的个数 leftMax[i] = i-leftMin[i]-1;//计算左边大的个数 update(a[i],1); } memset(c,0,sizeof(c));//再次清零 for(int i = n,j = 1; i >= 1; i--,j++) { rightMin[i] = sum(a[i]); rightMax[i] = j-rightMin[i]-1; update(a[i],1); } LL ans = 0; for(int i = 1; i <= n; i++) { ans+=leftMax[i]*rightMin[i] + leftMin[i]*rightMax[i];//交叉相乘取和 } printf("%I64d\n",ans); } return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
POJ 3928 & HDU 2492 Ping pong(树阵评价倒数)
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4707824.html