BZOJ 1106: [POI2007]立方体大作战tet 树状数组 + 贪心
Description
  一个叫做立方体大作战的游戏风靡整个Byteotia。这个游戏的规则是相当复杂的,所以我们只介绍他的简单规
则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置。这些元素拥有n个不同的编号,每个编号正好有两个
元素。玩家每次可以交换两个相邻的元素。如果在交换之后,两个相邻的元素编号相同,则将他们都从栈中移除,
所有在他们上面的元素都会掉落下来并且可以导致连锁反应。玩家的目标是用最少的步数将方块全部消除。
Input
  第一行包含一个正整数n(1<=n<=50000)。接下来2n行每行一个数ai,从上到下描述整个栈,保证每个数出现且
仅只出现两次(1<=ai<=n)。初始时,没有两个相同元素相邻。并且保证所有数据都能在1000000步以内出解。
Output
第一行包含一个数m,表示最少的步数。
题解:
考虑当前要消掉数字 $i$, 出现的位置分别为 $arr[i],brr[i]$,不难发现 $arr[i]$ 到 $brr[i]$ 之间的数字一定会在过程中被消掉(这样一定是最有策略).
我们思考一下我们为了消掉 $i$ 所需要单独执行的操作数. 
那么一定是 $arr[i]$ 到 $brr[i]$ 之间可以消掉的全都消掉后,没被消掉的数的个数. 
树状数组维护一波前缀和即可. 
第一次 +1, 第二次 -1 加加减减搞一搞即可.
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 10000000
using namespace std;
int C[maxn],pos[maxn];
int n,m,ans=0;
int lowbit(int t) { return t & (-t); }
void update(int x,int d)
{
while(x <= m) C[x] += d, x += lowbit(x);
}
int query(int x)
{
int t=0;
while(x>0) t+=C[x], x -= lowbit(x);
return t;
}
int main()
{
// setIO("input");
scanf("%d",&n), m=(n<<1);
for(int i=1;i<=m;++i)
{
int a;
scanf("%d",&a);
if(!pos[a])
{
pos[a] = i;
update(i, 1);
}
else
{
ans += query(i) - query(pos[a]);
update(pos[a], -1);
}
}
printf("%d\n",ans);
return 0;
}
BZOJ 1106: [POI2007]立方体大作战tet 树状数组 + 贪心的更多相关文章
- bzoj 1106 [POI2007]立方体大作战tet 树状数组优化
		
[POI2007]立方体大作战tet Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 821 Solved: 601[Submit][Status][ ...
 - BZOJ1106[POI2007]立方体大作战tet - 树状数组
		
描述 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编 ...
 - BZOJ 1106: [POI2007]立方体大作战tet
		
1106: [POI2007]立方体大作战tet Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 682 Solved: 496[Submit][St ...
 - BZOJ 1106 [POI2007]立方体大作战tet(树状数组)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1106 [题目大意] 给定玩家一个有2n个元素的栈,元素一个叠一个地放置. 这些元素拥有 ...
 - [BZOJ 1106] [POI2007] 立方体大作战tet 【树状数组】
		
题目链接:BZOJ - 1106 题目分析 从1到2n枚举每一个位置. 如果枚举到某一个数,这个数已经是第二次出现,那么就看它和第一次出现的位置之间有多少数还没有被匹配,有多少没有匹配的就要进行多少次 ...
 - 【BZOJ】1106: [POI2007]立方体大作战tet
		
题意 给定一个长度为\(2n(1 \le n \le 500000)\)的序列,\(1\)~\(n\)各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数. 分析 如 ...
 - BZOJ1106: [POI2007]立方体大作战tet
		
1106: [POI2007]立方体大作战tet Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 419 Solved: 302[Submit][St ...
 - [POI2007]立方体大作战tet
		
题目 BZOJ 洛谷 做法 很巧妙的题,注意每种颜色只有两个 消除一种颜色,其实就是看中间有多少个没有被消除的块,这种动态距离问题显然能用树状数组解决 洛谷输出方案,暴力往下爬就行 My comple ...
 - bzj1106: [POI2007]立方体大作战tet
		
比较玄幻的题目. 考虑两个不同的元素 假设位置是 a...a...b...b... 那么不需要通过交换ab来消除ab,各自弄就行 若是 a...b...b...a... 那也没必要交换,先把b消掉就好 ...
 
随机推荐
- Python基础操作-集合
			
在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法 ...
 - iOS的四种传值方式
			
传值有四种方法 : 1. 属性传值 2. 单例传值 3. 代理传值 4. block传值 一.属性传值 (前-->后) 1. 后面的界面定义一个属性 存放前一个界面传过来的值 ...
 - Eclipse如何导入第三方jar包
			
本文转自:http://blog.csdn.net/mazhaojuan/article/details/21403717 我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar ...
 - 4、angularJS过滤器
			
一.过滤器的作用 过滤器用来格式化须要展示给用户的数据. 在HTML中的模板绑定符号{{ }}内通过|符号来调用过滤器. 比如.如果我们希望将字符串转换成大写能够对字符串中的每一个字符都单独进行转换操 ...
 - 使用html5 FileReader获取图片,并异步上传到server(不使用iframe)
			
使用html5 FileReader获取图片,并异步上传到server(不使用iframe) 原理: 1.使用FileReader 读取图片的base64编码 2.使用ajax.把图片的base64编 ...
 - string[][]和string[,]   以及   int[][]和int[,]
			
string[][]和string[,] http://www.codewars.com/kata/56f3a1e899b386da78000732/train/csharp Write a func ...
 - zzulioj--1730--通信基站(全排列+dfs)(好题)
			
1730: 通信基站 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 28 Solved: 11 SubmitStatusWeb Board Desc ...
 - 利用expect验证主机口令
			
##########mianmi.sh############ #!/usr/bin/expect set ip [lindex $argv ] set password [lindex $argv ...
 - MySQL SQL优化教程
			
转自:https://www.cnblogs.com/duanxz/archive/2013/02/01/2889413.html 一,查询SQL执行效率 通过show status命令了解各种SQL ...
 - set()集合的概念与一般操作
			
1.概念 set集合是python的一种基本数据类型,其特点为: 1.元素不重复(可以利用这条性质除去重复元素) 2.在集合中无序 3.元素可hash(int,str,bool,tuple) set集 ...