顺序对的值

描述

给定一个序列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...

每个数对于排在后面且大于它的数的所得到的答案的贡献等于排在它前面且小于它的数的个数.

所以考虑开两个能够快速维护前缀和的数据结构, 这样扫描一遍就可以解决.

两个数据结构一个用于计算贡献一个用于计算最终答案.

每次扫描到一个数之后在计算最终答案的结构中查询前缀和并累计到最终答案, 然后在计算贡献的结构中查询前缀和并向计算最终答案的结构中累加. 最后在计算贡献的结构中累加上这个数产生的贡献.

参考代码

GitHub

 #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

[Vijos 1768] 顺序对的值的更多相关文章

  1. 【vijos】1768 顺序对的值(特殊的技巧)

    https://vijos.org/p/1768 之前不知道为什么,我yy了一个n^2的做法,但是没能写出来..sad 然后看了题解才发现这题好神.. 为什么一定要照着题意找两个点然后算呢?这就是问题 ...

  2. 各种Map的区别,想在Map放入自定义顺序的键值对

    今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...

  3. 顺序表删除值为 x 的元素

    思路: 不要去考虑删除的字眼,要考虑如何进行保存非 x 的值 这里提供两种解法,殊途同归: 1.将其中非 x 的元素统计并保存 2.统计为 x 的元素个数,并将非 x 的元素保存 注意事项: 注意这里 ...

  4. 【19.00%】【vijos p1906】联合权值

    描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ...

  5. java后台如何根据表单中input的顺序获取value值

    如果java后台准备用Servlet来实现,可以直接在doPost( )或者doGet( )中使用如下语句:request.setCharacterEndoding("UTF-8" ...

  6. easyui combobox 设置值 顺序放在最后

    easyui combobox 设置值 顺序放在最后 如果设置函数.又设置选中的值,注意顺序, 设置值需要放到最后,否则会设置了之后又没有了: $('#spanId'+i).combobox(res) ...

  7. 深入理解CSS中的层叠上下文和层叠顺序(转)

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=5115 零.世间的道 ...

  8. LoadRunner脚本实例来验证参数化的取值

    LoadRunner脚本实例来验证参数化的取值 SINM {3]!G0问题提出:  主要想试验下,在Controller中,多个用户,多次迭代中参数的取值.51Testing软件测试网(['H5f,d ...

  9. 深入理解CSS中的层叠上下文和层叠顺序

    零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈.比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上.再比如说话语权,老婆的话永远是对的,领导的话永远是对的. 在C ...

随机推荐

  1. No result defined for action and result input

    今天在编程的时候,我遇到了No result defined for action and result input的错误,这个错误想必大家都有遇到过吧,我今天发了很长时间弄这个错误,我以为我的Act ...

  2. vim操作命令备忘

    vim操作命令备忘 查找/替换 :%s/keyword//gn //搜索匹配的关键词数量 :%s/keywords/target //替换关键词 待续……

  3. Field [_id] is a metadata field and cannot be added inside a document. Use the index API request parameters--转

    https://github.com/elasticquent/Elasticquent/issues/53 the data is coming from a Mongo DB instance. ...

  4. nginx配置样例

    简单的nginx配置如下,包含了静态文件配置.websocket.socket.io的配置: user nobody; worker_processes 3; #master_process off; ...

  5. Autocomplete 自动提示

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  6. 按照拼音排序的SQL语句条件

    ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_PINYIN_M')

  7. 搭建和启动javaWeb项目

    首先,我们得配置服务器,我的demo采用tomcat 你只要找到tomcat的home路径就好了,后面会自动给你提示的

  8. eclipse的debug技巧之一

    如下图,断点设置的地方会在i==0时就停住,假如我们想在i等于某个值的时候才停住,那么可以添加“过滤条件” 具体操作是在debug模式下,右键breakpoints标签下我们所设置的断点,点击右键菜单 ...

  9. java设计模式-----5、原型模式

    原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例.使用原型模式创建的实例,具有与原型一样的数据. 原型模式的特点: 1.由原型对象自身创建目标对象.也就是说 ...

  10. SQL语句的拼凑

    StringBuilder sql = new StringBuilder("SELECT * FROM t_customer WHERE 1=1"); /* * 2. 判断条件, ...