UVALive 4329 Ping pong
2015-03-15 16:20
260 查看
#include <stdio.h> #include <string.h> using namespace std; struct fwtree { int C[101000], n; void init(int k){ memset(C, 0, sizeof(C)); n = k; } int lowbit(int x) { return x&-x; } void add(int x, int d) { while(x<=n){ C[x] += d; x += lowbit(x); } } long long sum(int x) { long long ans=0; while(x>=1){ ans += C[x]; x -= lowbit(x); } return ans; } }; fwtree f; int main() { int t, n; int maxa; long long a[20200][4]; int p[20200]; long long ans; scanf("%d", &t); while(t--){ scanf("%d", &n); maxa = -1; for(int i=1; i<=n; i++){ scanf("%d", &p[i]); if(p[i]>maxa) maxa = p[i]; } f.init(maxa); ans = 0; for(int i=1; i<=n; i++){ f.add(p[i], 1); a[i][0] = f.sum(p[i]-1); //a[i][0]在左边比a[i]小 a[i][1]为在左边比a[i]大 a[i][1] = i-a[i][0]-1; //家在i前面的有i-1个 } f.init(maxa); for(int i=n; i>=1; i--){ f.add(p[i], 1); a[i][2] = f.sum(p[i]-1); //a[i][2]在右边比a[i]小 a[i][3]为在右边比a[i]大 a[i][3] = n-i-a[i][2]; } for(int i=0; i<n; i++) ans += a[i][0]*a[i][3] + a[i][1]*a[i][2]; printf("%lld\n", ans); } return 0; }
相关文章推荐
- uvalive 4329 Ping pong 树状数组
- uvalive 4329 Ping pong (树状数组)
- UVALive 4329 Ping pong(树状数组求逆序数+顺序数)
- UVALive 4329 Ping pong(树状数组)
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- UVALive 4329 Ping pong(解法二:树状数组)
- UVALive 4329 Ping pong(树状数组)
- UVALive 4329 Ping pong (BIT)
- UVALive-4329 Ping pong (树状数组)
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- UVALIVE 4329 Ping pong(树状数组)
- UVALive - 4329 Ping pong (树状数组)
- [UVALive4329] Ping pong(树状数组,组合)
- UVALive - 4329 Ping pong 数状数组
- 树状数组(LA4329,UVaLive4329,Ping pong)
- UVALive - 4329 Ping pong (树状数组)
- uvalive 4329 Ping Pong(树状数组)
- UVALive 4329 Ping pong
- UVALive 4329 Ping pong(树状数组)
- UVALive 4329 Ping pong(线段树)