hoj 2275 Number Sequence

来源:互联网 发布:看电影软件不付费 编辑:程序博客网 时间:2024/06/05 08:05

知道两点即可:

一:计算出每个Ai,之前以及之后比他小的个数做乘法运算,然后求和,即是最后结果

二:找出Ai之前比Ai小的数,可以用树状数组,同理求之后的数也一样;

#include <iostream>#include <cstring>#include <cstdio>#define MAXN 50010using namespace std;int N;int c[MAXN], a[MAXN], b[MAXN], d[MAXN];int lowbit( int x ){return x&(-x);}void UFset(int i, int data){while(i <= 32768){c[i] += data;i += lowbit(i);}}int Querry( int x ){int sum = 0;while(x > 0){sum += c[x];x -= lowbit(x);}return sum;}int main(){int i;long long ans;while(scanf("%d", &N) != EOF){memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));for(i = 0; i < N; ++i){scanf("%d", &d[i]);a[i] += Querry( d[i] );//在输入的时候就计算i之前的值比它小的值有多少个UFset( d[i] + 1, 1 );//然后再更新}memset(c, 0, sizeof(c));for(i = N-1; i >= 0; --i){b[i] = Querry(d[i]);UFset(d[i] + 1, 1);}ans = 0;for(i = 0; i < N; ++i)ans += (long long)a[i] * (long long)b[i];printf("%lld\n", ans);}return 0;}


 

原创粉丝点击