[Vijos 1768] 顺序对的值
2024-08-25 03:16:07
顺序对的值
描述
给定一个序列a,a中任意两个元素都不等。如果i<j,且a[i]<a[j],则我们称a[i],a[j]为一个顺序对,这个顺序对的值是指a[i+1],a[i+2]…….a[j-1]中比a[i]大,且比a[j]小的数的个数。求一个序列中所有顺序对的值的和。
格式
输入格式
第一行一个数n,表示序列a中元素的个数。
第二行n个数,第i个数表示a[i]。
输出格式
输出一个数,序列a中所有顺序对的值的和。
样例1
样例输入1
5
1 5 3 4 2样例输出1
1
限制
每个测试点2s。
提示
对于100%的数据,2<=n<=5000,a[i]<=10^9。
题意
求下式的值:
\[\sum _{j=1} ^n \sum _{i=1}^{j-1} \sum _{k=i+1,a[i]<a[k]<a[j]}^{j-1}1\]
题解
一眼离散化思博题OwO...
每个数对于排在后面且大于它的数的所得到的答案的贡献等于排在它前面且小于它的数的个数.
所以考虑开两个能够快速维护前缀和的数据结构, 这样扫描一遍就可以解决.
两个数据结构一个用于计算贡献一个用于计算最终答案.
每次扫描到一个数之后在计算最终答案的结构中查询前缀和并累计到最终答案, 然后在计算贡献的结构中查询前缀和并向计算最终答案的结构中累加. 最后在计算贡献的结构中累加上这个数产生的贡献.
参考代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=; #define int long long int n;
int* ed;
int a[MAXN];
int d[MAXN];
long long c[MAXN];
long long l[MAXN]; int Pos(int);
int LowBit(int);
long long Query(long long*,int);
void Add(long long*,int,long long); signed main(){
int ans=;
scanf("%lld",&n);
for(int i=;i<=n;i++){
scanf("%lld",a+i);
d[i]=a[i];
}
std::sort(d+,d++n);
ed=std::unique(d+,d++n);
for(int i=;i<=n;i++){
int k=Pos(a[i]);
ans+=Query(c,k);
Add(c,k,Query(l,k));
Add(l,k,);
}
printf("%lld\n",ans);
return ;
} inline int Pos(int x){
return std::lower_bound(d+,ed,x)-d;
} inline void Add(long long* c,int x,long long d){
while(x<=n){
c[x]+=d;
x+=LowBit(x);
}
} inline long long Query(long long* c,int x){
long long ans=;
while(x>){
ans+=c[x];
x-=LowBit(x);
}
return ans;
} inline int LowBit(int x){
return x&-x;
}
Backup
最新文章
- PHP 正则表达式 基本规则
- 使用putty与SSHSecureShellClient登录远程服务器完成与本地Git项目的同步
- C#中根据变量获取变量名字符串
- [原创.数据可视化系列之三]使用Ol3加载大量点数据
- 2016 G面试题#2 不构造树的情况下验证先序遍历
- c++ const总结
- CSS练习一(模仿163邮箱登陆)
- Core Java Volume I — 3.6. Strings
- Data Base MongoDB 插入时间不正确的问题
- spring中Bean的注入类型
- Java API —— Set接口 &; HashSet类 &; LinkedHashSet类
- 在VC中,为图片按钮添加一些功能提示(转)
- cocos2d-x3.6 连连看连通画线
- shell中exec解析
- php抽奖概率算法(刮刮卡,大转盘)
- python 产生token及token验证
- Kali学习笔记24:Nikto、Skipfish
- 降维方法PCA与SVD的联系与区别
- Java:[面向对象:继承,多态]
- jQuery笔记二——基础/动画