程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2492 Ping pong 樹狀數組求逆序數

HDU 2492 Ping pong 樹狀數組求逆序數

編輯:C++入門知識

題意:給你一些不同數,求滿足a < b < c的有多少組。
 代碼:
[cpp]
#include <iostream> 
#include <algorithm> 
#include <string.h> 
using namespace std; 
 
const int N = 20010; 
struct people{ 
    int id,num; 
}pp[N]; 
struct newpeople{ 
    int id,num; 
}newpp[N]; 
int dit[N]; 
bool cmp(people a,people b){ 
    return a.num < b.num; 

bool cmp2(newpeople a,newpeople b){ 
    return a.id < b.id; 

int lowbit(int x){ 
    return x & (-x); 

int sum(int x){ 
    int s = 0; 
    while(x < N){ 
       s += dit[x]; 
       x += lowbit(x); 
    } 
    return s; 

void update(int x){ 
    while(x > 0){ 
       dit[x] += 1; 
       x -= lowbit(x); 
    } 

int main(){ 
    int numcase; 
    scanf("%d",&numcase); 
    while(numcase--){ 
       int n; 
       scanf("%d",&n); 
       memset(dit,0,sizeof(dit)); 
       for(int i = 1; i <= n; ++i){ 
          scanf("%d",&pp[i].num); 
          pp[i].id = i; 
       } 
       sort(pp+1,pp+n+1,cmp); 
       for(int i = 1; i <= n; ++i){ 
          newpp[i].id = pp[i].id; 
          newpp[i].num = i; 
       } 
       sort(newpp+1,newpp+n+1,cmp2); 
       int fbig[N],fsmall[N],bbig[N],bsmall[N]; 
       for(int i = 1; i <= n; ++i){ 
          int x = newpp[i].num; 
          fbig[i] = sum(x); 
          fsmall[i] = i - 1 - fbig[i]; 
          bbig[i] = n - x - fbig[i]; 
          bsmall[i] = x - 1 - fsmall[i]; 
          update(x); 
       } 
       __int64 ans = 0; 
       for(int i = 1; i <= n; ++i){ 
          ans += (fbig[i] * bsmall[i]); 
          ans += (fsmall[i] * bbig[i]); 
       } 
       printf("%I64d\n",ans); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved