首页 > 其他分享 >[ARC126D] Pure Straight 题解

[ARC126D] Pure Straight 题解

时间:2023-08-14 19:24:13浏览次数:39  
标签:std count typedef le 题解 Straight ARC126D valueType dp

题意

给定一个有 \(N\) 个正整数的序列 \(A=(A_1,A_2,\cdots,A_N)\),且 \(A_i \in \left[1,K\right]\)。

你可以对这个序列做如下操作若干次。

交换两个相邻的元素,也就是选出 \(i\) 和 \(j\) 满足 \(\lvert i - j\rvert = 1\) 并交换 \(A_i\) 和 \(A_j\)。

找到最小的操作数使 \(A\) 满足如下条件。

\(A\) 包含 \((1,2,\cdots,K)\) 作为一个相接的子序列,也就是对于任意正整数 \(n \le N−K+1\) 满足 \(A_n=1,A_{n+1}=2,\cdots,A_{N−K+1}=K\)。

\(2 \le K \le 16, K \le N \le 200\)。

题解

设 \(f_{i,S}\) 表示在前 \(i\) 个元素中选取的数字构成集合 \(S\) 并将其按序排列并将其末尾元素移动到 \(i\) 的最小操作次数。

转移的话考虑两种情况:

  • 将数 \(A_i\) 加入集合 \(S\),那么贡献为当前集合中比 \(A_i\) 大的数的个数,即逆序对个数;
  • 不将数 \(A_i\) 加入集合 \(S\),那么贡献可以考虑将在 \(S\) 中的数全部右移或将未在 \(S\) 中的数全部左移,两种操作方案取 \(\min\) 即可。

复杂度为 \(\mathcal{O}(n2^k)\),可以通过本题。

Code

//D
#include <bits/stdc++.h>

typedef int bitType;
typedef int valueType;
typedef std::vector<valueType> ValueVector;

typedef std::function<valueType(bitType)> BitCountFunction;

constexpr valueType MAX = INT_MAX >> 1;

int main() {
    valueType N, K;

    std::cin >> N >> K;

    bitType const S = (1 << K) - 1;

    ValueVector source(N);

    for (auto &iter: source)
        std::cin >> iter;

    BitCountFunction count = [](bitType n) -> valueType {
        return __builtin_popcount(n);
    };

    ValueVector dp(S + 1, MAX);

    dp[0] = 0;

    for (valueType i = 0; i < N; ++i) {
        bitType const mask = (1 << (source[i] - 1)) - 1, bit = 1 << (source[i] - 1);

        for (bitType j = S; j >= 0; --j) {
            if ((j & bit) == 0)
                dp[j | bit] = std::min(dp[j | bit], dp[j] + count(j & (~mask)));

            dp[j] = dp[j] + std::min(count(j), K - count(j));
        }
    }

    std::cout << dp[S] << std::endl;

    return 0;
}

标签:std,count,typedef,le,题解,Straight,ARC126D,valueType,dp
From: https://www.cnblogs.com/User-Unauthorized/p/solution-at-arc126-d.html

相关文章

  • CF793F Julia the snail 题解
    题意有一个长为\(n\)的杆,上面有\(m\)条绳子,每条绳子可以让蜗牛从\(l_i\)爬到\(r_i\)(中途不能离开),保证\(r_i\)各不相同。蜗牛也可以自然下落。现在有\(q\)次询问,询问\(x\)出发,途中高度不能低于\(x\)或高于\(y\),问最高能爬到的位置。\(n,m,q\leq10^5\)。题解......
  • 【免费分享 图书】《阿里云天池大赛赛题解析——机器学习篇》-PDF电子书-百度云
    找这本书的资源简直要把我找吐了,各种网站压缩包一下下来就开始各种套路(比如要你充钱)为了防止还有我这样的受害者,这就把找到的PDF给大家分享一下。链接在文章最后如果这篇文章能够帮到您,麻烦帮我点个赞,并关注一下我,我有更多动力,持续分享更多有用图书给您!非常感谢,不胜感激!(点关......
  • 「题解注释」P3345 [ZJOI2015] 幻想乡战略游戏
    题解P3345【[ZJOI2015]幻想乡战略游戏】-Baka'sBlog-洛谷博客(luogu.org)耗时:半个下午代码注释:#include<bits/stdc++.h>typedeflonglongLL;inlineintrd(){ inta=1,b=0;charc=getchar(); while(!isdigit(c))a=c=='-'?0:1,c=getcha......
  • CF1859C 题解
    思路我们实际上发现它计算的就是\(p_i\cdoti\)的和再减去一个\(p_i\cdoti\)中的最大值。那我们可以枚举这个最大值\(p_x\cdotx\),这个值就是最后和中需要删除的数值。这里我们可以使用贪心。我们可以从\(n\sim1\)枚举除\(p_i\)的每个数字需要配的数字。当然,......
  • CF1859B 题解
    题意给定\(n\)个长度为\(m\)的数组,每个数组可以向别的数组转移最多一个数字,任意一个数组都可以接受无穷多的数字,最大化每个数组的最小值之和。做法考虑贪心。我们记第\(i\)个数组的第\(j\)个数字为\(a_{i,j}\)。我们先对每一个数组按照升序进行排序,那我们最不愿意......
  • 【题解】 Call Me Call Me CCPC Mianyang 2022
    https://codeforces.com/gym/104065/原题做法是类似猫树转成前缀后缀,写起来太麻烦,不如如下做法:如果每个区间所需满足的点不超过\(\sqrt{n}\)个,即可以如下暴力:把每个区间拍到线段树上,每次更新一个点,则在线段树上把所有包含他的区间全部\(-1\)看看是否减到了\(0\),拿个队列一......
  • 问题解答:关于 SAP UI5 控制器(Controller) JavaScript 编码里单引号和双引号的用法澄
    笔者这篇教程文末,有朋友提问:SAPUI5应用开发教程之十-什么是SAPUI5应用的描述符文件manifest.json问题1:在index.html文件中body标签添加了代码:<divdata-sap-ui-componentdata-name="sap.ui5.walkthrough"data-id="container"data-settings='{"id":"wa......
  • ARC129C 题解
    problem&blog。提供一种不一样的做法喵。考虑原问题的逆问题。这个很典,直接前缀和\(sum_i\)表示\([1,i]\)顺次拼接的数\(\bmod7\)的值,那么\([l,r]\)符合条件当且仅当\(sum_r-sum_{l-1}=0\),即\(sum_r=sum_{l-1}\)。设\(c_p=\sum\limits_{i=1}^n[sum_i=p]\),这个逆......
  • 【题解】洛谷 P9532 [YsOI2023] 前缀和
    原题链接【LGR-151-Div.2】洛谷8月月赛II&YsOI2023T1解题思路设有一序列a,其中a1 =a2,第k(≥3) 项为前k-1项的前缀和。可以发现前q项分别为第一项的20 倍,20 倍,21 倍,22 倍,23 倍…2q-3 倍,2q-2 倍。扩展到整个序列中,可得第i( ≥ 3)项一定为2i-2a1。......
  • 【LSOIT1】秒速,五厘米 ----题解
    【LSOIT1】秒速,五厘米----题解题目传送门【明里。】【贵树君。】【明年,也能一起看樱花吗?】【昨天,我做了一个梦,在梦里,我们都才十三岁。那是覆盖着厚厚的一层白雪的田园。】【民家的灯火遥不可及,只能看到零星的两点。】很显然,这是一道签到题,出题人非常良心。题目大意:从......