zoukankan      html  css  js  c++  java
  • [POI2007]立方体大作战tet

    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

    Sample Output 1
    2

    Sample Input 2
    3
    1
    2
    3
    1
    2
    3

    Sample Output 2
    3

    HINT


    其实这题是个傻逼题,知道结论之后就非常好写
    我们思考一下,什么时候我们需要交换,我们把一对同编号方块的两次出现位置记为一个区间,只有当两个区间相交的时候我们才需要进行交换。至于如何判断有多少个区间相交?那就是树状数组了

    /*program from Wolfycz*/
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    #define lowbit(x) ((x)&(-x))
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x>=10)     print(x/10);
    	putchar(x%10+'0');
    }
    const int N=5e4;
    int tree[N+10],cnt[N+10];
    int n,Ans,tot;
    void insert(int x,int v){for (;x<=n;x+=lowbit(x))	tree[x]+=v;}
    int query(int x){
    	int res=0;
    	for (;x;x-=lowbit(x))	res+=tree[x];
    	return res;
    }
    int main(){
    	n=read();
    	for (int i=1;i<=n<<1;i++){
    		int x=read();
    		if (!cnt[x])	cnt[x]=++tot,insert(n-cnt[x]+1,1);
    		else	Ans+=query(n-cnt[x]+1),insert(n-cnt[x]+1,-1);
    	}
    	printf("%d
    ",Ans-n);//自己每次会被算一次,所以减掉
    	return 0;
    }
    
  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/8893599.html
Copyright © 2011-2022 走看看