模拟赛 弱点(时间限制:2S;空间限制:256MB)
2014-11-04 17:04
260 查看
题目描述
一队勇士正在向你进攻,每名勇士都有一个战斗值ai。但是这队勇士却有一个致命弱点,如果存在i<j<k使得ai>aj>ak,则会影响他们整体的战斗力。我们将这样的一组(i,j,k)称为这队勇士的一个弱点。请求出这队勇士的弱点数目。输入
输入文件:weakness.in输入的第一行是一个整数n,表示勇士的数目。
接下来一行包括n个整数,表示每个勇士的战斗值ai。
输出
输入文件:weakness.out输出为一行,包含一个整数。表示这队勇士的弱点数目。
输入样例
410 8 3 1
输出样例
4数据范围
对于30%的数据,3<=n<=100对于100%的数据,3<=n<=1000000
对于100%的数据,1<=ai<=1000000,每个ai均不相同
题解
树状数组,枚举中间点。两边像取逆序对一样做即可。#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<cmath> #include<algorithm> #define inf 1<<30 #define ll long long #define MAXN 1000005 using namespace std; int n,a[MAXN],maxs; int tr[MAXN],p[MAXN],q[MAXN]; ll ans; void init() { scanf("%d",&n); int i; for(i=1;i<=n;i++) {scanf("%d",&a[i]); maxs=max(maxs,a[i]); } } int lowbit(int x) {return x&(-x);} int find(int x) { int sum=0; for(;x<=maxs;x+=lowbit(x)) sum+=tr[x]; return sum; } void insert(int x) { for(;x>0;x-=lowbit(x)) tr[x]++; } void work() { int i; for(i=1;i<=n;i++) {p[i]=find(a[i]+1); insert(a[i]); } memset(tr,0,sizeof(tr)); for(i=n;i>0;i--) {q[i]=n-i-find(a[i]+1); insert(a[i]); } for(i=1;i<=n;i++) ans+=(ll)p[i]*q[i]; printf("%I64d\n",ans); } int main() { freopen("weakness.in","r",stdin); freopen("weakness.out","w",stdout); init(); work(); return 0; }
相关文章推荐
- 模拟赛 滑动的窗户(时间限制:3s;空间限制256MB)
- 模拟赛 藏宝图(时间限制:2s,空间限制:256MB)
- 模拟赛 买汽水(时间限制:2s,空间限制:128MB)
- 模拟赛 花园的守护之神(时间限制:1s;空间限制:256MB)
- 模拟赛 狐狸的谜语(时间限制:1s,空间限制:128MB)
- 模拟赛 计算(时间限制:1s;空间限制 64MB)
- 模拟赛 人偶师(时间限制:1000MS,空间限制:256MB)
- 模拟赛 球的序列(时间限制1s,内存限制256MB)
- 模拟赛 改造二叉树(时间限制 1s;空间限制 256M)
- 模拟赛 栅栏迷宫(时间限制:1000MS 空间限制:256MB)
- 模拟赛 密室逃脱(时间限制:1s;空间限制:256MB)
- 模拟赛 字符串(时间限制:1s;空间限制:256MB)
- 模拟赛 感冒病毒(时间限制:1s;空间限制:256MB)
- 模拟赛 序列问题(时间限制:1s;空间限制:128MB)
- 模拟题 宠物之战(时间限制:1s;空间限制:256MB)
- 模拟赛 最大公约数(时间限制:1s,空间限制:128MB)
- 模拟赛 数位和乘积(时间限制 1000MS,内存限制 256MB)
- 模拟赛 祖孙询问(时间限制:1s;空间限制:128MB)
- 模拟赛 数字(时间限制:1s;空间限制:128MB)
- 模拟赛 长途旅行(时间限制:1s;空间限制:256M)