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; }
pain and happy in the cruel world.