zoukankan      html  css  js  c++  java
  • [BZOJ1106/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


    样例输入2
    3
    1
    2
    3
    1
    2

    3

    Sample Output
    样例输出1
    2
    样例输出2
    3

    题解:简单观察可以得到一个结论:对于同一个数,相差的距离就是交换的次数。但是当然不是单纯的直接计算每个数的距离就行了,因为每一步操作可能影响后续的结果。故考虑用树状数组维护,每次找到每个数的第一个位置之后将其插入到树状数组;第二次出现之后,查询当前两个位置之间的距离,然后将该数从树状数组中删除。

    代码:

    -------------------------------------------------------------------------------------------------

    #include <cstdio>
    #define MAXN 100005

    int n, x, a[MAXN], s[MAXN], ans;

    int lowbit(int o) { return o & -o; }

    void insert(int o, int x) { while (o <= n) s[o] += x, o += lowbit(o); }

    int query(int o) { int res = 0; while (o) res += s[o], o -= lowbit(o); return res; }

    int main()
    {
      freopen("tet.in", "r", stdin);
      freopen("tet.out", "w", stdout);
      scanf("%d", &n), n <<= 1;
      for (int i = 1; i <= n; i++)
      {
        scanf("%d", &x);
        if (!a[x]) insert(i, 1), a[x] = i;
        else ans += query(i) - query(a[x]), insert(a[x], -1);
      }
      printf("%d", ans);
    return 0;
    }

    -------------------------------------------------------------------------------------------------

  • 相关阅读:
    App的开发过程(转载)
    一款APP的完整开发流程 (转载)
    JS判断是否是数组的四种做法(转载)
    easyui datagrid Column Group 列组、 复杂表头 嵌套表头 组合表头 (转载)
    php bootstrap-datetimepicker
    Echarts实现Excel趋势线和R平方计算思路
    前端项目开发流程(转载)
    对有序特征进行离散化(继承Spark的机器学习Estimator类)
    Spark ML 中 VectorIndexer, StringIndexer等用法(转载)
    Z-Score数据标准化(转载)
  • 原文地址:https://www.cnblogs.com/jinkun113/p/4901050.html
Copyright © 2011-2022 走看看