bzj1106: [POI2007]立方体大作战tet

比较玄幻的题目。

考虑两个不同的元素

假设位置是 a...a...b...b... 那么不需要通过交换ab来消除ab,各自弄就行

若是 a...b...b...a... 那也没必要交换,先把b消掉就好

假如是 a...b...a...b... 那么需要交换一次

用树状数组维护一下

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n,s[110000];
int lowbit(int x){return x&-x;}
void change(int x,int k)
{
    while(x<=2*n)
    {
        s[x]+=k;
        x+=lowbit(x);
    }
}
int getsum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=s[x];
        x-=lowbit(x);
    }
    return ret;
}

int id[51000];
int main()
{
    int ans=0;
    scanf("%d",&n);
    memset(id,0,sizeof(id));
    for(int i=1;i<=n*2;i++)
    {
        int x;
        scanf("%d",&x);
        if(id[x]==0)
        {
            id[x]=i;
            change(i,1);
        }
        else
        {
            ans+=getsum(i)-getsum(id[x]);
            change(id[x],-1);
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2018-06-23 16:01  AKCqhzdy  阅读(99)  评论(0编辑  收藏  举报