算法竞赛入门经典 p197

题目大意:

一条大街上住着n个乒乓球爱好者。常常比赛切磋技术。每一个人都有一个不同的技能值a[i]。每场比赛须要3个人:两名选手,一名裁判。他们有个奇怪的约定,裁判必须住在两名选手之间,而裁判的能力值也必须在两名选手之间。问一共能组织多少种比赛。

分析:

   如果a[1]到a[i-1]中小于a[i]的数有p[i]。a[i+1]到a[n]中小于a[i]的数有s[i]个;

这样当i为裁判时可以组织的比赛数目为:p[i]*(n-i-s[i]) + (i-1-p[i])*s[i];

则总比赛次数为:

ans = 0;
for i -> 1 to n   (i表示选取第i个人作为裁判)
    ans += p[i]*(n-i-s[i]) + (i-1-p[i])*s[i];

首先确定p[i]的值,令x[j]表示到眼下为止已经考虑过的全部a[i]中是否存在技能值为j的数;(x[j] = 0表示不存在,x[j] = 1表示存在)

memsest(x, 0, sizeof(x));(将x初始化为0);
for i -> 1 to cur (cur为考虑的当前位置,即选取的裁判位置)
x[a[i]] = 1;

则有 p[cur] = x[1]+x[2]+.....+x[a[cur]-1];

例:

如果 n = 4      a[1] = 2, a[2] = 3, a[3] = 5, a[4] = 1;

选取 cur= 3,a[cur] = 5;  (第三个人做裁判)

p[3] = x[1]+x[2]+x[3]+x[4] = 0 + 1 + 1 + 0 = 2;(这里 x[1] = 0的原因是没有运行到第4个)

不断的记录求和,当然是没有问题的(时间开销非常大)

for i -> 1 to n;
x[a[i]] = 1;
p[i] = 0;
for j -> 1 to a[i]-1
p[i] += x[j]

改动单个元素并求前缀和是树状数组的标准使用方法,能够大幅度缩减时间(时间复杂度从O(nr)降到O(nlogr) );

for i-> 1 to n
add(a[i], 1); //(点改动)
p[i] = sum(a[i]-1); //(前缀和);

到这里结果基本上能够求出来了,那s[i]呢?类似的。方向从i -> 1 to n 改为 i -> n todown 1就可以;

代码例如以下:

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int maxn = 20000+10;
const int maxm = 100000+10;
int c[maxm], a[maxn], p[maxn], s[maxn], n; inline int lowbit(int x){
return x&-x;
} void add(int x, int d){
while(x <= maxm){ // 一定注意这里是maxm, 原因能够思考一下;
c[x] += d; x += lowbit(x);
}
} int sum(int x){
int ret = 0;
while(x > 0){
ret += c[x]; x -= lowbit(x);
}
return ret;
} int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; ++i){
add(a[i], 1);
p[i] = sum(a[i]-1);
}
memset(c, 0, sizeof(c));
for(int i = n; i > 0; --i){
add(a[i], 1);
s[i] = sum(a[i]-1);
}
long long ans = 0;
for(int i = 1; i <= n; ++i){
ans += p[i]*(n-i-s[i]) + (i-1-p[i])*s[i];
}
printf("%lld\n", ans);
}
return 0;
}

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

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

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

  2. LA 4329(树状数组)

    题目描述: N <tex2html_verbatim_mark>(3N20000) <tex2html_verbatim_mark>ping pong players live ...

  3. poj Ping pong LA 4329 (树状数组统计数目)

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2302   Accepted: 879 Descript ...

  4. 算法竞赛入门经典 LA 4329(树状数组)

    题意: 一排有着不同能力值的人比赛,规定裁判的序号只能在两人之间,而且技能值也只能在两人之间 问题: <算法竞赛入门经典-训练指南>的分析: 上代码: #include<iostre ...

  5. UVALive 4329 树状数组第二题

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

  6. TTTTTTTTTTTTT LA 2191 树状数组 稍修改

    题意:给出n个数字,操作有修改(S)和输出区间和(M). #include <iostream> #include <cstdio> #include <cstring& ...

  7. LA 4329 Ping pong 树状数组

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

  8. LA 4329 ping-pong树状数组

    题目链接: 刘汝佳,大白书,P197. 枚举裁判的位置,当裁判为i时,可以有多少种选法,如果已经知道在位置i之前有ci个数比ai小,那么在位置i之前就有i-1-ci个数比ai大. 在位置i之后有di个 ...

  9. 树状数组 LA 4329 亚洲赛北京赛区题

    复习下树状数组 还是蛮有意思的一道题: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&cat ...

随机推荐

  1. 基于Android SDK安装PhoneGap框架

    下载zip文件PhoneGap 2.0.0 PhoneGap 2.0.0 Released 20 Jul 2012http://phonegap.com/download/ 解压缩后的目录结构:Dir ...

  2. PHP富文本编辑器 之Kindeditor的使用 一

    一.下载编辑器源码 KindEditor 4.1.10 (2013-11-23) [1143KB] 下载页面: http://kindeditor.net/down.php 二.部署编辑器 将下载文件 ...

  3. tomcat解决 java.lang.IllegalArgumentException: Request header is too large

    tomcat运行项目时,有一个请求过去后,后台报这样的错java.lang.IllegalArgumentException: Request header is too large 原因:请求头超过 ...

  4. jQuery里$.post请求,后台返回结果为“json”格式,前台解析错误问题记录

    在JSP页面使用$.post请求后台返回json数据时,在最后 必须加上返回数据格式为json的才行.不然JSP页面解析会出错.

  5. .net MVC成长记录(一)

    今天第一次写博客,之前从学校出来,学了ASP.NET, 现在第一份工作接触的是MVC,在此便记录和分享一下学习MVC的过程,希望能和大家多一些交流.言归正传,首先给大家介绍一下MVC的基础知识. MV ...

  6. 将电脑浏览器User-Agent识别改成手机浏览器UA几种简单方法

    第一种方法:修改浏览器的快捷方式 右击桌面上的Chrome浏览器图标,在弹出的右键菜单中选择“复制”,复制一个图标副本到桌面.右击该副本,选择“属性”,打开相应的对话框,在“目标”文本框的字符后面添加 ...

  7. Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决

    一. 问题出现原因         我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...

  8. React Component 生命周期

    一般而言 Component 有以下三种生命周期的状态: Mounting:已插入真实的 DOM Updating:正在被重新渲染 Unmounting:已移出真实的 DOM 针对 Component ...

  9. java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)

    复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用:      由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...

  10. dubbo之本地伪装

    本地伪装 本地伪装 1 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败. 在 spring 配置文件中按以下方式配置: <dub ...