树状数组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;
}



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

树状数组求区间最大值

讲这个的博文已经不少了,但感觉不够详细不够通俗易懂,所以我尝试着更详细更通俗易懂的说一下我的理解。   这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是O((logn)^2),但...
  • u010598215
  • u010598215
  • 2015年09月04日 10:42
  • 4854

树状数组 讲解和题目集

树状数组     树状数组作为一种实现简单、应用较广的高级数据结构,在OI界的地位越来越重要,下面我来简单介绍一下树状数组和它的简单应用。 一、树状数组简介 树状数组:顾名思义,是一种数...
  • moep0
  • moep0
  • 2016年10月09日 21:28
  • 798

C++树状数组详解

引入 如果给你n个数,然后进行q次询问,每次询问一个区间[x,y]的和,你会怎么做? 第一种方法:最简单的方法,用数组存起来,每次枚举x-y,ans加起来就可以,时间复杂度O(qn),十分慢。 ...
  • C20190102
  • C20190102
  • 2017年04月28日 13:32
  • 1360

树状数组题集[不断更新]

一. 基本原理 树状数组中用的d【】,每个点都有一定的管辖范围; 如c[1]=a[1]; d[2]=a[1]+a[2]; d[3]=a[3]; d[4]=a[1]...
  • Matrix_Reloaded
  • Matrix_Reloaded
  • 2014年06月18日 11:40
  • 3001

hdu 5147 Sequence II(树状数组,前缀和,后缀和)

Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To...
  • acm_cxq
  • acm_cxq
  • 2016年07月14日 23:01
  • 410

树状数组---原理代码实现

刚刚学了树状数组,有必要总结一下;参考了大牛的博客
  • u011644423
  • u011644423
  • 2014年08月01日 10:21
  • 1607

对树状数组的一点理解

树状数组 一、概述 树状数组是一种 用数组进行存储的 自下而上进行操作的  多叉树。 最基本的应用就是维护一个支持两种操作的数列:1.让A[i]加上某数X     2.求一个区间A[L] + A[L+...
  • u012891242
  • u012891242
  • 2015年04月13日 17:01
  • 1245

关于树状数组一些有意思的东西

嘛~最近刚刚学会树状数组,写个blog记录一下心得。树状数组呢,核心是一个叫lowbit的东西,lowbit(x)=x&-x=x的最后一位1的大小。 一、一个经典问题 一个初始值为0的k位计数器...
  • TA201314
  • TA201314
  • 2016年04月28日 09:23
  • 1430

树状数组总结

对于普通数组,其修改的时间复杂度位O(1),而求数组中某一段的数值和的时间复杂度为O(n),因此对于n的值过大的情况,普通数组的时间复杂度我们是接受不了的。 在此,我们引入了树状数组的数据结构,它能在...
  • HowardEmily
  • HowardEmily
  • 2017年02月10日 22:01
  • 643

树状数组 --区间查询+区间修改

数据结构
  • FSAHFGSADHSAKNDAS
  • FSAHFGSADHSAKNDAS
  • 2016年09月24日 13:45
  • 3833
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树状数组upc1976
举报原因:
原因补充:

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