大白书上的题目,比较巧妙的是其分析,为了求某个i点做裁判的时候的情况数,只要知道左边有多少比它小的记为ansc,右边有多少比它小的记为ansd,则总种数,必定为

ansc*(右边总数-ansd)+ansd*(左边总数-ansc)。

为了速度求出ansc和ansd,用到树状数组,这倒不是很难得地方,每次读到a[i],更新a[i]值+1即可。反过来求一次即可求出来 ansd

注意最后数据可能超过32位整数,因此用long long

树状数组的使用还有些不熟练。。。要继续加强

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int x[];
long long n,a[],c[];
long long ansc[],ansd[];
int lowbit(int q)
{
return q&(-q);
}
long long sum(int q)
{
long long ret=;
while (q>)
{
ret+=c[q];
q-=lowbit(q);
}
return ret;
}
void add(int loc,int d,int maxn)
{
while (loc<=maxn)
{
c[loc]+=d;
loc+=lowbit(loc);
}
}
int main()
{
int t;
scanf("%d",&t);
long long maxn=;
while (t--)
{
scanf("%lld",&n);
for (int i=;i<=n;i++){
scanf("%lld",&a[i]);
maxn=max(maxn,a[i]);
}
memset(c,,sizeof c);
for (long long i=;i<=n;i++)
{
//x[a[i]]=1;
add(a[i],,maxn);
ansc[i]=sum(a[i]-);
}
memset(c,,sizeof c);
for (long long i=n;i>=;i--)
{
//x[a[i]]=1;
add(a[i],,maxn);
ansd[i]=sum(a[i]-);
}
long long ans=;
for (long long i=;i<=n;i++)
{
ans+=ansc[i]*(n-i-ansd[i])+ansd[i]*(i-ansc[i]-);
}
printf("%lld\n",ans);
}
return ;
}

UVALive 4329 树状数组第二题的更多相关文章

  1. LA 4329 (树状数组) Ping pong

    第一次写树状数组,感觉那个lowbit位运算用的相当厉害. 因为-x相当于把x的二进制位取反然后整体再加上1,所以最右边的一个1以及末尾的0,取反加一以后不变. 比如1000取反是0111加一得到10 ...

  2. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. st表树状数组入门题单

    预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...

  4. UESTC 1584 Washi与Sonochi的约定【树状数组裸题+排序】

    题目链接:UESTC 1584 Washi与Sonochi的约定 题意:在二维平面上,某个点的ranked被定义为x坐标不大于其x坐标,且y坐标不大于其y坐标的怪物的数量.(不含其自身),要求输出n行 ...

  5. bzoj1103树状数组水题

    (卧槽,居然规定了修改的两点直接相连,亏我想半天) 非常水的题,用dfs序(而且不用重复,应该是直接规模为n的dfs序)+树状数组可以轻松水 收获:树状数组一遍A(没啥好骄傲的,那么简单的东西) #i ...

  6. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

  7. 树状数组训练题1:弱弱的战壕(vijos1066)

    题目链接:弱弱的战壕 这道题似乎是vijos上能找到的最简单的树状数组题了. 原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组 ...

  8. 树状数组 简单题 cf 961E

    题目链接 : https://codeforces.com/problemset/problem/961/E One day Polycarp decided to rewatch his absol ...

  9. 【树状数组 思维题】luoguP3616 富金森林公园

    树状数组.差分.前缀和.离散化 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积 ...

随机推荐

  1. python基础学习(一)

    一,Python介绍 1,python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打 ...

  2. 10 Class文件结构

  3. ACM-生化武器

    Description在一个封闭的房间里,gogo给大家表演了他的屁遁术,人果然一下没影了,但是他留下的“生化武器”,却以每秒1米的速度向上下左右扩散出去.为了知道自己会不会被“毒”到,你果断写了个算 ...

  4. restfulframework详解

    restfulframework详解 第一篇 RESTful规范

  5. Golang的环境安装

    Golang的环境安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Go语言环境安装 1>.下载Golang的安装包 博主推荐阅读: https://studygola ...

  6. python基础笔记:判断与循环

    判断: #根据身高为1.75,体重为65的小明的bmi输出小明的身材 h=1.75 w=65 bmi=w/(h*h) if bmi<18.5: print('过轻') elif bmi<= ...

  7. ipv6_RIPng配置

    ipv6 unicast-routing——类似IPv4的ip routing ipv6 route rip word——启用IPv6进程 防止环路——split-horizon——水平分割——不再接 ...

  8. React+Flask打造前后端分离项目开发环境

    目录 前言 Backend-Flask Frontend-React Done References 前言 新的一年,开始水第一篇技术文.碰巧最近React玩得多,撸一篇文章纪念一下开发环境的搭建.

  9. 吴裕雄--天生自然C++语言学习笔记:C++ 指针

    每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. #include <iostream> using namesp ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 循环

    有的时候,可能需要多次执行同一块代码.一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了允许更为复杂的执行路径的多种控制结构. 循环语句允许我们多次执 ...