【BZOJ 1106】 [POI2007]立方体大作战tet

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

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 465  Solved: 336

[Submit][Status]

Description

一个叫做立方体大作战的游戏风靡整个Byteotia。这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置。这些元素拥有n个不同的编号,每个编号正好有两个元素。玩家每次可以交换两个相邻的元素。如果在交换之后,两个相邻的元素编号相同,则将他们都从栈中移除,所有在他们上面的元素都会掉落下来并且可以导致连锁反应。玩家的目标是用最少的步数将方块全部消除。

Input

输入文件第一行包含一个正整数n(1<=n<=50000)。接下来2n行每行一个数ai,从上到下描述整个栈,保证每个数出现且仅只出现两次(1<=ai<=n)。初始时,没有两个相同元素相邻。并且保证所有数据都能在1000000步以内出解。

Output

输出文件第一行包含一个数m,表示最少的步数。

Sample Input

样例输入1

5

5

2

3

1

4

1

4

3

5

2

样例输入2

3

1

2

3

1

2

3

Sample Output

样例输出1

2

样例输出2

3

HINT

 

树状数组+贪心。

(一开始想到回文序列什么的。。。又被贪心坑了。。)

如果一对之间有k个没有配对的,那么要把这一对配对要经过k次交换。

边读入边计算,如果前面有和当前读入的配对的,那么前缀和相减计算这一对中间有几个没有配对的;

然后把与当前配对的那个位置赋值为0,表示已经配对过。

用树状数组来维护即可。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#define M 1000005
using namespace std;
int t[M],n,v[M];
void read(int &tmp)
{
	tmp=0;
	char ch=getchar();
	int fu=1;
	for (;ch<'0'||ch>'9';ch=getchar())
		if (ch=='-') fu=-1;
	for (;ch>='0'&&ch<='9';ch=getchar())
		tmp=tmp*10+ch-'0';
	tmp*=fu;
}
int lowbit(int x)
{
	return x&(-x);
}
void Update(int x,int k)
{
	for (int i=x;i<=2*n;i+=lowbit(i))
		t[i]+=k;
}
int Getsum(int x)
{
	int ans=0;
	for (int i=x;i;i-=lowbit(i))
		 ans+=t[i];
	return ans;
}
int main()
{
        read(n);
	int ans=0;
	for (int i=1;i<=n*2;i++)
	{
		int x;
		read(x);
		if (!v[x])
		{
			v[x]=i;
			Update(i,1);
		}
		else
		{
			ans+=(Getsum(i)-Getsum(v[x]));
			Update(v[x],-1);
		}
	}
	printf("%d\n",ans);
	return 0;
}

时间: 2024-10-06 11:20:12

【BZOJ 1106】 [POI2007]立方体大作战tet的相关文章

BZOJ 1106: [POI2007]立方体大作战tet

1106: [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 682  Solved: 496[Submit][Status][Discuss] Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编号正好有两个元素.玩家每次可以交换两个相邻的元素.如

[BZOJ 1106] [POI2007] 立方体大作战tet 【树状数组】

题目链接:BZOJ - 1106 题目分析 从1到2n枚举每一个位置. 如果枚举到某一个数,这个数已经是第二次出现,那么就看它和第一次出现的位置之间有多少数还没有被匹配,有多少没有匹配的就要进行多少次交换. 代码 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm>

BZOJ 1106 [POI2007]立方体大作战tet(树状数组)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1106 [题目大意] 给定玩家一个有2n个元素的栈,元素一个叠一个地放置. 这些元素拥有n个不同的编号,每个编号正好有两个元素. 玩家每次可以交换两个相邻的元素.如果在交换之后,两个相邻的元素编号相同, 则将他们都从栈中移除,所有在他们上面的元素都会掉落下来并且可以导致连锁反应. 玩家的目标是用最少的步数将方块全部消除. [题解] 我们发现如果有一对可消除的方块在另一对中间,那么肯定是

BZOJ 1106 POI2007 立方体大作战tet 模拟

题目大意:给定一个长度为2n的序列,1~n各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数 如果有一对在另一对中间 那么这一对肯定要先于另一对交换 除掉这个因素之外答案是确定的 由于保证交换次数<=100W,因此可以从左向右扫,维护一个栈,按顺序记录还没有被消掉的元素 如果新来的元素在栈里出现过,就直接去栈中查找,删除后直接维护就可以了 #include <cstdio> #include <cstring> #include <i

bzoj1106 [POI2007]立方体大作战tet

Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编号正好有两个元素.玩家每次可以交换两个相邻的元素.如果在交换之后,两个相邻的元素编号相同,则将他们都从栈中移除,所有在他们上面的元素都会掉落下来并且可以导致连锁反应.玩家的目标是用最少的步数将方块全部消除. Input 输入文件第一行包含一个正整数n(1<=n<=50000).接

bzoj1106([POI2007]立方体大作战tet)(树状数组)

传送门 首先要看出,对于每一对,其凑到一起所需要的操作次数是中间没被匹配的个数. 于是想到贪心,每次操作所需次数最小的. 但其实做法并不需要这么麻烦,只用从左到右扫一遍. 如果当前数字已经出现过,就统计其中未匹配的个数,同时把这一对标记为“已匹配”,就不会对后面的答案造成影响. 用树状数组维护即可,第一次出现树状数组中对应位置的权值+1,第二次出现时,累计答案,同时把前面相同的数的位置树状数组里权值-1. #include<bits/stdc++.h> #define LL long long

BZOJ 1106 立方体大作战

BIT. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 200050 using namespace std; int n,t[maxn],x,pos[maxn],ans=0; int lowbit(int x) { return (x&(-x)); } int query(int x) { int ret=0; for (

BZOJ 1098[POI2007]办公楼

题面: 1098: [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1371  Solved: 641[Submit][Status][Discuss] Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当

bzoj 1101 [POI2007]Zap - 莫比乌斯反演

Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个 正整数,分别为a,b,d.(1<=d<=a,b<=50000) Output 对于每组询问,输出到输出文件zap.out一个正