Ping pong
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1143 Accepted Submission(s): 387
Problem Description
N(3<=N<=20000) ping pong players live along a west-east street(consider the street as a line segment).
Each player has a unique skill rank. To improve their skill rank, they often compete with each other. If two players want to compete, they must choose a referee among other ping pong players and hold the game in the referee's house. For some reason, the contestants can’t choose a referee whose skill rank is higher or lower than both of theirs.
The contestants have to walk to the referee’s house, and because they are lazy, they want to make their total walking distance no more than the distance between their houses. Of course all players live in different houses and the position of their houses are all different. If the referee or any of the two contestants is different, we call two games different. Now is the problem: how many different games can be held in this ping pong street?
Input
The first line of the input contains an integer T(1<=T<=20), indicating the number of test cases, followed by T lines each of which describes a test case.
Every test case consists of N + 1 integers. The first integer is N, the number of players. Then N distinct integers a1, a2 … aN follow, indicating the skill rank of each player, in the order of west to east. (1 <= ai <= 100000, i = 1 … N).
Output
For each test case, output a single line contains an integer, the total number of different games.
Sample Input
Sample Output
题目大意:每一个人都有一个实力值,顺序就是他的位置,要求寻找一个对手,然后再寻找一个裁判,要求裁判的实力再他们之间,而且位置要在他们两人的中间,这样可以组成一场比赛。问总共可以组织多少场比赛?
解题思路:以自己为裁判,然后找左边有多少人比较小,再找右边有多少人比自己大,然后两个数相乘就是以他为裁判的比赛场数,当然还有相反的,找右边比自己小的,左边比自己大的,再相乘相加。这样子就变成了:和找逆序数、顺序数差不多了,找左边(右边)比自己大(小)有多少个数,用树状数组最好最快!所以两个for循环就全部找到,然后相乘相加,搞定!!!!!!!
我的代码:
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
const int MAX = 100005;
int a[MAX+1], b[MAX+1];
int c[MAX+1], d[MAX+1], e[MAX+1], f[MAX+1];
int n;
int lowbit(int i)
{
return i&(-i);
}
void update(int i, int x)
{
while(i <= MAX)
{
a[i] += x;
i += lowbit(i);
}
}
int sum(int i)
{
int sum = 0;
while(i > 0)
{
sum += a[i];
i -= lowbit(i);
}
return sum;
}
int main()
{
int i, t;
long long ans;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
memset(a, 0, sizeof(a));
for(i = 1; i <= n; i++)
{
scanf("%d", &b[i]);
}
ans = 0;
for(i = 1; i <= n; i++)
{
update(b[i], 1);
c[i] = sum(MAX)-sum(b[i]); //求左边有多少个数比自己大
d[i] = sum(b[i]-1); //求左边有多少个数比自己小
}
memset(a, 0, sizeof(a));
for(i = n; i >= 1; i--)
{
update(b[i], 1);
e[i] = sum(MAX)-sum(b[i]); //求右边有多少个数比自己大
f[i] = sum(b[i]-1); //求右边有多少个数比自己小
}
for(i = 1; i <= n; i++)
{
///1.左边比自己大的数*右边比自己小的数
///2.左边比自己小的数*右边比自己大的数
ans += c[i]*f[i] + d[i]*e[i]; //相加就是总和
}
printf("%I64d\n", ans);
}
return 0;
}
分享到:
相关推荐
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要采用特殊的算法来实现这些运算,这种...
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...
标题中的“算法-数塔(HDU-2084)”是指一个编程竞赛题目,源自杭州电子科技大学(HDU)的在线编程平台。在这个问题中,参赛者被要求解决一个名为“数塔”的算法挑战。数塔问题通常涉及到递归、深度优先搜索(DFS)...
2. 对输入的n个数,按顺序逐个插入线段树。插入过程中,如果遇到已经存在于树中的数字,需要先将旧的数字移除,再重新插入,以确保每个数字在树中只出现一次。 3. 对于每个区间 `[ai, bi]`,按照`bi`的大小对区间...
【标签】"DP HDU"强调了这道题目与动态规划(DP)以及HDU在线判题系统的关系。动态规划是一种通用的算法技巧,适用于多种问题,而HDU标签则表明这是该平台上的一个挑战。 【压缩包子文件的文件名称列表】:"DP"可能...
在这里,"obj" 可能是用户对这类文件的简写,或者指代与 HDU OJ 相关的某些特定功能或服务。 【压缩包子文件的文件名称列表】只有一个文件名 "hdu",这可能是一个目录或者压缩包内其他文件的父目录,也可能是因为...
HDU1059的代码
【ACM入门与提高:HDU ACM竞赛课程详解】 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)是一项全球性的竞赛,旨在激发大学生对计算机科学的兴趣,提升他们的...
hdu1001解题报告
hdu 1574 passed sorce
hdu2101AC代码
### hdu1290解题报告 #### 题目背景与意义 此题作为对杭州电子科技大学五十周年校庆的献礼,通过一道趣味性的数学问题来庆祝这一重要时刻。题目背景设置在一个充满想象力的情境下,即如何通过不同数量的切刀将一个...
【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...
【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...
HDU图论题目分类 HDU图论题目分类是指在杭州电子科技大学(Hangzhou Dianzi University)的判题平台HDU OJ(Online Judge)上收录的一系列图论题目的分类。本分类涵盖了图论领域的多种类型的题目,涉及到图论的基本...
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。