题意:从左到右给你n个不同的数值,让你找出三个数值满足中间的数值在两边的数值之间的个数。

析:题意还是比较好理解的,关键是怎么求数量,首先我们分解一下只有两种情况,一个是左边<中间<右边,另一种是左边>中间>右边(因为数值都不相同嘛)。

我们考虑第i个数值在中间的情况。假设a1到ai-1中有ci个比ai小的,那么就有(i-1)-ci个比ai大的(因为不包括第i个数)。同理,假设有ai+1到an中有di个比ai小,那么有(n-i)-di个比ai大,那么一共就有ci(n-i-di) + (i-ci-1)di种。问题就转化为求ci和di。

ci可以这样计算:从左到右扫描所有的ai,令x[j]表示目前为止已经考虑过的所有的ai中是否存在一个ai=j(x[j] = 1表示存在, x[j] = 0表示不存在),则ci就是前缀和x[1]+x[2]+...+x[ai-1]。初始时所有x[i]=0,在计算ci时,要先设x[ai]=1;然后求前缀和。说到这就很明显是一个数状数组的题了。利用数状数组求前缀和时间复杂度低。在O(nlogr)(r为ai的上限)时间内可计算出ci。同理可计算出di。总是时间复杂度是O(n)。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn = 100000 + 10;
int sum[maxn], n, a[maxn], x[maxn], y[maxn]; int lowbit(int x){
return x & (-x);
} int getsum(int i){
int s = 0;
while(i > 0){
s += sum[i];
i -= lowbit(i);
}
return s;
} void add(int i){
while(i < maxn){
++sum[i];
i += lowbit(i);
}
return ;
} int main(){
int T; cin >> T;
while(T--){
scanf("%d", &n);
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]); for(int i = 1; i <= n; ++i){
x[i] = getsum(a[i]);
add(a[i]);
} memset(sum, 0, sizeof(sum));
for(int i = n; i > 0; --i){
y[i] = getsum(a[i]);
add(a[i]);
} long long ans = 0;
for(int i = 2; i < n; ++i)
ans += (long long)x[i] * (n-i-y[i]) + (long long)y[i] * (i-1-x[i]);
printf("%lld\n", ans);
}
return 0;
}

LA 4329 Ping pong (树状数组)的更多相关文章

  1. LA 4329 Ping pong 树状数组

    对于我这样一名脑残ACMer选手,这道题看了好久好久大概4天,终于知道怎样把它和“树状数组”联系到一块了. 树状数组是什么意思呢?用十个字归纳它:心里有数组,手中有前缀. 为什么要用树状数组?假设你要 ...

  2. LA 4329 - Ping pong 树状数组(Fenwick树)

    先放看题传送门 哭瞎了,交上去一直 Runtime error .以为那里错了. 狂改!!!!! 然后还是一直... 继续狂改!!!!... 一直.... 最后发现数组开小了.......... 果断 ...

  3. UVALive - 4329 Ping pong 树状数组

    这题不是一眼题,值得做. 思路: 假设第个选手作为裁判,定义表示在裁判左边的中的能力值小于他的人数,表示裁判右边的中的能力值小于他的人数,那么可以组织场比赛. 那么现在考虑如何求得和数组.根据的定义知 ...

  4. Ping pong(树状数组经典)

    Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. poj3928 Ping pong 树状数组

    http://poj.org/problem?id=3928 Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  6. UVA 1428 - Ping pong(树状数组)

    UVA 1428 - Ping pong 题目链接 题意:给定一些人,从左到右,每一个人有一个技能值,如今要举办比赛,必须满足位置从左往右3个人.而且技能值从小到大或从大到小,问有几种举办形式 思路: ...

  7. LA4329 Ping pong 树状数组

    题意:一条大街上住着n个乒乓球爱好者,经常组织比赛切磋技术.每个人都有一个能力值a[i].每场比赛需要三个人:两名选手,一名裁判.他们有个奇怪的约定,裁判必须住在两名选手之间,而裁判的能力值也必须在两 ...

  8. POJ 3928 Ping pong 树状数组模板题

    開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...

  9. HDU 2492 Ping pong (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Problem Description N(3<=N<=2000 ...

  10. hdu 6203 ping ping ping(LCA+树状数组)

    hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...

随机推荐

  1. ABAP-BarCode-3-调用第三方控件BarTender实现打印

    1.BarTender软件安装及注册 2.BarTender设置好打印模板 3.ABAP生成TXT文件放置FTP服务器指定文件夹 4.BarTender轮询FTP服务器文件夹中的TXT,并按照模板打印 ...

  2. UI5-文档-4.13-Margins and Paddings

    我们的应用程序内容仍然粘在信箱的角落里.要微调布局,可以向上一步添加的控件添加空白和填充. 我们将使用SAPUI5提供的标准类,而不是手工向控件添加CSS.这些类负责一致的分级步骤.从左到右的支持和响 ...

  3. vue -本地服务配置

    1.httpd.conf # # This is the main Apache HTTP server configuration file. It contains the # configura ...

  4. 没有装delphi软件则须修改程序的Uses单元,去掉QDialogs qtintf.dll

    转: 花了几天的功夫,终于完成了一个delphi调用webservice(C#)的任务,发现了好多问题,不过还是解决了,和大家分享一下.首先,就是调用时一个问题,如果你的webservice没有数据库 ...

  5. XSS学习小结

    一.什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了. 这里我们主要注 ...

  6. CPU Meltdown和Spectre漏洞分析

    一.背景: 1月4日,国外爆出了整个一代处理器都存在的灾难性漏洞:Meltdown和Spectre. 几乎影响了全球20年内所有cpu处理器:这两个漏洞可以使攻击者通过利用并行运行进程的方式来破坏处理 ...

  7. 启动shell时自动启动tmux

    Bash 对bash用户, 只需要将下面命令添加到自己家目录下的.bashrc, 要注意这句命令需要在alias配置之前.对其它shell的配置也是类似的 ~/.bashrc # If not run ...

  8. AKKA集群中的分布式发布订阅

    集群中的分布式发布订阅 如何向一个不知道在哪个节点上运行的actor发送消息呢? 如何向集群中的所有actor发送感兴趣的主题的消息? 这种模式提供了一个中介actor,akka.cluster.pu ...

  9. java script sleep synchronous

    function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { ...

  10. webdriver简介及浏览器的驱动

     1.webdriver概述:  webdriver(selenium2=selenium1+webdriver)是一种用于web应用程序的自动化测试工具,它提供了一套友好的API,与selenium ...