首页 > 其他分享 >YACS 2023年1月月赛 甲组 T2 分割数列(二) 题解

YACS 2023年1月月赛 甲组 T2 分割数列(二) 题解

时间:2023-02-12 00:12:01浏览次数:69  
标签:YACS cnt 50005 int 题解 复杂度 甲组 数列

题目链接

继上个月的分割数列(一)又出了这道题。

首先还是考虑 $n^2DP$ ,设 $f[i]$ 为分到 $i$ 个的最小权重之和。

转移枚举上一个在哪里分就行了。

显然时间会超限,我们考虑一下优化:

首先,如果有连续的数字相同,那么就把他们放到一个块里。

处理完后还是 $n^2DP$,这样时间复杂度就减少到了 $O($块数$^2)$。

接着我们再来考虑剪枝,显然把前面每一个块划分成一个数列是比较优秀的。

他的代价为前面块的数量,所以我们转移的时候,当前的 $f[i]$ 已经超过了块数

那就没必要继续下去了,直接 $break$ 掉,平均时间复杂度 $O(n\sqrt{n})$。

不过比如一些毒瘤数据:两个数交替出现。就会卡成 $O(n^2)$,所以可以再加一个 $set$ 优化。

那样时间复杂度就成了铁 $O(n\sqrt{n}\times log_n)$ 就很难过,所以我就这样吧。

$T3$ 还是状压改天在写。

贴代码:

#include <iostream>
#include <cstring>
#define int long long
using namespace std;
int n, cnt, cnt1, tot;
int a[50005], f[50005], v[50005], tmp[50005], A[50005];
signed main() {
    scanf ("%d", &n);
    for (int i = 1; i <= n; i ++) {
        scanf ("%d", &a[i]);
        if (a[i] != a[i - 1]) A[++ tot] = a[i];
    }
    f[0] = 0;
    for (int i = 1; i <= tot; i ++) {
        tmp[A[i] ] ++;
        if (tmp[A[i] ] == 1) cnt1 ++;
        f[i] = i;
        memset (v, 0, sizeof v);
        v[A[i]] = 1;
        int cnt = 1;
        for (int j = i; j >= 1; j --)
        {
            if (cnt * cnt > i) break;
            if (!v[A[j] ]) {
                cnt ++;
                v[A[j]] = 1;
            }     
            f[i] = min (f[i], f[j - 1] + cnt * cnt);
        }
    }
    printf ("%d", f[tot]);
}

 

标签:YACS,cnt,50005,int,题解,复杂度,甲组,数列
From: https://www.cnblogs.com/Xy-top/p/17113113.html

相关文章

  • YACS 2023年1月月赛 甲组 T1 树的独立集 题解
    题目链接半夜12:00我不睡觉来这里更文章来了。。。这次的甲组好简单,第一次$AK$了,这题看上去很难,要求什么不挨边,其实分析一下就是树形$DP$。首先要求不挨边,所以我......
  • 题解 LGP9018【[USACO23JAN] Moo Route G】
    problem现在有一条数轴,\(t\)表示当前时刻。在\(t=0\)时Bessie恰好处在\(x=0\)的位置。接下来,每秒钟Bessie会向左或者向右移动一个单位距离,我们保证Bessie是在......
  • flannel 低版本glog flag redefined error 问题解决
    最近在构建一个老版本的flannel的时候碰到了此问题,记录下,方便使用解决方法glideinstall--strip-vendor--strip-vcs参考资料https://stackoverflo......
  • go: cannot find main module, but found glide.lock 问题解决
    解决方法exportGO111MODULE=auto说明此问题主要是老golang项目构建可能会出现的,新的一般不对有此问题(都基于gomod了)参考资料https://github.co......
  • abc289g题解
    考虑枚举卖出的物品个数\(i\),把\(b_i\)从大到小排序。题目的某人会买物品的条件转化为\(b_i\geqp_j-c_j\),这说明卖出的物品的集合是排序后\(b\)的一段前缀,且卖出\(i\)个......
  • CF793G Oleg and chess 题解
    \(\text{类似于主席树优化建图,直接放一张图片。}\)#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<map>#include......
  • 【题解】CF997C Sky Full of Stars
    简记一下高维二项式反演的套路。思路高维二项式反演。首先意识到\(n\leq10^6\)且计数,并且求“至少”,所以考虑用二项式反演处理。这里如果用一维的二项式反演,可能......
  • 【题解】P4464 [国家集训队] JZPKIL
    仙气飘飘莫反题。显现出了很多推式子习惯的问题。思路莫反+伯努利数+Pr。首先根据\(\operatorname{lcm}(x,y)=\frac{xy}{\gcd(x,y)}\)可以化简:\(\sum\limits......
  • P9033题解
    P9033「KDOI-04」XORSum题解题目链接传送门题意简述构造一个长度为\(n\),值域为\([0,m]\)的异或和为\(k\)的序列,如果不存在则输出\(-1\)。题目分析首先很容易......
  • CF1268B题解
    CF1268B题解题目翻译给你一个杨表,用一个有\(n\)个元素的数组\(a\)表示杨表每一列的高度。你需要用\(1\times2\)或\(2\times1\)的骨牌填充这个杨表,求出最多......