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

时间:2023-03-09 15:55:07
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[];
int lowbit(int x){return x&-x;}
void change(int x,int k)
{
while(x<=*n)
{
s[x]+=k;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ret=;
while(x>)
{
ret+=s[x];
x-=lowbit(x);
}
return ret;
} int id[];
int main()
{
int ans=;
scanf("%d",&n);
memset(id,,sizeof(id));
for(int i=;i<=n*;i++)
{
int x;
scanf("%d",&x);
if(id[x]==)
{
id[x]=i;
change(i,);
}
else
{
ans+=getsum(i)-getsum(id[x]);
change(id[x],-);
}
}
printf("%d\n",ans);
return ;
}