Education Codeforces Round 162(Div.2) A~E

A.Moving Chips (思维)

题意:

给一个长度为 n n n的数组 a a a a i = 1 a_i=1 ai=1或者 a i = 0 a_i=0 ai=0,现在可以选择一个 1 1 1,然后将其与左侧最近的 0 0 0交换。询问使得所有的 1 1 1连在一起,中间没有 0 0 0至少需要多少次操作。

分析:

可以发现答案为从第一个 1 1 1到最后一个 1 1 1的子串中 0 0 0的数量。

代码:

#include <bits/stdc++.h>

using namespace std;
const int N = 2e5 + 5;
const int INF = 0x3f3f3f3f;
int a[N];

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        int l = INF, r = 0;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            if (a[i] == 1)
                l = min(i, l), r = max(i, r);
        }
        int ans = 0;
        for (int i = l; i <= r; i++) {
            if (a[i] == 0)
                ans++;
        }
        cout << ans << endl;
    }
    return 0;
}

B.Monsters Attack! (前缀和)

题意:

n n n个怪物在一个数轴上,每个怪物位于 x i x_i xi处,有生命值 h i h_i hi,玩家处于数轴 0 0 0位置处,每一秒都会进行以下操作:

  • 玩家选择一些怪物,并为他们分配总计 k k k点伤害。
  • 怪物生命值小于等于 0 0 0认定死亡
  • 所有生命值大于 0 0 0的怪物都向玩家所在位置前进一个单位。如果存在怪物到达 0 0 0,玩家失败。

分析:

对于第 i i i个怪物,需要在 x i x_i xi秒前造成至少 k k k点伤害, n u m [ i ] num[i] num[i]表示 1 − i 1-i 1i秒需要造成的伤害,如果伤害大于 k k k,就表明失败。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

int main() {
    int t;
    cin >> t;
    while (t--) {
        LL n, k;
        cin >> n >> k;
        LL a[n + 1], x[n + 1];
        vector<LL> num(n + 1, 0);
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        for (int i = 1; i <= n; i++)
            cin >> x[i];
        for (int i = 1; i <= n; i++)
            num[abs(x[i])] += a[i];
        for (int i = 1; i <= n; i++)
            num[i] += num[i - 1];
        int flag = 0;
        for (int i = 1; i <= n; i++) {
            if (num[i] > i * k) {
                flag = 1;
                break;
            }
        }
        if (flag)
            cout << "NO" << endl;
        else
            cout << "YES" << endl;
    }
    return 0;
}

C. Find B (思维)

题意:

一个长度为 m m m的数组 a a a被认为是好的,当且仅当满足下列条件:

  • 存在数组 b b b b i > 0 , a i ≠ b i b_i>0,a_i \neq b_i bi>0,ai=bi ∑ i = 1 m a i = ∑ i = 1 m b i \sum\limits_{i=1}^{m} a_i=\sum\limits_{i=1}^{m} b_i i=1mai=i=1mbi

给出一个数组 c c c和区间 l , r l,r l,r,询问子数组 c l ∼ c r c_l \sim c_r clcr是不是好的。

分析:

长度为 1 1 1的区间显然无解。对于长度不为 1 1 1的区间,如果所有的元素都大于 1 1 1,那么可以将所有数大于 1 1 1的部分加到其中一个数字上,一定有解。如果区间内存在若干个 1 1 1,那么需要判断区间内大于 1 1 1的部分能否将区间内的每个 1 1 1都至少加上 1 1 1

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, q;
        cin >> n >> q;
        vector<LL> sum(n + 1), cnt1(n + 1);
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            sum[i] = sum[i - 1] + x;
            cnt1[i] = cnt1[i - 1] + (x == 1);
        }
        while (q--) {
            int l, r;
            cin >> l >> r;
            if (l == r) {
                cout << "NO" << endl;
                continue;
            }
            LL tmp = sum[r] - sum[l - 1] - (r - l + 1);
            if (tmp >= cnt1[r] - cnt1[l - 1]) {
                cout << "YES" << endl;
            } else
                cout << "NO" << endl;
        }
    }
    return 0;
}

D.Slimes (二分)

题意:

n n n个史莱姆排成一排,第 i i i个史莱姆的大小为 a i a_i ai,每一秒都会进行如下操作:

  • 选择两个大小不同的并且相邻的史莱姆,较大的史莱姆将吞噬较小的史莱姆,且大小变为两者之和。

询问对于每一个史莱姆,最少需要几秒才能被吞噬,如果不可能被吞噬,输出 − 1 -1 1

分析:

