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

系统 1786 0

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;

}


    

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论