首页 > 其他分享 > CF1862G The Great Equalizer

CF1862G The Great Equalizer

时间:2023-09-24 16:33:54浏览次数:57  
标签:Equalizer Great 题目 int max CF1862G -- ans 两数

题目链接

先不考虑修改操作。

直接模拟题目意思,可以发现最后留下的一定是最小的数字(因为相同的数每次会保留第一个)。我当时是顺着这个思路做的题目,现在想想反过来想好像会让问题变得更简单,即认为每次保留最后一个相同的数字。

那么现在每次留下的就是最后一个数字,显然每次操作会让这个数字加一,只需要考虑一共需要多少次操作能把数字消到只剩一个即可。

根据题目意思,相邻两个数之间每次操作后差的绝对值会减少一,也就是经过两数差次数后会消掉一个,所以操作次数即为相邻两数差的最大值(排序后)。一次询问的答案也就是最大值+相邻两数差的最大值。

结合修改操作,只需要两个 \(multiset\) 维护即可,感觉代码细节还是不少的。

#include<bits/stdc++.h>

using namespace std;

const int N = 3000;
int n, k, a[N + 9], f[N + 9][N + 9], g[N + 9][N + 9], ans[N + 9], sum1[N + 9], sum0[N + 9];
string s;

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d %d", &n, &k);
        cin >> s;
        for (int i = 1; i <= n; i++)
            a[i] = s[i - 1] - '0';
        for (int i = 0; i <= n + 1; i++)
            for (int j = 0; j <= k; j++)
                f[i][j] =  g[i][j] = 0;
        for (int i = 0; i <= n + 1; i++)
            sum0[i] = sum1[i] = 0, ans[i] = -(1 << 30);
        for (int i = 1; i <= n; i++)
        {
            sum0[i] = sum0[i - 1] + (a[i] == 0);
            sum1[i] = sum1[i - 1] + (a[i] == 1);
        }
        a[n + 1] = a[0] = 0;
        for (int i = 1; i <= n; i++)
        {
            int l = 0;
            for (int j = i; j <= n + 1; j++)
                if (a[j] == 0) f[i][l] = j - i, l++;
            while (l <= k) f[i][l] = n - i + 1, l++;
        }
        for (int i = 1; i <= n; i++)
        {
            int l = 0;
            for (int j = i; j >= 0; j--)
                if (a[j] == 0) g[i][l] = i - j, l++;
            while (l <= k) g[i][l] = i, l++;
        }
        for (int j = 0; j <= k; j++)
            for (int i = 1; i <= n; i++)
                g[i][j] = max(g[i][j], g[i - 1][j]);
        for (int j = 0; j <= k; j++)
            for (int i = n; i >= 1; i--)
                f[i][j] = max(f[i][j], f[i + 1][j]);
        for (int i = 1; i <= n; i++)
            for (int j = i; j <= n; j++)
            {
                int l = j - i + 1;
                int K = sum1[j] - sum1[i - 1];
                K = k - K;
                if (K >= 0)
                    ans[l] = max(ans[l], max(f[j + 1][K], g[i - 1][K]));
            }
        ans[0] = f[1][k];
        /*puts("ans");
        for (int i = 0; i <= n; i++)
            printf("%d ", ans[i]);
        puts("");*/
        for (int i = 1; i <= n; i++)
        {
            int tmp = 0;
            for (int j = 0; j <= n; j++)
                tmp = max(tmp, i * j + ans[j]);
            printf("%d ", tmp);
        }
        puts("");
    }
    return 0;
}

标签:Equalizer,Great,题目,int,max,CF1862G,--,ans,两数
From: https://www.cnblogs.com/With-penguin/p/17726159.html

相关文章

  • 探索GreatADM:如何快速定义监控
    引文在数据库运维过程中,所使用的运维管理平台是否存在这样的问题:1、默认监控粒度不够,业务需要更细颗粒度的监控数据。2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固化,难以应对多样化的监控需求......
  • G. The Great Equalizer
    G.TheGreatEqualizer通过分析之后得知,每次询问的答案就是当前数组中的最大值和当下数组排序后相邻元素差值的最大值之和。接下来考虑如何维护数组。这会想到用一颗二叉平衡搜索树来实现。这样的一颗树在STL里已经用multiset封装好了,直接使用即可。创建两个辅助函数add(intx......
  • CF1862G The Great Equalizer
    思路对于一个数组,每次操作会缩短排序后的数组的相邻两个数的差距,所以总共会执行\(k\)次操作,其中,\(k\)为排序后的数组的相邻两个数的最大差距。因为每次操作都会对最大数加\(1\),所以答案就是\(\text{数组中的最大数}+\text{排序后的数组的相邻两个数的最大差距}\)。因为......
  • G. The Great Equalizer
    G.TheGreatEqualizerTemaboughtanolddevicewithasmallscreenandaworn-outinscription"TheGreatEqualizer"ontheside.Thesellersaidthatthedeviceneedstobegivenanarray$a$ofintegersasinput,afterwhich"TheGreatE......
  • 活动 | 塑造软件新生态 赋能发展新变革——GreatSQL 受邀2023国际软博会
    塑造软件新生态,赋能发展新变革。8月31日-9月2日,第二十五届中国国际软件博览会将于天津梅江会展中心召开。本届软博会由中国电子信息行业联合会主办,聚焦全球软件前沿技术与产业发展方向,充分展示软件赋能数字经济、信息技术应用创新、工业互联网平台、智能制造及元宇宙等多领域发展......
  • 活动 | 塑造软件新生态 赋能发展新变革——GreatSQL 受邀2023国际软博会
    塑造软件新生态,赋能发展新变革。8月31日-9月2日,第二十五届中国国际软件博览会将于天津梅江会展中心召开。本届软博会由中国电子信息行业联合会主办,聚焦全球软件前沿技术与产业发展方向,充分展示软件赋能数字经济、信息技术应用创新、工业互联网平台、智能制造及元宇宙等多领域发展......
  • 探索GreatADM:图形化部署MGR的全新体验
    摘要:在DBA的日常工作中,快速部署数据库高可用架构,且标准化地入网部署数据库是一项重要的基础任务。本文将介绍常见的部署MGR的方式,并重点介绍万里数据库的GreatADM数据库管理平台进行图形化、可视化、标准化的部署过程,以提高交付效率和质量,给DBA提供一种全新的体验。(本文阅读大约......
  • Great Cow Gathering G
    GreatCowGatheringG思路换根dp,TreeDistancesI强化版,同样的先思考单个的,那么对于子树\(u\)对于每一个儿子\(v\)都有:\(f_u=f_v+sum_v*w_{u,v}\)其中\(sum\)是子树大小,而\(w\)则是边的长度,用这种方式可以求出以1为根的答案,然后考虑换根公式,首先要转移到的节点......
  • 图文结合丨带你轻松玩转MySQL Shell for GreatSQL
    一、引言1.1什么是MySQLShell?MySQLShell是MySQL的一个高级客户端和代码编辑器,是第二代MySQL客户端。第一代MySQL客户端即我们常用的MySQL。除了提供类似于MySQL的SQL功能外,MySQLShell还提供JavaScript和Python脚本功能,并包括与MySQL一起使用的API。......
  • GreatSQL从单机到MGR扩展纪实
    一、前言原有的业务系统跑在MySQL主从架构中,高可用通过脚本完成,但存在切换数据丢失和切换不及时风险,调研了高可用更稳定的MGR后,准备入手一试。本篇文章主要记录GreatSQL从单机扩展到MGR的详细过程,遇到的问题及解决方法。二、基础环境服务器角色如下IP端口主机名作用......