[POJ3928 Ping pong]
[题目来源]:Beijing 2008
[关键字]:树状数组
[题目大意]:是要组成许多比赛,比赛的要求是,两个人比赛一个人作裁判,裁判的能力值必须要在两个人之间,位置也是,问一共有多少种不同的比赛方式。每个人的能力值各不相同。
//=====================================================================================================
[分析]:枚举一个中间点,查找它左边有几个比它能力值小的右边有几个比它能力值大的,根据乘法原理将其相乘;再查找它左边有几个比它能力值大的右边有几个比它能力值小的,根据乘法原理将其相乘。把每个点相加就是最终结果(int64)。剩下的问题就是如何求左右需要的值。先将其从小到大进行排序,然后按原来顺序枚举中间点,计算完后就将其插入它在排序后的位置上。所以统计时就是利用树状数组统计从1到枚举的中间点在排序后的位置之间有多少数,就是左边比它小的,用此时树状数组中的所有值(就是前i个数)的减去左边它小得和就是左边比它大的,再n到1来一遍就求出右边,再相乘。
[代码]:
1 program Project1; 2 type 3 rec = record 4 x, p: longint; 5 end; 6 var 7 n, tt: longint; 8 a: array[0..20010] of rec; 9 fmin, fmax, bmin, bmax, b, tree: array[0..20010] of longint; 10 11 procedure qs(l, r: longint); 12 var 13 i, j, mid: longint; 14 t: rec; 15 begin 16 i := l; 17 j := r; 18 mid := a[(l+r) shr 1].x; 19 repeat 20 while a[i].x < mid do inc(i); 21 while a[j].x > mid do dec(j); 22 if i <= j then 23 begin 24 t := a[i]; 25 a[i] := a[j]; 26 a[j] := t; 27 inc(i); 28 dec(j); 29 end; 30 until i > j; 31 if l < j then qs(l,j); 32 if i < r then qs(i,r); 33 end; 34 35 procedure init; 36 var 37 i: longint; 38 begin 39 read(n); 40 for i := 1 to n do 41 begin 42 read(a[i].x); 43 a[i].p := i; 44 end; 45 qs(1,n); 46 for i := 1 to n do b[a[i].p] := i; 47 end; 48 49 function lowbit(k: longint):longint; 50 begin 51 lowbit := k and -k; 52 end; 53 54 function find(k: longint):longint; 55 var 56 sum: longint; 57 begin 58 sum := 0; 59 while k >= 1 do 60 begin 61 sum := sum+tree[k]; 62 k := k-lowbit(k); 63 end; 64 exit(sum); 65 end; 66 67 procedure ins(k: longint); 68 begin 69 while k <= n do 70 begin 71 tree[k] := tree[k]+1; 72 k := k+lowbit(k); 73 end; 74 end; 75 76 procedure work; 77 var 78 i, temp: longint; 79 ans: int64; 80 begin 81 fillchar(tree,sizeof(tree),0); 82 for i := 1 to n do 83 begin 84 temp := find(b[i]); 85 fmin[i] := temp; 86 fmax[i] := find(n)-temp; 87 ins(b[i]); 88 end; 89 fillchar(tree,sizeof(tree),0); 90 for i := n downto 1 do 91 begin 92 temp := find(b[i]); 93 bmin[i] := temp; 94 bmax[i] := find(n)-temp; 95 ins(b[i]); 96 end; 97 //for i := 1 to n do writeln(fmin[i],'',fmax[i]); 98 ans := 0; 99 for i := 1 to n do100 ans := ans+(fmin[i]*bmax[i])+(fmax[i]*bmin[i]);101 writeln(ans);102 //readln;103 //readln;104 end;105 106 begin107 read(tt);108 while tt <> 0 do109 begin110 init;111 work;112 dec(tt);113 end;114 end.
转载于:https://www.cnblogs.com/procedure2012/archive/2011/11/02/2233264.html
[POJ3928 Ping pong]相关推荐
- POJ 3928 amp; HDU 2492 Ping pong(树阵评价倒数)
主题链接: PKU:http://poj.org/problem?id=3928 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Descript ...
- Ping pong【树状数组】
Ping pong UVALive - 4329 题目传送门 题目大意:一条大街上住着n个乒乓球爱好者,经常组织比赛切磋技术.每个人都有一个不同的技能值ai.每场比赛需要三个人:两名选手,一名裁判.他 ...
- ping/pong模式_PING的完整形式是什么?
ping/pong模式 PING:数据包InterNet Groper (PING: Packet InterNet Groper) In the sector of networking of co ...
- Unity3D 4.x怎样实现动画的Ping Pong效果
近期在看Unity官方的Stealth项目教学视频.视频使用的是Unity旧的版本号,而我如今正在使用的是Unity 4.5,动画系统的操作全然不同了.依照视频的方式根本无法设置动画的Ping Pin ...
- [UVALive - 4329] Ping pong 树状数组入门
题目链接:Ping pong 题意 给你n个数,你从中取3个数,要求中间的数字大小在两边数字之间.问你总共有多少种取法. 题解 这个题首先需要分析转化. 假设第i个人作为中间数 a1-ai−1有ci个 ...
- HDOJ 2492 Ping pong 线段树+离散化
//2492 Ping pong 线段树+离散化 /* 题意: 有一陀人从左到右排成一排,每个人有一个唯一的技能值,每个人都找其他人比赛, 比赛前要再找一个人做裁判,裁判的技能值不能比这两个人都高,也 ...
- go-gorilla的ping pong
业务需求,ping每隔60秒执行一次,ping两次后,没有得到pong的消息,自动切断client. pongTime=180 * time.Second pingTime=60 * time.Sec ...
- ping pong buffer
Ping pong buffer is a buffer used in a transmission that contains two separate buffers, while one bu ...
- Ping Pong Buffer 双缓冲 C++代码学习
1.Ping Pong Buffer 原理分析 基本原理如上图所示,当设备有数据来时,先放入缓冲区1 然后将缓冲区1的数据放入缓冲区2,这时缓冲区1可接收下次数据.工作区可从缓冲区2拿数据 2.C++ ...
最新文章
- 算法-二叉树中的最大路径和
- C#.NET操作数据库通用类(MS SQL Server篇)
- 学习能力和工作态度是准绳
- winforms中限定上传文件类型
- 视觉意识的主动推理模型
- lighttpd在proxy-core下path_info为空的修复
- 盘点vivo手机的HiFi之路 极致的信仰
- Capture One使用的几个小技巧
- stm32定时器4重映射
- 服务器外链图片不显示,新浪图床已限制图片外链使用(附解决方法)
- 机器学习实战 | SKLearn入门与简单应用案例
- 安卓产品方案开发广告机案例
- java-php-python-ssm医用物品管理系统计算机毕业设计
- LabVIEW编程LabVIEW开发 十六进制转换ASCII例程与相关资料
- 开发的激光测距仪PCBA方案设计
- Python GPU加速
- jquery的淡入,淡出事件 fadeIn fadeOut
- 能长期做到以下32点的程序员,达到月薪30K往上,不太难:
- 《深入解析Windows操作系统》笔记第1章
- 雄关漫道 我为磐石 | 介入手术机器人定义医学领域新格局
热门文章
- 【备战春招/秋招系列】美团Java面经总结进阶篇 (附详解答案)
- 团队项目改进与详细设计
- git上传到github
- sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解
- 【转】Fresco之强大之余的痛楚
- Hibernate学习之createSQLQuery与createQuery的区别及使用
- Domino下实现仿Google搜索提示效果
- Web前端JavaScript笔记(4)节点
- python环境设置和OpenCV-python配置
- JAVA程序员一定知道的优秀第三方库(2016版)