zoukankan      html  css  js  c++  java
  • [CF1215E] Marbles

    [CF1215E] Marbles

    Description

    有 n ((n le 4 imes 10^5)) 个珠子,第 (i) 个珠子颜色是 (c_i (c_i le 20)),每次操作把相邻的两个珠子交换。现在要把相同颜色的珠子排列在相连的一段,问至少要多少次操作。

    Solution

    (f[s]) 表示处理了颜色集合为 s 的珠子(排在目标序列的开头),总操作次数最小是多少

    转移无非就是枚举下一次选什么颜色的珠子

    代价计算的方法有两种

    一种是把目标位置和初始位置求和做差,这样挺麻烦的

    另一种是对于已经排上的所有 q,现在新拍上的 p,计算所有 x 为 p 色,y 为 q 色,原始序列中 x 在 y 前面的情况

    这可以进一步描述为一个数组 (inv[i][j]),表示 i 色的排在 j 色的前面的有多少个,可以 O(nmm) 计算出

    具体地,枚举 i,j,然后扫一遍,边扫边统计 i 色已有的个数,然后碰到一个 j 色的就给他加上去

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    
    const int N = 400005;
    const int M = 25;
    
    int g[M][M], f[N * 6], n, c[N];
    //设 $f[s]$ 表示处理了颜色集合为 s 的珠子(排在目标序列的开头),总操作次数最小是多少
    // 表示 i 色的排在 j 色的前面的有多少个
    //对于已经排上的所有 q,现在新拍上的 p,计算所有 x 为 p 色,y 为 q 色,原始序列中 x 在 y 前面的情况
    
    signed main()
    {
        ios::sync_with_stdio(false);
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> c[i];
            --c[i];
        }
        for (int i = 0; i < 20; i++)
            for (int j = 0; j < 20; j++)
            {
                int sum = 0;
                for (int k = 1; k <= n; k++)
                {
                    if (c[k] == i)
                        ++sum;
                    if (c[k] == j)
                        g[i][j] += sum;
                }
            }
        memset(f, 0x3f, sizeof f);
        f[0] = 0;
        for (int s = 0; s < 1 << 20; s++)
        {
            for (int i = 0; i < 20; i++)
                if ((~s) & (1 << i))
                {
                    int t = s | (1 << i);
                    int delta = 0;
                    for (int j = 0; j < 20; j++)
                        if (s & (1 << j))
                        {
                            delta += g[i][j];
                        }
                    f[t] = min(f[t], f[s] + delta);
                }
        }
    
        cout << f[(1 << 20) - 1] << endl;
    }
    
  • 相关阅读:
    HDU4474 Yet Another Multiple Problem BFS搜索
    HDU4473 Exam 数学分析
    2013ACM多校联合(4)
    POJ1273 网络流...
    HDU4472 Count 递推
    POJ1149 PIGS 网络流
    UVA10881 Piotr's Ants 想法题
    javascript js string.Format()收集
    修改 设置 vs.net 网站 调试 设为 起始页
    【转】HTML5杂谈 概念与现行游戏 割绳子 宝石迷阵
  • 原文地址:https://www.cnblogs.com/mollnn/p/14398930.html
Copyright © 2011-2022 走看看