对于一个史莱姆,可以从左右两个方向来选择一段区间合并出一个大史莱姆将其吞噬,首先需要保证区间内数字和大于 a i a_i ai,可以通过二分出满足条件的左右端点。其次需要判断区间内的数字是否不完全相同,只要不完全相同都可以通过吞噬得到一个更大的史莱姆,可以通过维护一个数字往前/往后第一个与其不同的数字的位置来进行判断。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> a(n + 5);
        vector<LL> sum(n + 5);
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
            sum[i] = sum[i - 1] + a[i];
        }
        vector<int> pre(n + 5), suf(n + 5);
        for (int i = 2; i <= n; i++) {
            if (a[i] == a[i - 1]) {
                pre[i] = pre[i - 1];
            } else {
                pre[i] = i - 1;
            }
        }
        suf[n] = n + 1;
        for (int i = n - 1; i >= 1; i--) {
            if (a[i] == a[i + 1]) {
                suf[i] = suf[i + 1];
            } else {
                suf[i] = i + 1;
            }
        }
        for (int i = 1; i <= n; i++) {
            int ans = INF;
            if (sum[i - 1] > a[i]) {
                int l = 0, r = i - 1;
                while (l < r) {
                    int mid = (l + r + 1) / 2;
                    if (sum[i - 1] - sum[mid - 1] > a[i])
                        l = mid;
                    else
                        r = mid - 1;
                }
                if (r == i - 1) {
                    ans = min(ans, 1);
                } else if (pre[i - 1] != 0) {
                    ans = min(ans, max(i - r, i - pre[i - 1]));
                }
            }
            if (sum[n] - sum[i] > a[i]) {
                int l = i + 1, r = n;
                while (l < r) {
                    int mid = (l + r) / 2;
                    if (sum[mid] - sum[i] > a[i])
                        r = mid;
                    else
                        l = mid + 1;
                }
                if (r == i + 1) {
                    ans = min(ans, 1);
                } else if (suf[i + 1] != n + 1) {
                    ans = min(ans, max(r - i, suf[i + 1] - i));
                }
            }
            if (ans == INF)
                ans = -1;
            cout << ans << " ";
        }
        cout << endl;
    }
    return 0;
}

E.Count Paths (启发式合并)

题意:

给出一棵 n n n个节点的树,每个节点有着颜色 c i c_i ci,询问满足以下条件的路径的数量:

  • 至少经过两个节点
  • 起始节点和终止节点颜色相同,并且和路径上的节点的颜色不相同

分析:

有两种满足要求的路径:

  • 一个点是另一个点的祖先
  • 两个节点没有祖先关系

遍历每一个节点,使用 m a p map map记录子树内没有被祖先覆盖过的每种颜色的点的数量,再利用启发式合并来进行统计,满足上述要求的两种路径都可以在启发式合并的过程中求出来。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<LL> c(n + 5);
        vector<vector<LL>> g(n + 5);
        for (int i = 0; i < n; i++)
            cin >> c[i];
        for (int i = 1; i < n; i++) {
            int u, v;
            cin >> u >> v;
            u--, v--;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        vector<map<LL, LL>> dp(n + 5);
        LL ans = 0;
        auto dfs = [&](auto self, int u, int p) -> void {
            for (auto v: g[u]) {
                if (v == p)
                    continue;
                self(self, v, u);
            }
            for (auto v: g[u]) {
                if (v == p)
                    continue;
                if (dp[v].size() > dp[u].size()) {
                    swap(dp[u], dp[v]);
                }
            }
            for (auto v: g[u]) {
                if (v == p)
                    continue;
                for (auto [x, y]: dp[v]) {
                    if (x != c[u])
                        ans += y * dp[u][x];
                    dp[u][x] += y;
                }
            }
            ans += dp[u][c[u]];
            dp[u][c[u]] = 1;
        };
        dfs(dfs, 0, -1);
        cout << ans << endl;
    }
    return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue+SpringBoot打造不良邮件过滤系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统用户模块2.2 收件箱模块2.3 发件箱模块2.4 垃圾箱模块2.5 回收站模块2.6 邮箱过滤设置模块 三、实体类设计3.1 系统用户3.2 邮件3.3 其他实体 四、系统展示五、核心代码5.1 查询收件箱档案5.2 查询回收站档案5.3 新…

js 面试 1判断变量是否是数组 2 检测数据类型方法

1 是否是数组 1) typeof 检测数据类型运算符 优点&#xff1a;使用简单 缺点&#xff1a;只能检测基本类型&#xff08;除null外&#xff09; console.log(typeof(10)) //Number console.log(typeof(false)) //boolean console.log(typeof(hello)) //string console.log(typeof…

LeetCode 刷题 [C++] 第236题.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器

目录 一、网络编程 二、客户端和服务器 三、客户端和服务器的交互模式 四、TCP 和 UDP UDP socket api 的使用 1、DatagramSoket 2、DatagramPacket TCP socket api 的使用 1、ServerSocket 2、Socket 一、网络编程 本质上就是学习传输层给应用层提供的 api&#x…

MySQL之事务详解

