码迷,mamicode.com
首页 > 其他好文 > 详细

tyvj 1432 楼兰图腾

时间:2018-03-19 20:55:45      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:can   ios   sum   const   efi   str   cli   size   code   

树状数组

本题数据有误
对于每一个点用权值树状数组维护在这个点之后之前的比他大和比他小的数

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <map>
#include <climits>
using namespace std;

#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r

typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2e5+10;
int T,n,m,k;
int a[maxn];
int sum[maxn<<2];

void PushUp(int rt){
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void Update(int rt,int l,int r,int pos){
    if(l==r){
        sum[rt]++;
        return ;
    }
    int mid=(l+r)>>1;
    if(pos<=mid) Update(lson,pos);
    else Update(rson,pos);
    PushUp(rt);
}

ll Query(int rt,int l,int r,int L,int R){
    if(L<=l&&r<=R) return sum[rt];
    int mid=(l+r)>>1;
    ll ans=0;
    if(L<=mid) ans+=Query(lson,L,R);
    if(R>mid) ans+=Query(rson,L,R);
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
#endif
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        memset(sum,0,sizeof(sum));
        ll ans1=0,ans2=0;
        for(int i=1;i<=n;i++){
            ll tmp1=Query(1,1,n,1,a[i]);
            ll tmp2=Query(1,1,n,a[i],n);
            ans1+=tmp2*(n-a[i]-tmp2);
            ans2+=tmp1*(a[i]-1-tmp1);
            Update(1,1,n,a[i]);
        }
        printf("%lld %lld\n",ans1,ans2);
    }
    return 0;
}

tyvj 1432 楼兰图腾

标签:can   ios   sum   const   efi   str   cli   size   code   

原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8604426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!