LA 4329 - Ping pong(树状数组)
来源:互联网 发布:单片机程序流程图画法 编辑:程序博客网 时间:2024/06/07 09:36
题目链接
该题非常经典,我们可以枚举每一个当裁判的人,将问题转化为求某个数左边和右边比他小的数有多少。
怎么办呢?我们先来求某个数左边比他技能值小的数字个数c[i],d[i]数组类似
我们知道树状数组可以快速求前缀和单点修改。 那么我们不妨将技能值作为bit数组下标,那么我们只需要从左向右扫一遍,每次单点更新,将当前技能值a[i]的个数+1,那么sum(a[i]-1)就是比当前能力值小的数字个数了。
细节参见代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<list>#include<cmath>#include<set>#include<queue>using namespace std;typedef long long ll;const int maxn = 20000 + 3;const int maxm = 100000 + 5;int T,n,m,l,r,a[maxn],c[maxn],x[maxm],d[maxn],bit[maxm+5];ll sum(int x) { ll ret = 0; while(x > 0) { ret += bit[x]; x -= (x & -x); } return ret;}void add(int x,int d) { while(x <= maxm) { bit[x] += d; x += (x & -x); }}int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); memset(bit,0,sizeof(bit)); memset(x,0,sizeof(x)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { add(a[i],1); c[i] = sum(a[i]-1); } memset(bit,0,sizeof(bit)); memset(x,0,sizeof(x)); for(int i=n;i>=1;i--) { add(a[i],1); d[i] = sum(a[i]-1); } ll ans = 0; for(int i=1;i<=n;i++) ans += (c[i]*(n-i-d[i])+d[i]*(i-c[i]-1)); printf("%lld\n",ans); } return 0;}
0 0
- LA 4329 Ping pong 树状数组
- LA 4329 Ping pong / 树状数组
- LA 4329 - Ping pong 树状数组
- LA 4329 - Ping pong(树状数组)
- LA 4329 Ping pong [树状数组]
- LA - 4329 - Ping pong(树状数组/线段树)
- LA 4329 - Ping pong 树状数组(Fenwick树)
- LA 4329 Ping pong乒乓比赛【树状数组】
- Beijing 2008 树状数组 ,LA 4329 Ping pong
- LA 4329 Ping pong
- LA 4329 Ping pong
- LA 4329 - Ping pong
- LA 4329 Ping pong
- LA 4329 Ping pong
- Ping pong(树状数组)
- LA-4329 Ping pong - treap (排名树)/树状数组求排名
- UVALive - 4329 Ping pong (树状数组)
- uvalive 4329 Ping pong---树状数组
- 关于使用模态窗口presentViewController跳转黑屏的解决
- 非递归学习树结构(四)--BST(二叉排序)树
- NAT介绍,防火墙介绍
- Light oj 1105 - Fi Binary Number(计数)
- java集合框架(上)
- LA 4329 - Ping pong(树状数组)
- C++11变参模板的参数包
- Linux Kernel CMPXCHG函数分析
- PMP之4 项目整合管理
- Pascal's Triangle
- 海尔称将开30000微店 家电巨头挖掘朋友圈商机
- 二叉搜索树
- scrollview嵌套listview
- 第三方框架