hdu5792--World is Exploding
题意:给一个数列,求四个各不相同的数,一个逆序对,一个正序对,求多少组这样的四个数。
题解:辣鸡如我,还是上官方题解了。

rg(i)就是i右边比i大的数的个数,rs(i)就是i右边比i小的数的个数。
lg(i)就是i左边比i大的数的个数,ls(i)就是i左边比i小的数的个数。
allg就是所有逆序对的个数,∑rs(i)或者∑lg(i)都可以。
然后答案就是对于每一个数,当它为正序对中较小的那个数时的答案相加。
这样算会有重复,就是那个正序对中较大的数也被算入了逆序对中,所以再减去每个数字作为正序对较大的数时的它所可能的逆序对数量。
注意用会超int 用long long
// 2016多校5-1012/hdu5792
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
#define PF(x) cout << "debug:" << x << " "; const int N = ;
typedef long long ll;
int a[N], b[N];
int lg[N], ls[N], rg[N], rs[N]; int bit[N]; int lowbit(int x) { return x&-x; } void add(int p, int v, int n)
{
while (p <= n) {
bit[p] += v;
p += lowbit(p);
}
} ll sum(int p)
{
ll ans = ;
while (p > ) {
ans += bit[p];
p -= lowbit(p);
}
return ans;
} int main(int argc, char const *argv[])
{
freopen("in", "r", stdin);
int n;
while (~scanf("%d", &n)) {
for (int i = ; i <= n; ++i) {
scanf("%d", a+i);
b[i] = a[i];
}
//离散话
sort(a+, a+n+);
int tot = unique(a+, a+n+) - a;
for (int i = ; i <= n; ++i) {
b[i] = lower_bound(a, a+tot, b[i]) - a;
}
//for (int i = 1; i <= n; ++i) printf("%d\n", b[i]);
//求lg ls
memset(bit, , sizeof bit);
for (int i = ; i <= n; ++i) {
ls[i] = sum(b[i]-);
lg[i] = i - - sum(b[i]);
add(b[i], , n);
}
//求rg rs
memset(bit, , sizeof bit);
for (int i = n; i > ; --i) {
rs[i] = sum(b[i]-);
rg[i] = n - i - sum(b[i]);
add(b[i], , n);
}
// cout << "ls "; for (int i = 1; i <= n; ++i) printf("%d ", ls[i]); printf("\n");
// cout << "lg "; for (int i = 1; i <= n; ++i) printf("%d ", lg[i]); printf("\n");
// cout << "rs "; for (int i = 1; i <= n; ++i) printf("%d ", rs[i]); printf("\n");
// cout << "rg "; for (int i = 1; i <= n; ++i) printf("%d ", rg[i]); printf("\n");
//求allg
ll allg = ;
for (int i = ; i <= n; ++i) allg += lg[i];
//PF(allg);
ll ans = ;
for (int i = ; i <= n; ++i) {
ans += (ll)rg[i] * (allg - lg[i] - rs[i]);
}
for (int i = ; i <= n; ++i) {
ans -= (ll)ls[i] * (lg[i] + rs[i]);
}
cout << ans << endl;
}
return ;
}
hdu5792--World is Exploding的更多相关文章
- hdu-5792 World is Exploding(容斥+树状数组)
题目链接: World is Exploding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- HDU5792 World is Exploding(树状数组)
一共6种情况,a < b且Aa < Ab, c < d 且Ac > Ad,这两种情况数量相乘,再减去a = c, a = d, b = c, b = d这四种情况,使用树状数组 ...
- HDU-5792 World is Exploding(树状数组)
题目大意:给一个整数序列,统计四元组(a,b,c,d)的个数,满足条件1:a<>b<>c<>d:条件2:<a,b>组成一个顺序对,<c,d> ...
- hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...
- World is Exploding(hdu5792)
World is Exploding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 5792---2016暑假多校联合---World is Exploding
2016暑假多校联合---World is Exploding Problem Description Given a sequence A with length n,count how many ...
- 2016 Multi-University Training Contest 5 World is Exploding
转载自:http://blog.csdn.net/queuelovestack/article/details/52096337 [题意]给你一个序列A,选出四个下标不同的元素,下标记为a,b,c,d ...
- HDU 5792 World is Exploding 树状数组+枚举
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Time Limit: 2000/1000 MS (Ja ...
- 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化
http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...
- HDU 5792 World is Exploding (树状数组)
World is Exploding 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...
随机推荐
- EOJ-1708//POJ3334
题意: 有一个连通器,由两个漏斗组成(关于漏斗的描述见描述). 现向漏斗中注入一定量的水,问最终水的绝对位置(即y轴坐标) 思路: 总体来说分为3种情况. 1.两个漏斗可能同时装有水. 2.只可能a漏 ...
- HDU4651+数学公式
见Goolgle http://zh.wikipedia.org/zh-cn/%E6%95%B4%E6%95%B8%E5%88%86%E6%8B%86 /* 数学公式 ans[i]:i可以有ans[i ...
- struts2文件下载 火狐浏览器的文件名乱码问题
这是一个文件下载的action,红色部分为火狐浏览器需要特地做的事情. @Controller @Scope(value = "prototype") public class F ...
- linux Ubuntu安装后没有引导 解决方案
用EasyBCD添加ubuntu grub2引导,适用于12.04 及之前版本的ubuntu安装好easybcd后运行,之后看图
- [itint5]Excel数转换
http://www.itint5.com/oj/#23 这里就是26进制的转换,但是要注意没有0,A就是1,Z就是26.所以要想象成从0开始,才能用原来的方法计算. //将十进制数转换为excel数 ...
- Android:@id和@+id
@id代表引用已有的id,而@+id是新增加一个id 如果使用@+id/name形式,当R.java中存在名为name变量时,则该组件会使用该变量的值作为标识.如果不存在该变量,则添加一个新的变量,并 ...
- Hibernate映射之实体映射<转载>
实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的.Hibernate支持xml配置文件与@注解配置两种方式.xm ...
- 西南科技大学第十届ACM程序设计竞赛题解
A.德州扑克 B. 我恨11(1089) 问题描述 11是一个孤独的数字,小明十分讨厌这个数字,因此如果哪个数字中出现了11或者该数字是11的倍数,他同样讨厌这个数字.现在问题来了,在闭区间[L,R] ...
- [2015编程之美] 资格赛C
#1150 : 基站选址 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 需要在一个N × M的网格中建立一个通讯基站,通讯基站仅必须建立在格点上. 网格中有A个用户,每个 ...
- 判断String为空
1. et_string.equals("")|| et_string==null 2. ""用equal.null用== TextUtils.isEmpt ...