【POI 2007】Tetris Attack 正方体大作战(tet)

  http://www.zybbs.org/JudgeOnline/problem.php?id=1106

  http://main.edu.pl/en/archive/oi/14/tet

  题目大意:诶呀我不说了就是个消方块的游戏和祖玛似的……

  

  肿么搞这个题呢?首先如果对于两个相同数字的方块,如果他们之间还有可以配对的两个方块,显然先消掉中间的方块更优。但是如果他们之间有k个无法配对的方块,我们就至少需要k次交换消掉现在的这两块。我们就可以统计一下每两个相同的方块之间有多少无法配对的方块。可以用一个树状数组来维护……

  

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <string>

#define lowbit(x) x&-x;

#define mn 50000

using namespace std;



int n,ans,x,pos[mn],v[mn<<1];



void Modify(int x,int val){

	while(x<=n<<1) v[x]+=val,x+=lowbit(x);

}



int Get(int x){

	int sum=0;

	while(x>0) sum+=v[x],x-=lowbit(x);

	return sum;

}



int main(){

	scanf("%d",&n);

	for(int i=1;i<=n<<1;i++){

		scanf("%d",&x);

		if(!pos[x]){

			pos[x]=i;

			Modify(i,1);

		}else{

			ans+=Get(i)-Get(pos[x]-1)-1;

			Modify(pos[x],-1);

		}

	}

	printf("%d\n",ans);

	return 0;

}

你可能感兴趣的:(2007)