首页 > 其他分享 >题解 CF1875D【Jellyfish and Mex】

题解 CF1875D【Jellyfish and Mex】

时间:2023-10-01 09:44:24浏览次数:41  
标签:Mex 删除 题解 ll cin operatorname define mex Jellyfish

显然,除非 \(\operatorname{mex}a=0\),否则不会删除 \(>\operatorname{mex}a\) 的数。而 \(\operatorname{mex}a=0\) 时不对答案产生贡献,因此任意时刻我们都可以忽略 \(a\) 中 \(>\operatorname{mex}a\) 的数。

又显然,一旦我们开始删一个数,就会先把所有与之相等的数删光。否则,设最先删光的数为 \(x\),把所有删除 \(x\) 的操作提到最前面一定更优。

至此,我们自然地设 \(f_i\) 表示假设只保留所有 \(<i\) 的数,此时删光的最小代价。注意到,我们忽略了 \(>\operatorname{mex}a\) 的数,此时 \(i\) 的取值范围是 \([0,\operatorname{mex}a]\),由 \(\operatorname{mex}\) 的定义可知此时 \(\operatorname{mex}a=i\)。

考察首先要删光哪个数,不妨设为 \(j\)(\(j < i\))。设 \(j\) 出现次数为 \(cnt(j)\)。显然,前 \(cnt(j)-1\) 次删除时 \(j\) 还未被删光,此时对答案贡献为 \(i\);最后一次删除时 \(j\) 已被删光,此时对答案贡献为 \(j\)。删除结束后,剩余的数列满足保留了所有 \(<j\) 的数,且 \(\operatorname{mex}a=j\)。此时,所有 \([j+1,i-1]\) 的数都可以被忽略,问题转化为 \(f_j\)。因此,得到转移方程:

\[f_i= \begin{cases} 0,&i=0\\ \min\limits_{j<i}\{f_j+(cnt(j)-1)\times i+j\},&i>0 \end{cases} \]

时间复杂度 \(O(n^2)\)。

// Problem: D. Jellyfish and Mex
// Contest: Codeforces - Codeforces Round 901 (Div. 2)
// URL: https://codeforces.com/problemset/problem/1875/D
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x, y, z) for(ll x = (y); x <= (z); ++x)
#define per(x, y, z) for(ll x = (y); x >= (z); --x)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do {freopen(s".in", "r", stdin); freopen(s".out", "w", stdout);} while(false)
#define endl '\n'
using namespace std;
typedef long long ll;

mt19937 rnd(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
ll randint(ll L, ll R) {
    uniform_int_distribution<ll> dist(L, R);
    return dist(rnd);
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

const ll N = 5e3 + 5, inf = 0x1f1f1f1f1f1f1f1fll;

ll T, n, a[N], cnt[N], dp[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    for(cin >> T; T; T--) {
        cin >> n;
        rep(i, 1, n) {
            cin >> a[i];
            if(a[i] <= n) ++cnt[a[i]];
        }
        ll mex = 0;
        while(cnt[mex]) ++mex;
        rep(i, 1, mex) dp[i] = inf;
        rep(i, 1, mex) rep(j, 0, i - 1) chkmin(dp[i], dp[j] + (cnt[j] - 1) * i + j);
        cout << dp[mex] << endl;
        rep(i, 0, n) cnt[i] = 0;
    }
    return 0;
}

标签:Mex,删除,题解,ll,cin,operatorname,define,mex,Jellyfish
From: https://www.cnblogs.com/ruierqwq/p/CF-1875D.html

相关文章

  • counting题解
    \(N,M\le1e7\)接着反射容斥,考虑这道题怎么做如果去枚举不动步数,加上反射容斥,直接T飞了把-1/0/1操作转换一下,就成了0/1/2如果没有限制(不能<0或>m),n步方案就是\((1+x+x^2)^n\)设\(H=1+x+x^2\quadF=H^n\)那么对两边求导:\[nH^{n-1}H'=F'\]\[F'H=nFH'\]我们知道\[H=1+x+x^2......
  • 第四周题解
    第四周题解7-1根据后续和中序遍历输出先序遍历利用数组保存树的后序遍历和中序遍历,根据后续遍历和中序遍历的特点还原树,并根据先序遍历的顺序,即根左右,利用函数递归输出打印,注意输出格式的正确性。#include<bits/stdc++.h>usingnamespacestd;constintN=40;typedeflon......
  • vs code调试rust乱码问题解决方案
    在terminal中用chcp65001修改一下字符集,就行了。有的博主推荐修改区域中的设置,这会引来很大的问题。千万不要修改如下设置:......
  • P7167 [eJOI2020 Day1] Fountain 题解
    Description给定\(n\)个从上往下圆心重叠的圆盘,给定每个圆盘的直径\(d_i\)和容量\(c_i\),所有圆盘底下有一个容量为\(\infty\)的水池,编号为\(0\)。\(q\)次询问,每次给定\(r\)和\(v\)表示往第\(r\)个圆盘里倒\(v\)的水,输出水最后流到哪个圆盘会停止。Solution倍......
  • 【题解】CF1110D Jongmah(DP)
    【题解】CF1110DJongmah代码很短,但是思路我怎么也想不到的神仙DP。题意概述你在玩一个叫做Jongmah的游戏,你手上有\(n\)个麻将,每个麻将上有一个在\(1\)到\(m\)范围内的整数\(a_i\)。为了赢得游戏,你需要将这些麻将排列成一些三元组,每个三元组中的元素是相同的或者连......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......
  • 算法题解--蓝桥云课跳跃
    题目蓝桥云课跳跃1.看完题目先写了个二维数组,然后就真的不懂了,最后找了个大概能懂的题解,思路大概是是建立坐标,再用递归求出所有路径,找出其中最大的权值和2.遇到的问题还是没思路,而且写下面使用递归的方法时光出错,不是很熟练3.测试结果:4.收获:学习过的static终于派上了用场,......
  • CF38F 题解
    blog。严重怀疑这题放到2023年至少*2000,评绿合情合理。首先是博弈论。然后数据范围很小。直接暴力DP啪的一下上去了,很快啊!这就抽象起来了。另一篇题解说不能暴力转移,但是你先预处理出来\(num(s)\),然后直接记忆化搜索,暴力枚举每一次操作的字符,这不就做完了吗。具体一点的......
  • [春季测试 2023] 密码锁 题解
    题目传送门闲话duliu题,写了10k。题意形式化地,对于\(1\leqi\leqk\),定义密码锁第\(i\)行的松散度为\[c(i)=\max\limits_{j=1}^na_{i,j}-\min\limits_{j=1}^na_{i,j}\]同时定义整个密码锁的松散度为\[C=\max\limits_{1\leqi\leq......
  • CF961E Tufurama 题解
    CF961ETufurama题解二维数点做法题意  给定长度为\(n\)的序列\(a\),统计二元组\((i,j)\)的个数,使得该二元组满足\(1\leqi<j\leqn,a_i\geqj,a_j\geqi\)。\(n\)在\(2\times10^{5}\)级别,\(a_i\)在\(1\times10^{9}\)级别。思路分析  我们考虑把......