题目链接:Ping pong

题意

给你n个数,你从中取3个数,要求中间的数字大小在两边数字之间。问你总共有多少种取法。

题解

这个题首先需要分析转化。

假设第i个人作为中间数
a1~ai−1有ci个数小于ai,那么有(i−1−ci)个数大于ai;{a_1~a_{i-1}有c_i个数小于a_i,那么有(i-1-c_i)个数大于a_i;}a1​~ai−1​有ci​个数小于ai​,那么有(i−1−ci​)个数大于ai​;
ai+1~an有di个数小于ai,那么有(n−i−di)个数大于ai{a_{i+1}~a_n有d_i个数小于a_i,那么有(n-i-d_i)个数大于a_i}ai+1​~an​有di​个数小于ai​,那么有(n−i−di​)个数大于ai​

那么ans=∑i=1n(ci∗(n−i−di)+di∗(i−1−ci)){ans=\sum_{i=1}^n(c_i*(n-i-d_i)+d_i*(i-1-c_i))}ans=∑i=1n​(ci​∗(n−i−di​)+di​∗(i−1−ci​))

显而易见,这个题就可以转化为求解ci和di。{c_i和d_i。}ci​和di​。

由于本题对位置有要求所以无法排序,如果暴力的话,你需要O(n2){O(n^2)}O(n2)的时间复杂度,很明显会超时。此时可以用树状数组来维护一个以ai{a_i}ai​为下标的二叉索引树x,那么x[a[i]]代表a[i]出现的次数,此时ci=x1+x2+....+xi−1{c_i=x_1+x_2+....+x_{i-1}}ci​=x1​+x2​+....+xi−1​,每遇到一个aia_iai​,就add(a[i],1)。同理di{d_i}di​就倒着遍历计算即可。树状数组计算前缀和的时间复杂度为O(logr)r为ai的上限{O(logr)r为a_i的上限}O(logr)r为ai​的上限,所以总体时间复杂度为O(nlogr){O(nlogr)}O(nlogr)。

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
//extern "C"{void *__dso_handle=0;}
typedef long long ll;
typedef long double ld;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define lowbit(x) x&(-x)const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const int maxm=2e5+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int a[maxn],n,c[maxn],d[maxn];
int x[maxm];
int sum(int d)
{ll sum=0;while(d>=1) {sum+=x[d]; d-=lowbit(d);}return sum;
}
void add(int d) {while(d<=100000) {x[d]+=1;d+=lowbit(d);}
}
int main()
{int t;cin >> t;while(t--){cin >> n;for(int i=1;i<=n;i++) cin >> a[i];memset(x, 0, sizeof(x));for(int i=1;i<=n;i++){c[i]=sum(a[i]);add(a[i]);}memset(x, 0, sizeof(x));for(int i=n;i>=1;i--){d[i]=sum(a[i]);add(a[i]);}ll sum=0;for(int i=1;i<=n;i++)sum+=c[i]*(n-i-d[i])+d[i]*(i-1-c[i]);cout << sum << endl;}
}

[UVALive - 4329] Ping pong 树状数组入门相关推荐

  1. 树状数组入门——以洛谷3374为例

    树状数组入门 含义:顾名思义,用树状表示的数组 功能:是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log( ...

  2. UVALive 4329 Ping pong

    树状数组.考虑ai(从0开始,则i左边共i个,右边n-i-1个),左边有x个比他大的,i-x个比他小的,右边有y个比他大的,n-i-1-y个比他大的.交叉乘一下就得到了以ai为裁判的比赛总数.把所有人 ...

  3. POJ 1990 (树状数组入门)

    MooFest Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a socia ...

  4. 20220725树状数组入门反思

    最近学习了树状数组和线段树,图论一点点啃吧,然后首先介绍一下树状数组的原理: 借用acwing一老哥的题解了. 树状数组的本质思想是使用树结构维护"前缀和",从而把时间复杂度降为O ...

  5. hdu 6203 ping ping ping(贪心+树状数组+dfs序)

    题目链接:hdu 6203 ping ping ping 题意: 给你一棵n+1个节点树,现在有q条路径不通,问你最少有多少个节点坏掉了. 题解: 考虑贪心,对这q条路径求一下lca,按照lca的深度 ...

  6. 树状数组入门(有被精简的树状数组所震撼到)

    1264. 动态求连续区间和 模板题,代码如下 #include <iostream> using namespace std;const int N = 1e5 + 10; int tr ...

  7. HDU 1166 (树状数组入门)

    题目链接 : 点击进入 AC代码: #include<iostream> #include<cstring> #include<math.h> #include&l ...

  8. hdu 1166 敌兵布阵 树状数组 模板题

    这题是树状数组入门的一模板题,非常基础,被小白成为"赤裸裸"的入门题,哈哈,一个plus,一个sum全部搞定 #include<stdio.h> #include< ...

  9. Stars(树状数组)

    题意: m个星星,一个星星的等级取决于有多少其他星星的横纵坐标不大于它,如果有x个,该星星等级为x 问各个等级的星星有多少个? (题目会按照y的升序给出星星坐标) 题解: 树状数组入门题(不要问我为什 ...

最新文章

  1. 《结网》十年,《结网2》开启产品经理的无限游戏
  2. 谷歌发布TensorFlow,用于测试人工智能模型的隐私保护
  3. Linux新手要了解的十个知识点
  4. lastpass安卓最新版_LastPass
  5. Java Stream(流)的分类, 四大基本流的介绍
  6. ScaleAnimation动画
  7. Windows XP下Service的编程入门[2]
  8. 微信小程序图片上下有等值空白问题
  9. python一个对象只能被一个变量引用吗_Python中的变量、对象、引用
  10. 活动回顾 | 智慧城市的发展趋势与挑战
  11. 0505.Net基础班第二十天(基础加强总复习)
  12. Linux查看安装了哪些软件
  13. Atitit 网关协议cgi wsgi fcgi fastcgi 目录 1.1. CGI(common gateway unterface) 1 1.2. 2.1 WSGI: 1 1.3. 2.3
  14. java游戏2333整合包,3dm游戏运行库合集离线安装包
  15. AD637 有效值检测
  16. word打开老是配置进度_打开word文档显示配置进度怎么办 Word文档提示配置进度解决办法...
  17. Tomcat的appBase和docBase解析
  18. MAC系统查看端口,并关闭端口占用
  19. 简单计算机java程序_JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单...
  20. Chris Hadfield現身《ABS 2020》,各方菁英和THORBOT 雷神量化機器人一同進行深入探討

热门文章

  1. 详解pandas编码函数pd.factorize()
  2. 如何写一个proto消息
  3. android 常用加密,Android的加密缓存(上)--JCA基础
  4. eq, neq.gt,ge,lte,lt,not,mod的含义
  5. 2016年上半年信息系统监理师考试感想
  6. 文章:Mapping regulatory variants controlling gene expression in drought response and tolerance
  7. android应用统计获取api,APICloud
  8. Android中为网络图片设置高斯模糊效果
  9. java游戏服务器面试_服务器 面试
  10. 腾讯优图|人脸3D重建与渲染技术研究与应用