Codeforces Beta Round #57 (Div. 2) Enemy is weak
2016-02-04 23:28
239 查看
E. Enemy is weak
time limit per test5 seconds
memory limit per test
256 megabytes
The Romans have attacked again. This time they are much more than the Persians but Shapur is ready to defeat them. He says: "A lion is never afraid of a hundred sheep".
Nevertheless Shapur has to find weaknesses in the Roman army to defeat them. So he gives the army a weakness number.
In Shapur's opinion the weakness of an army is equal to the number of triplets i, j, k such that i < j < k and ai > aj > ak where ax is the power of man standing at position x. The Roman army has one special trait — powers of all the people in it are distinct.
Help Shapur find out how weak the Romans are.
Input
The first line of input contains a single number n (3 ≤ n ≤ 106) — the number of men in Roman army. Next line contains n different positive integers ai (1 ≤ i ≤ n, 1 ≤ ai ≤ 109) — powers of men in the Roman army.
Output
A single integer number, the weakness of the Roman army.
Please, do not use %lld specificator to read or write 64-bit integers in C++. It is preffered to use cout (also you may use %I64d).
Sample test(s)
input
3 3 2 1
output
1
input
3 2 3 1
output
0
input
4 10 8 3 1
output
4
input
4 1 5 4 3
output
1
题意是找到i > j > k且满足ai < aj < ak的数据的组数。
我们不妨按照中间的数进行考虑,就可以确定x是j的顺序的数的个数,y是j的逆序数的个数,这样的数的组数是x * y
求逆序对数的方法之前已经说过,这里稍作修改从前往后遍历,思想相同。代码如下:
/************************************************************************* > File Name: Enemy_is_weak.cpp > Author: Zhanghaoran > Mail: chilumanxi@xiyoulinux.org > Created Time: 2016年02月04日 星期四 22时18分58秒 ************************************************************************/ #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; long long n; struct node{ long long num; long long pos; }nn[1000010]; long long uu[1000010]; long long tree[1000010]; long long ans; long long aa[1000010]; long long bb[1000010]; long long cc[1000010]; bool cmp(node a, node b){ return a.num < b.num; } void add(long x){ while(x < 1000010){ tree[x] ++; x += x & -x; } } long long check(long x){ long long sum = 0; while(x){ sum += tree[x]; x -= x & -x; } return sum; } int main(void){ cin >> n; for(long long i = 1; i <= n; i ++){ scanf("%I64d", &nn[i].num); nn[i].pos = i; } sort(nn + 1, nn + 1 + n, cmp); for(long long i = 1; i <= n; i ++){ uu[nn[i].pos] = i; } for(long long i = 1; i <= n; i ++){ aa[uu[i]] = check(uu[i]); bb[uu[i]] = i - aa[uu[i]] - 1; cc[uu[i]] = uu[i] - 1 - aa[uu[i]]; ans += cc[uu[i]] * bb[uu[i]]; add(uu[i]); } cout << ans << endl; }
查看原文:http://chilumanxi.org/2016/02/04/codeforces-beta-round-57-div-2-enemy-is-weak/
相关文章推荐
- Age Sort
- 从汇编看前++和后++问题
- hihoCoder - 1089 - 最短路径·二:Floyd算法
- TextView设置selector后,没有点击效果
- 2016年规划
- 【BZOJ4370】【IOI2015】horses 数据结构 平衡树+线段树
- [Win32]路径操作API函数
- HDU 3072 Intelligence System(强连通分量)
- 计算机网络5--网络核心之数据交换基础及电路交换
- 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
- 去掉程序的用户账户控制提示
- Assemble
- docker学习(8) 在mac机上搭建私有仓库
- 关于 GLFW
- 面试笔试杂项积累-leetcode 106-110
- 第16、17课Java零基础面向对象编程实战课堂笔记
- POJ1904(有向图缩点+输入输出挂参考)
- 016 记一次失败的Visual Stdio安装经历
- UVA--10462
- c++ 关键字: volatile