华子目录 什么是事务银行转账案例方式1方式2具体操作 事务的四大特性并发事务问题脏读不可重复读幻读 事务的隔离级别查看事务隔离级别设置事务隔离级别 session与global的区别 什么是事务 事务&#xff08;transaction&#xff09;&#xff0c;一个最小的不可再分的工作单元&…

实例:NX二次开发抽取平面以及标准柱面中心线

一、概述 最近体验许多外挂&#xff0c;包括胡波外挂、星空外挂及模圣等都有抽取面的中心线&#xff0c;由于刚刚学习&#xff0c;我尝试看看能不能做出来&#xff0c;本博客代码没有封装函数&#xff0c;代码有待改进&#xff0c;但基本可以实现相应的功能。 二、案例实现的功…

Sora 原理与技术实战笔记一

b 站视频合集 【AIX组队学习】Sora原理与技术实战&#xff1a;Sora技术路径详解 Sora 技术报告&#xff08;OpenAI&#xff09; huggingsd 文生图视频系列的一个开源项目 最强视频生成模型Sora相关技术解析 https://github.com/lichao-sun/SoraReview 惊艳效果&#xff1a; 长…

Ps:路径面板

Ps菜单&#xff1a;窗口/路径 Window/Paths “路径”面板 Paths Panel提供了一系列功能&#xff0c;使用户能够创建、编辑、保存和利用路径。 ◆ ◆ ◆ 路径分类 在“路径”面板上的路径可分为五大类。 常规路径 Saved Path 也称“已保存的路径”&#xff0c;指的是已经存储在…

Python进阶学习:Pandas--DataFrame--如何把几列数据合并成新的一列

Python进阶学习&#xff1a;Pandas–DataFrame–如何把几列数据合并成新的一列 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

SpringMVC的配置2种(本质上还是一样的,实现的接口不同)

第一种SpringInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer 看第一种配置 package com.xxx.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class SpringInitConfig ext…

减少页面加载时间:提升用户体验的关键

✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、为什么页面加载时间重要&#xff1f; 二、如何减少页面加载时间&#xff1f; …

Google发布Genie硬杠Sora:通过大量无监督视频训练最终生成可交互虚拟世界

前言 Sora 问世才不到两个星期&#xff0c;谷歌的世界模型也来了&#xff0c;能力看似更强大(嗯&#xff0c;看似)&#xff1a;它生成的虚拟世界自主可控 第一部分 首个基础世界模型Genie 1.1 Genie是什么 Genie是第一个以无监督方式从未标记的互联网视频中训练的生成式交互…

UDP数据报套接字编程入门

目录 1.TCP和UDP的特点及区别 1.1TCP的特点 1.2UDP的特点 1.3区别 2.UDP Socket的api的介绍 2.1DatagramSocket API 2.2DatagramPacket API 3.回显客户端与服务器 3.1回显服务器 3.1.1UdpEchoServer类的创建 3.1.2服务器的运行方法start() 3.1.3main部分 3.1.4.完整…

nginx反向代理之缓存 客户端IP透传 负载均衡

一 缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 相关选项&#xff1a; ​ proxy_cache zone_name | off; 默认off #指明调用的缓存&#xff0c;或关闭缓存机制;C…

【C++初阶】第四站:类和对象(下)(理解+详解)

前言&#xff1a; 本篇知识点&#xff1a;初始化列表、explicit关键字、static成员、友元、内部类、匿名对象、编译器的优化 专栏&#xff1a;C初阶 目录 再谈构造函数 1️⃣构造函数体赋值 2️⃣初始化列表 explicit关键字 static成员 1.static概念 2.static特性 面试…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论&#xff08;4&#xff09; Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

NC65 零预算控制规则 数据库表关系

NC65 零预算控制规则 数据库表关系 SELECT t1.createdby, t1.objname, t2.ctrlname, t2.pk_parent, t3.billtype, t3.nameidx, t3.pk_obj FROM tb_rule_formula t1 left join tb_ctrlformula t2 on t1.pk_obj t2.pk_parent left join tb_ctrlscheme t3 on t3.pk_ctrlformula …

Mysql安装教程

一、下载 点开下面的链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 8.0.31 的软件本体了(就是一个文件夹…

Tomcat布署及优化-----JDK和Tomcat

1.Tomcat简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;Tomcat 属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。一般来说&…

Vivado Vitis 2023.2 环境配置 Git TCL工程管理 MicroBlaze和HLS点灯测试

文章目录 本篇概要Vivado Vitis 环境搭建Vivado 免费标准版 vs 企业版Vivado Windows 安装Vivado 安装更新 Vivado 工程操作GUI 创建工程打开已有工程从已有工程创建, 重命名工程GUI导出TCL, TCL复原工程TCL命令 Vivado 版本控制BlinkTcl脚本新建导出重建工程纯Verilog BlinkTc…