UVALive - 4329 Ping pong 树状数组
这题不是一眼题,值得做。
思路:
假设第个选手作为裁判,定义表示在裁判左边的中的能力值小于他的人数,表示裁判右边的中的能力值小于他的人数,那么可以组织场比赛。
那么现在考虑如何求得和数组。根据的定义知道我们要求的就是区间中能力值小于第i个人的能力值的数量,即能力值在区间的人数。我们定义表示能力值为i的人的数量。利用树状数组从左到右动态更新与维护很容易得到数组,同理得到数组。
注意:答案应该是longlong类型。
AC代码
//#define LOCAL
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;
const int maxn = 20000+5;
int cnt[100000+5], Rank[maxn];
int left[maxn], right[maxn];
int maxRank;
int lowbit(int x) {
return x&-x;
}
void init() {
memset(cnt, 0, sizeof(cnt));
}
int getSum(int x) {
int res = 0;
while(x > 0) {
res += cnt[x];
x -= lowbit(x);
}
return res;
}
void update(int x, int d) {
while(x <= maxRank) {
cnt[x] += d;
x += lowbit(x);
}
}
void solve(int start, int end, int u, int *a) {
for(int i = start; i != end; i += u) {
a[i] = getSum(Rank[i]-1);
update(Rank[i], 1);
}
}
int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif // LOCAL
int T, n;
scanf("%d", &T);
while(T--) {
init();
maxRank = -inf;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &Rank[i]);
maxRank = max(maxRank, Rank[i]);
}
solve(0, n, 1, left);
init();
solve(n-1, -1, -1, right);
LL ans = 0;
for(int i = 0; i < n; i++) { //枚举每一位裁判
ans += (LL)left[i] * (n-1-i-right[i]);
ans += (LL)right[i] * (i-left[i]);
}
printf("%lld\n", ans);
}
return 0;
}
如有不当之处欢迎指出!
UVALive - 4329 Ping pong 树状数组的更多相关文章
- LA 4329 Ping pong 树状数组
对于我这样一名脑残ACMer选手,这道题看了好久好久大概4天,终于知道怎样把它和“树状数组”联系到一块了. 树状数组是什么意思呢?用十个字归纳它:心里有数组,手中有前缀. 为什么要用树状数组?假设你要 ...
- LA 4329 - Ping pong 树状数组(Fenwick树)
先放看题传送门 哭瞎了,交上去一直 Runtime error .以为那里错了. 狂改!!!!! 然后还是一直... 继续狂改!!!!... 一直.... 最后发现数组开小了.......... 果断 ...
- Ping pong(树状数组经典)
Ping pong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- poj3928 Ping pong 树状数组
http://poj.org/problem?id=3928 Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- UVA 1428 - Ping pong(树状数组)
UVA 1428 - Ping pong 题目链接 题意:给定一些人,从左到右,每一个人有一个技能值,如今要举办比赛,必须满足位置从左往右3个人.而且技能值从小到大或从大到小,问有几种举办形式 思路: ...
- LA4329 Ping pong 树状数组
题意:一条大街上住着n个乒乓球爱好者,经常组织比赛切磋技术.每个人都有一个能力值a[i].每场比赛需要三个人:两名选手,一名裁判.他们有个奇怪的约定,裁判必须住在两名选手之间,而裁判的能力值也必须在两 ...
- POJ 3928 Ping pong 树状数组模板题
開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...
- HDU 2492 Ping pong (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Problem Description N(3<=N<=2000 ...
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
UVAlive 4329 Ping pong 题目: Ping pong Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: % ...
随机推荐
- video.js不能控制本地视频或者音频播放时长
问题: 把视频放到本地,然后对视频进行测试,想要控制视频或者音频的播放时长,没办法做到,每次拉动进度条,都会使得本地视频重新播放 原因: 所有浏览器默认js无法访问本地地址,也就是说js不能对本地文件 ...
- Navicat查询结果不能修改的原因
问题: 开发中常使用Navicat查询数据库,并修改数据库中的值.今天发现查询结果为只读,不能修改.一般连表查不能修改我是知道的,但是单表查居然不能修改. 解决方法: 查了下,有说表是只读,也有说是权 ...
- Halcon一日一练:Halcon异常判断方法
1.TryCatch tryCatch处理的方式如下: try *可能会出现错误的语句 .... catch(Exception) *获取错误代码 ErrorCode:=Exception[] **对 ...
- wamp图标为黄色(非端口号问题)
1.Win键+R 输入:services.msc 进入服务,找到wamp,看哪个服务没有启动 2.手动启动apache服务失败,弹出以下错误 3.然后在cmd命令行中切换到你的apache的bin目 ...
- linux判断文件是否存在
#!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" # 这里的-x 参 ...
- ajax请求获取实时数据
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- *C语言有关指针的变量声明中的几个易错点
转至:http://my.oschina.net/ypimgt/blog/108265 Technorati 标签: 指针, typedef, const, define 我们都知道,至少听说过 ...
- docker命令行学习
docker命令行学习 docker run docker run --help:老实说这条最管用了 docker run -it:交互模式,允许控制台输出 docker run -d:detach, ...
- 异常检测算法:Isolation Forest
iForest (Isolation Forest)是由Liu et al. [1] 提出来的基于二叉树的ensemble异常检测算法,具有效果好.训练快(线性复杂度)等特点. 1. 前言 iFore ...
- 《Thinking in Java》学习笔记(一)
服务器端的编程可以参考另一本书<企业Java编程>(Thinking in Enterprise Java). 1.基本类型 基本型别 大小 最小值 最大值 默认值 boolean -- ...