树状数组upc1976

原创 2013年12月03日 19:11:19

1976: problem F

Time Limit: 3 Sec  Memory Limit: 64 MB
Submit: 69  Solved: 10
[Submit][Status][Web Board]

Description

在一个小镇上住着n位武林高手,他们互相之间经常PK,不过PK的时候必须要有一位裁判在场。这个小镇上的房子从1—n依次排列(一条直线上),两个人要单挑时必须到另一个人的家里,让这个人作为裁判,裁判的武功不能同时比两个人低也不能同时比两个人高。由于每个高手都很懒,所以他们走的路程不能比他俩之间的距离远(即只能在他们序号之间高手中选择裁判)。求小镇上最多能进行几场PK。

Input

先输入一个整数T(T<=100),包含T组测试数据,每组数据先输入n(n<=100000),然后后面是n个数,表示n个武林高手的功夫ai,(ai<=100000)。

Output

能够进行的最大场数,每组数据占一行。

Sample Input

231 2 352 2 2 2 2

Sample Output

110

思路:跟poj1990有些相似。
下面是代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAX=500010;
struct node
{
    long long x,value;
}a[MAX];
long long n;
long long num[MAX];
bool cmp(node a,node b)
{
    return a.value<b.value;
}
long long sum(long long x)
{
    long long sum=0;
    while(x>0)
    {
        sum+=num[x];
        x-=(x&(-x));
    }
    return sum;
}
void update(long long x,int cnt)
{
    while(x<=n)
    {
        num[x]+=cnt;
        x+=(x&(-x));
    }
}
int main()
{
    //freopen("test2.in","r",stdin);
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(long long i=1;i<=n;i++)
        {
            scanf("%lld",&a[i].value);
            a[i].x=i;
        }
        memset(num,0,sizeof(num));
        stable_sort(a+1,a+n+1,cmp);
        long long ans=0;
        for(long long  i=1;i<=n;i++)
        {
            long long x=sum(a[i].x);
            ans+=x*((n-a[i].x)-(i-x-1))+(a[i].x-x-1)*(i-x-1);
            update(a[i].x,1);
        }
        cout<<ans<<endl;
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

【树状数组】树状数组复习

poj2155 Matrix/***************************\ * @prob: poj2155 Matrix * * @auth: Wang Junji ...

【树状数组】学习树状数组

我在网上搜索到一些优秀的博客学习的树状数组,以下是参考的博客: 一维树状数组 搞懂树状数组:点击打开链接 树状数组学习笔记:点击打开链接 完全认识树状数组:点击打开链接 还有算法训练指南中的讲解; 以...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

树状数组

问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1 思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O...

树状数组

用于统计数组B的元素和, 部分和信息存放在C数组。 int lowbit(int x){ return x&(-x); } int sum(int n){ int sum = 0;...

树状数组

当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组 定义:a[1...N]为原数组,c[1...N]为对应的树状数组; 其中:用c[...

树状数组

树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元...

树状数组

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7429868       写下这个标题,其实心里还是没底的,与其说是写博帖,...

树状数组

什么是树状数组??? 树状数组就是把一个一般的数组弄成一个像树一样的结构! 如图:(图片来自百度) 刚开始是数组A,经过变换后,C[1]=A[1], C[2]=A[1]+A[2],C[3]=A[3...

树状数组

树状数组(BIT)解决问题,缩减以下操作的算法复杂的,减少查询时间 (1)add(i,j),实现a[i]=a[i]+j (2)Query(i,j),求和a[i]+a[..]…..+a[j],第一个...

树状数组

树状数组 先废话一下. 嗯 嗯  从今天开始 从基础一步一步开始 追逐我的梦想! 今天先来讨论一下树状数组. 问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)