题意:从左到右给你n个不同的数值,让你找出三个数值满足中间的数值在两边的数值之间的个数。

析:题意还是比较好理解的,关键是怎么求数量,首先我们分解一下只有两种情况,一个是左边<中间<右边,另一种是左边>中间>右边(因为数值都不相同嘛)。

我们考虑第i个数值在中间的情况。假设a1到ai-1中有ci个比ai小的,那么就有(i-1)-ci个比ai大的(因为不包括第i个数)。同理,假设有ai+1到an中有di个比ai小,那么有(n-i)-di个比ai大,那么一共就有ci(n-i-di) + (i-ci-1)di种。问题就转化为求ci和di。

ci可以这样计算:从左到右扫描所有的ai,令x[j]表示目前为止已经考虑过的所有的ai中是否存在一个ai=j(x[j] = 1表示存在, x[j] = 0表示不存在),则ci就是前缀和x[1]+x[2]+...+x[ai-1]。初始时所有x[i]=0,在计算ci时,要先设x[ai]=1;然后求前缀和。说到这就很明显是一个数状数组的题了。利用数状数组求前缀和时间复杂度低。在O(nlogr)(r为ai的上限)时间内可计算出ci。同理可计算出di。总是时间复杂度是O(n)。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn = 100000 + 10;
int sum[maxn], n, a[maxn], x[maxn], y[maxn]; int lowbit(int x){
return x & (-x);
} int getsum(int i){
int s = 0;
while(i > 0){
s += sum[i];
i -= lowbit(i);
}
return s;
} void add(int i){
while(i < maxn){
++sum[i];
i += lowbit(i);
}
return ;
} int main(){
int T; cin >> T;
while(T--){
scanf("%d", &n);
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]); for(int i = 1; i <= n; ++i){
x[i] = getsum(a[i]);
add(a[i]);
} memset(sum, 0, sizeof(sum));
for(int i = n; i > 0; --i){
y[i] = getsum(a[i]);
add(a[i]);
} long long ans = 0;
for(int i = 2; i < n; ++i)
ans += (long long)x[i] * (n-i-y[i]) + (long long)y[i] * (i-1-x[i]);
printf("%lld\n", ans);
}
return 0;
}

最新文章

  1. Ubuntu安装Eclips for C/C++及相关配置
  2. C#加密NodeJS解密
  3. SQL中存储过程和自定义函数的区别
  4. yii2在ubuntu下执行定时任务
  5. 转载——SqlServer之like、charindex、patindex
  6. NHIBERNATE之映射文件配置说明(转载4)
  7. Sql server 事务的两种用法
  8. Face Alignment at 3000FPS(C++版)工程配置
  9. 使用JS模拟出Map对象
  10. HDU 5857 Median
  11. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
  12. 解决ssh连接linux服务器速度慢
  13. 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙
  14. pwcrack--一款集合多种md5解密的工具
  15. vue 自定义组件directives
  16. Warning: Attempt to present A on B whose view is not in the window hierarchy!
  17. How to use Qt Designed Ui file
  18. 516.Longest Palindromic subsequence---dp
  19. lsb_release查看当前系统的发行版信息
  20. maven入门学习(一)

热门文章

  1. 前端开发-2-HTML
  2. UI5-文档-4.21-Data Types
  3. 条件语句;for循环 嵌套复习
  4. 根据条件决定My97DatePicker日期控件弹出的日期格式
  5. 获取Activity中得到焦点的EditText
  6. css字体加粗
  7. Android使用HTTPS进行IP直连握手失败问题(okHttp)
  8. Redis启动与使用
  9. 图片添加热点MAP之后连接无效的解决方法
  10. Dom对象总结介绍&amp;事件介绍&amp;增删查找标签