Codeforces Round 968 (Div. 2)

news2024/11/23 20:14:48

前言

        掉大分的一场比赛aaa

        原因是 D1 看错条件了一直在想 D2 最后还没想出来。

        Standings:6922

        题目链接:Dashboard - Codeforces Round 968 (Div. 2) - Codeforces

A. Turtle and Good Strings

        题意:

        给一个字符串,判断是否能把它分成 k(k >= 2) 个连续的段,使得每一段的起点和其他任意一段的终点不相等。

        思路:

        首先注意到首字母一定是第一段的开头,尾字母一定是最后一段的结尾,那么只要这两个字母不相等我们就有办法分割(直接 1 ~ n-1 作一段,n 单独作一段即可),反之无解。

#include<cstdio>
#include<cstring>
using namespace std;

int T,n;
char s[105];

int main()
{
    scanf("%d",&T);
    while (T --)
    {
        scanf("%d",&n);
        scanf("%s",s + 1);
        if(s[1] == s[n]) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

B. Turtle and Piggy Are Playing a Game 2

        题意:

        给一个序列,A 每次可以移除相邻两个数中较小的那个数,B 每次可以移除相邻两个数中较大的那个数,A 想要使最后剩下的那个数最大,B 想要使最后剩下的那个数最小,两个人都以最优方案操作,A 先开始,求最后剩下的那个数。

        思路:

        显然每次 A 会移除一个最小的数,B 会移除一个最大的数,于是把序列从小到大排序,最后剩下的数就是排名第 \lfloor \frac{n}{2} \rfloor + 1 的数。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define N 100005

int T,n,a[N],ans;

int main()
{
    scanf("%d",&T);
    while (T --)
    {
        scanf("%d",&n);
        for (int i = 1;i <= n;++ i) scanf("%d",&a[i]);
        sort(a + 1,a + n + 1);
        printf("%d\n",a[n / 2 + 1]);
    }
    return 0;
}

C. Turtle and Good Pairs

        题意:

        给一个字符串。

        定义 “ pleasant pair ” (i,j) 为当前仅当存在一个 k (i <= k < j) 满足以下条件的数对:

        1. s_k \neq s_{k + 1}

        2. s_k \neq s_i or s_{k + 1} \neq s_j

        定义 “ good pair ” (i,j) 为当且仅当 s_i = s_j 或者 (i,j) 是 “ pleasant pair ” 的数对。

        你需要重排这个字符串,使得 “ good pair ” 的数目尽量多。

        思路:

        正难则反,我们可以发现 “not good pair” 会满足 “A...AB...B” 这种形式,其中 A 和 B 出现一次以上,且这个子串中只有 A,B 两种字母。

        手玩一下可以发现我们想要这些 “not good pair” 尽量少,就得把相同字母尽量都隔开,于是有一个贪心的构造方法:按相同字母出现次数从大到小排序,以黑白相间的方式轮流插入。

        注意输出的时候用 cout 貌似会比 printf 快很多。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

#define N 200005

int T,n;
char s[N];

struct Node
{
    int id,val;
}a[30];

int cmp(Node x,Node y) { return x.val > y.val ; }

int main()
{
    scanf("%d",&T);
    while (T --)
    {
        scanf("%d",&n);
        scanf("%s",s + 1);
        for (int i = 0;i < 26;++ i) a[i].id = i,a[i].val = 0;
        for (int i = 1;i <= n;++ i) ++ a[s[i] - 'a'].val;
        sort(a,a + 26,cmp);
        int now = a[0].id;
        int tmp = a[0].val;
        for (int i = 1;i < 26;++ i)
        {
            if(!a[i].val) break;
            if(now == a[i].id) continue;
            if(a[i].val < tmp)
            {
                for (int j = 1;j <= a[i].val;++ j)
                    cout << char('a' + now) << char('a' + a[i].id);
                tmp -= a[i].val;
            }
            else if(a[i].val == tmp)
            {
                for (int j = 1;j <= a[i].val;++ j)
                    cout << char('a' + now) << char('a' + a[i].id);
                if(i <= 24) tmp = a[i + 1].val,now = a[i + 1].id;
                else tmp = 0;
            }
            else
            {
                for (int j = 1;j <= tmp;++ j)
                    cout << char('a' + a[i].id) << char('a' + now);
                now = a[i].id,tmp = a[i].val - tmp;
            }
        }
        if(tmp)
        {
            for (int j = 1;j <= tmp;++ j) cout << char('a' + now);
        }
        cout << endl;
    }
    return 0;
}

D1. Turtle and a MEX Problem (Easy Version)

        题意:

        给若干个序列和一个数 m ,你可以通过这些数列对 m 做任意次操作,每次操作选择一个数列,将 m 插入这个数列得到一个新的数列 a ,然后让 m = MEX(a) 。设 f(i) 表示 m = i 的时候能通过操作得到的最大值(每个序列可以用无数次),求 \sum_{i = 0} ^ m f(i) 。

        思路:

        由于每个序列可以用无数次,那么显然某个数 x 要么不操作,要么就选定一个数列操作两次。我们统计每个数列的 mex1 和 mex2 ,分别记作 v1 和 v2 ,那么操作一次可能得到 v1 或者 v2,操作两次一定会得到 v2 ,操作三次以上都再也不能使得到的值更大了。

        记所有 v2 的 max 为 mx,那么对于比 mx 大的 x ,显然不需要进行操作;对于小于等于 mx 的 x ,显然能通过操作得到的最大值就是 mx 了。

#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
using namespace std;

#define N 200005

int T,n,m,l[N],mx,p[N];
long long ans;

struct Node
{
    int v1,v2;
}a[N];

int max(int x,int y) { return x > y ? x : y ; }

int min(int x,int y) { return x < y ? x : y ; }

int main()
{
    scanf("%d",&T);
    while (T --)
    {
        scanf("%d%d",&n,&m),mx = 0;
        for (int i = 1;i <= n;++ i)
        {
            map<int, int> vis;
            scanf("%d",&l[i]);
            for (int j = 1,x;j <= l[i];++ j)
                scanf("%d",&x),vis[x] = 1;
            int now = 0;
            for (int j = 0;j <= l[i] + 2;++ j)
            {
                if(now >= 2) break;
                if(!vis[j])
                {
                    if(!now) a[i].v1 = j;
                    else a[i].v2 = j;
                    ++ now;
                }
            }
            mx = max(mx,a[i].v2);
        }
        if(m > mx) ans = 1ll * (mx + 1 + m) * (m - mx) / 2ll;
        else ans = 0ll;
        ans += 1ll * min(m + 1,mx + 1) * mx;
        printf("%lld\n",ans);
    }
    return 0;
}

D2. Turtle and a MEX Problem (Hard Version)

        题意:

        和 Easy Version 唯一的区别就是每个数列只能用至多一次。

        思路:

        限定了每个序列的操作次数为 1 ,这里有个很妙的 trick ,就是把抽象的操作具化到图上:这里我们可以建一条边由 v1 指向 v2 ,走过这条边就表示把值从 v1 变成 v2 ,每条边只可以走一次。注意到 v1 < v2 是恒成立的,于是我们建出来的图就是一个 DAG ,我们接下来在 DAG 上 dp 即可。设 fi 表示从点 i 出发可以到达的最大的点,可以通过倒序DP解决。

        那么对于大于 mx 的 x ,我们同样无需操作;对于小于等于 mx 的 x ,我们要么直接从 x 的出边走到最大的那个点,要么选择一个 “有两条以上出边” 的点,删掉这个点的一条出边再走,走到最大的那个点。

        后者的操作实际上是将 x 先变成某一个 v1 再进行操作,在把 x 变成 v1 的时候相当于选择了 v1 所在的某个序列先得到了 v1,于是这个序列不能再用了 ,这等价于在图上先删掉了 v1 的一条出边再走,而删掉的这条边可以是任意一条出边,因为任何一个 v1 所在的序列都可以得到 v1 。

#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
using namespace std;

#define N 200005

int T,n,m,l[N],mx,mxn,p[N],f[N];
long long ans;

struct Node
{
    int v1,v2;
}a[N];

int max(int x,int y) { return x > y ? x : y ; }

int min(int x,int y) { return x < y ? x : y ; }

void solve()
{
    vector<int> v[mx + 1];
    int tmp = 0;
    for (int i = 0;i <= mx;++ i) f[i] = i;
    for (int i = 1;i <= n;++ i) v[a[i].v1].push_back(a[i].v2);
    for (int i = mx;i >= 0;-- i)
    {
        for (auto j : v[i]) f[i] = max(f[i],f[j]);
        if(int(v[i].size()) > 1) tmp = max(tmp,f[i]);
    }
    for (int i = 0;i <= min(mx,m);++ i) ans += 1ll * max(mxn,max(i,max(f[i],tmp)));
    return;
}

int main()
{
    scanf("%d",&T);
    while (T --)
    {
        scanf("%d%d",&n,&m),mx = mxn = 0;
        for (int i = 1;i <= n;++ i)
        {
            map<int, int> vis;
            scanf("%d",&l[i]);
            for (int j = 1,x;j <= l[i];++ j)
                scanf("%d",&x),vis[x] = 1;
            int now = 0;
            for (int j = 0;j <= l[i] + 2;++ j)
            {
                if(now >= 2) break;
                if(!vis[j])
                {
                    if(!now) a[i].v1 = j;
                    else a[i].v2 = j;
                    ++ now;
                }
            }
            mxn = max(mxn,a[i].v1);
            mx = max(mx,a[i].v2);
        }
        if(m > mx) ans = 1ll * (mx + 1 + m) * (m - mx) / 2ll;
        else ans = 0ll;
        solve();
        printf("%lld\n",ans);
    }
    return 0;
}

总结

        看错题目条件导致了一场掉大分,但是收获了 D2 这么好的 trick 也算是没白打这场比赛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWS CodeCommit 停服,欢迎大家使用极狐GitLab!

2024 年 7 月 25 日&#xff0c;AWS 官方发布公告称&#xff0c;旗下的代码托管服务 AWS CodeCommit 不再接受新用户的注册。这也就意味着用户不得不选择其他同类型产品。 极狐GitLab 为 GitLab 的中国发行版&#xff0c;可以一键私有化部署&#xff0c;详情可查看官网指南。 A…

超实用的8个无版权、免费、高清图片素材网站整理

不管是设计、文章配图&#xff0c;还是视频制作&#xff0c;图片都至关重要。但是图片版权一直都是困扰很多设计、自媒体以及企业的大问题。现在&#xff0c;因为图片侵权被告的案例已经是司空见惯了&#xff0c;有的公众号甚至因为图片版权问题遭受致命打击。 1. Pexels Pexe…

2 Python开发工具:PyCharm的安装和使用

本文是 Python 系列教程第 2 篇&#xff0c;完整系列请查看 Python 专栏。 1 安装 官网下载地址https://www.jetbrains.com.cn/pycharm/&#xff0c;文件比较大&#xff08;约861MB&#xff09;请耐心等待 双击exe安装 安装成功后会有一个30天的试用期。。。本来想放鸡火教程&…

Elastic日志分析

目录 介绍步骤 介绍 Elasticsearch 是在 Apache Lucene 上构建的分布式搜索和分析引擎。Elasticsearch常用于日志分析、全文搜索、安全智能、业务分析和运维智能使用案例。 可以使用 JSON 文档形式或通过 API 等将数据发送到 Elasticsearch。 Elasticsearch 自动存储原始文档…

免杀笔记 ---> CS特性角度看Veh免杀

前一段时间在玩WBGlIl大佬以前发的一篇过卡巴的思路&#xff08;虽然现在不过了&#xff09;&#xff0c;但是在研究的时候发现如果我们我们在没有CS的特性基础下直接看这篇文章&#xff0c;或者说你去魔改他的脚本是不太可能的&#xff0c;刚好就来普及一下这个CS的一些简单特…

胃癌TMEscore的前瞻性临床研究(TME)

目录 ①关于胃癌TME分型介绍 ②TMEscore计算-TMEscore包 ③关于TMEscore的前瞻性研究 ①关于胃癌TME分型介绍 Tumor Microenvironment Characterization in Gastric Cancer Identifies Prognostic and Immunotherapeutically Relevant Gene Signatures - PubMed (nih.gov) …

【Linux —— POSIX信号量 - 基于环形队列的生产消费模型】

Linux —— POSIX信号量 - 基于环形队列的生产消费模型 POSIX信号量信号量的概念POSIX信号量的类型信号量的操作 POSIX信号量函数基于环形队列的生产消费模型设计思路同步和安全性代码 POSIX信号量 信号量的概念 POSIX信号量是一种用于进程和线程之间同步的机制&#xff0c;主…

【网络】网络层协议——IP协议

目录 1.TCP和IP的关系 2.IP协议报文 2.1. 4位首部长度&#xff0c;16位总长度&#xff0c;8位协议 2.2. 8位生存时间 &#xff0c;32位源IP地址和32位目的IP地址 3.IP地址的划分 3.1.IP地址的表现形式 3.2.旧版IP地址的划分 3.2.1.旧版IP地址的划分思路 3.2.2.分类划…

各种注意力评分函数的实现

预备知识 本文基于MXNet进行实现&#xff0c;需要对于注意力机制有一定初步了解。也需要对Python有足够了解。 另外这里稍加说明&#xff0c;在注意力机制中&#xff0c;本质上是“注意”的位置&#xff0c;即加权计算后进行Softmax回归的结果。在Nadaraya-Watson核回归中&am…

问界M7 Pro发布,又做回纯视觉?华为智驾系统这3年到底功夫下在哪?

北京时间8月26日下午14:00&#xff0c;华为又公布了一款新问界车型&#xff0c;时至今日&#xff0c;华为问界家族已有三大款&#xff0c;细分9个系列车型&#xff08;从动力方面看&#xff0c;各自都分为增程和纯电两种版本&#xff09;。 1个多小时的发布会上&#xff0c;除…

Zabbix和Prometheus

1.Zabbix 1.1 Zabbix监控获取数据的方式 zabbix-agent 适用于服务器&#xff0c;主机监控 SNMP协议 适用于网络设备&#xff08;交换机、路由器、防火墙&#xff09; IPMI协议 适用于监控硬件设备信息&#xff08;温度、序列号&#xff09; JMX协议 适用于Java应用监控 1.2 …

基于SSM+微信小程序的跑腿平台管理系统(跑腿3)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM微信小程序的跑腿平台管理系统实现了管理员、接单员及用户三个角色。 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、接单详情、跑腿任务管理等。 2、接单员实现了…

C++ TinyWebServer项目总结(14. 多线程编程)

早期Linux不支持线程&#xff0c;直到1996年&#xff0c;Xavier Leroy等人开发出第一个基本符合POSIX标准的线程库LinuxThreads&#xff0c;但LinuxThreads效率低且问题多&#xff0c;自内核2.6开始&#xff0c;Linux才开始提供内核级的线程支持&#xff0c;并有两个组织致力于…

离线环境下的 Prometheus 生态部署攻略

一、前言 在当今高度数字化的世界中&#xff0c;监控系统的稳定性和可靠性对于确保业务连续性和性能优化至关重要。特别是在网络隔离或无互联网接入的局域网环境下&#xff0c;离线部署监控解决方案成为了一种必要且挑战性的任务。本文将深入探讨如何在离线环境中成功部署 Pro…

深圳保障房、商品房、小产权房子类型对比

摘要&#xff1a; 整理了我认知以内的深圳房子类型&#xff0c;有安居房&#xff0c;可售人才房&#xff0c;共有产权房、配售型保障房、商品房、统建楼、农民房的区别。如果数据存疑&#xff0c;可以多方对比论证&#xff0c;我也主要靠百度。 我发现我很多同事是非深户&#…

秋招突击——算法练习——8/26——图论——200-岛屿数量、994-腐烂的橘子、207-课程表、208-实现Trie

文章目录 引言正文200-岛屿数量个人实现 994、腐烂的橘子个人实现参考实现 207、课程表个人实现参考实现 208、实现Trie前缀树个人实现参考实现 总结 引言 正文 200-岛屿数量 题目链接 个人实现 我靠&#xff0c;这道题居然是腾讯一面的类似题&#xff0c;那道题是计算最…

《分析模式》2024中译本-前言-01(加红色标注)

写在前面 今天开始&#xff0c;我们逐渐发布一些《分析模式》2024中译本的译文。 红色字体标出的文字&#xff0c;表示我认为之前的译本可能会让读者产生误解的地方。 感兴趣的读者&#xff0c;可以对照之前译本以及原文&#xff0c;捉摸一下为什么要标红。 主要原因当然是…

基于SpringBoot+Vue+MySQL的小区物业管理系统

系统背景 在当今信息化高速发展的时代&#xff0c;小区物业管理正经历着从传统模式向智能化、高效化转型的深刻变革。这一转变的核心驱动力&#xff0c;正是小区物业管理系统的全面智能化升级。该系统不仅极大地提升了物业管理的效率与精确度&#xff0c;还深刻重塑了物业与业主…

数分基础(03-1)客户特征分析

文章目录 客户特征分析1. 数据集2. 思路与步骤2.1 特征工程2.2 识别方法2.3 可视化 3. 分析准备3.1 读取数据集3.2 识别不同客户群体3.2.1 使用K-Means聚类进行初步细分3.2.2 关于聚类方法&#xff08;1&#xff09;特征缩放1&#xff09;平衡特征对模型的影响力&#xff0c;避…

通过ICMP判断网络故障

一、ICMP协议 Internet控制消息协议ICMP(Internet Control Message Protocol)是IP协议的辅助协议。 ICMP协议用来在网络设备间传递各种差错和控制信息&#xff0c;对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。 TypeCode描述备注00Echo Replyping…