LA_4329_HDU_2492_PingPong

4329 - Ping pong

Time limit: 3.000 seconds

N (3N20000) ping pong players live along a west-east street(consider the street as a line segment). Each player has a unique skill rank. To improve their skill rank, they often compete with each other. If two players want to compete, they must choose a referee among other ping pong players and hold the game in the referee's house. For some reason, the contestants can't choose a referee whose skill rank is higher or lower than both of theirs. The contestants have to walk to the referee's house, and because they are lazy, they want to make their total walking distance no more than the distance between their houses. Of course all players live in different houses and the position of their houses are all different. If the referee or any of the two contestants is different, we call two games different. Now is the problem: how many different games can be held in this ping pong street?

Input 

The first line of the input contains an integer T (1T20) , indicating the number of test cases, followed by T lines each of which describes a test case.

Every test case consists of N + 1 integers. The first integer is N , the number of players. Then Ndistinct integers a1a2...aN follow, indicating the skill rank of each player, in the order of west to east ( 1ai100000 , i = 1...N ).

Output 

For each test case, output a single line contains an integer, the total number of different games.

Sample Input 

1
3 1 2 3

Sample Output 

1

树状数组的经典应用

要求裁判住的位置和水平都在两人中间

考虑每个人当裁判的情况就可以了

基本思想就是先在读数据的同时保存读入数字之前比他小的数字

然后再扫一遍全部比他小的数有多少

那么由于能力值都是独一无二的

所以在他之前比他大的就是i-1-之前比他小的

之后比他小的就是全部比他小的-之前比他小的

之后比他大的就是n-i-之后比他小的

所以代码如下

#include 
#include 
#include 
using namespace std;

const int M=1e5+5;
int num[M];      //记录读入的能力值
int tree[M];
int ls[M];       //之前比它小的数量

inline int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int v)
{
    for(int i=x;i=2;i--)
        {
            pis+=(getsum(num[i]-1)-ls[i])*(i-1-ls[i])+(n-i-(getsum(num[i]-1)-ls[i]))*ls[i];//前大后小,加前小后大
        }
        printf("%lld\n",pis);
    }
    return 0;
}


你可能感兴趣的:(HDU,树状数组,LiveArchive)