Codeforces Round 960 (Div. 2) A~E

news2024/10/1 15:28:37

A. Submission Bait (思维)

题意:

A l i c e Alice Alice B o b Bob Bob 正在玩一个数组 a a a 中大小为 n n n 的游戏。

他们轮流进行操作, A l i c e Alice Alice先开始。无法操作的玩家将输掉。首先,将变量 m x mx mx 设置为 0 0 0

在一次操作中,玩家可以执行以下操作:

  • 选择一个索引 i i i ( 1 ≤ i ≤ n 1 \le i \le n 1in ),使得 a i ≥ m x a_{i} \geq mx aimx ,并将 m x mx mx 设置为 a i a_{i} ai 。然后,将 a i a_{i} ai 设置为 0 0 0

确定 A l i c e Alice Alice是否有获胜策略。

分析:

考虑最大值的奇偶性,如果有奇数个最大值,那么先手赢。如果是偶数个最大值,那么就要考虑剩下的数字的奇偶性。如果有一个值有奇数个,那么先手赢,否则后手赢

代码:

#include <bits/stdc++.h>

using namespace std;

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

B.Array Craft (思维)

题意:

对于大小为 m m m 的数组 b b b ,我们定义:

  • b b b 的最大前缀位置是满足 b 1 + … + b i = max ⁡ j = 1 m ( b 1 + … + b j ) b_1+\ldots+b_i=\max_{j=1}^{m}(b_1+\ldots+b_j) b1++bi=maxj=1m(b1++bj) 的最小索引 i i i
  • b b b 的最大后缀位置是满足 b i + … + b m = max ⁡ j = 1 m ( b j + … + b m ) b_i+\ldots+b_m=\max_{j=1}^{m}(b_j+\ldots+b_m) bi++bm=maxj=1m(bj++bm) 的最大索引 i i i

给出三个整数 n n n x x x y y y ( x > y x > y x>y )。构造一个大小为 n n n 的数组 a a a ,满足:

  • 对于所有 1 ≤ i ≤ n 1 \le i \le n 1in a i a_i ai 1 1 1 − 1 -1 1
  • a a a 的最大前缀位置为 x x x
  • a a a 的最大后缀位置为 y y y

如果有多个数组满足条件,则输出任意一个。可以证明,在给定条件下,这样的数组始终存在。

分析:

我们让 y y y的左侧 − 1 , 1 -1,1 1,1交替出现,在区间 [ y , x ] [y,x] [y,x]全选择 1 1 1 x x x的右侧也是 − 1 , 1 -1,1 1,1交替出现即可完成构造。

代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t = 1;
    cin >> t;
    while (t--) {
        int n, x, y;
        cin >> n >> x >> y;
        vector<int> ans(n + 1, 1);
        for (int i = y - 1; i >= 1; i--) {
            ans[i] = -ans[i + 1];
        }
        for (int i = x + 1; i <= n; i++) {
            ans[i] = -ans[i - 1];
        }
        for (int i = 1; i <= n; i++) {
            cout << ans[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

C.Mad MAD Sum (思维)

题意:

我们将数组中的 M A D {MAD} MAD (最大重复数)定义为数组中至少出现两次的最大数字。具体来说,如果没有至少出现两次的数字,则 M A D {MAD} MAD 的值是 0 0 0

例如, M A D ( [ 1 , 2 , 1 ] ) = 1 {MAD}([1, 2, 1]) = 1 MAD([1,2,1])=1 M A D ( [ 2 , 2 , 3 , 3 ] ) = 3 {MAD}([2, 2, 3, 3]) = 3 MAD([2,2,3,3])=3 M A D ( [ 1 , 2 , 3 , 4 ] ) = 0 {MAD}([1, 2, 3, 4]) = 0 MAD([1,2,3,4])=0

给定一个大小为 n n n 的数组 a a a 。最初,将变量 s u m sum sum 设置为 0 0 0

以下过程将以顺序循环执行,直到 a a a 中的所有数字都变为 0 0 0

  1. 设置 s u m : = s u m + ∑ i = 1 n a i sum := sum + \sum_{i=1}^{n} a_i sum:=sum+i=1nai
  2. b b b 成为大小为 n n n 的数组。将所有 1 ≤ i ≤ n 1 \le i \le n 1in 设置为 b i : =   M A D ( [ a 1 , a 2 , … , a i ] ) b_i :=\ {MAD}([a_1, a_2, \ldots, a_i]) bi:= MAD([a1,a2,,ai]) ,然后将所有 1 ≤ i ≤ n 1 \le i \le n 1in 设置为 a i : = b i a_i := b_i ai:=bi

求出经过此处理后的 s u m sum sum 的值。

分析:

发现从第二次操作开始,数列一定为单调递增,且除了最大的权值外每种权值至少出现 2 2 2次,且每次操作对数列的影响均为使数列整体右移一位,删去最后一个数并在前面补 0 0 0
于是我们先暴力模拟两轮记录贡献和,然后求得每种权值的出现次数,再降序枚举每种权值(也即每轮删数的顺序),统计删去该权值的各轮的贡献之和即可。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

int main() {
    int t = 1;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<LL> a(n), b(n);
        LL ans = 0;
        map<LL, LL> mp;
        LL mx = 0;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            ans += a[i];
            mp[a[i]]++;
            if (mp[a[i]] >= 2 && a[i] > mx) {
                mx = a[i];
            }
            b[i] = mx;
        }
        mp.clear();
        mx = 0;
        for (int i = 0; i < n; i++) {
            ans += b[i];
            mp[b[i]]++;
            if (mp[b[i]] >= 2 && b[i] > mx)
                mx = b[i];
            a[i] = mx;
        }
        for (int i = 0; i < n; i++)
            ans += a[i] * (n - i);

        cout << ans << endl;
    }
    return 0;
}

D.Grid Puzzle (dp)

题意:

您将获得一个大小为 n n n 的数组 a a a

有一个 n × n n \times n n×n 网格。在 i i i 行中,前 a i a_i ai 个单元格为黑色,其他单元格为白色。换句话说,请注意 ( i , j ) (i,j) (i,j) i i i行和 j j j列中的单元格,单元格 ( i , 1 ) , ( i , 2 ) , … , ( i , a i ) (i,1), (i,2), \ldots, (i,a_i) (i,1),(i,2),,(i,ai) 为黑色,单元格 ( i , a i + 1 ) , … , ( i , n ) (i,a_i+1), \ldots, (i,n) (i,ai+1),,(i,n) 为白色。

你可以按任意顺序多次执行以下操作:

  • 2 × 2 2 \times 2 2×2 子网格染成白色;
  • 将整行染成白色。请注意,你不能 将整列染成白色。

找出将所有单元格染成白色的最少操作次数。

分析:

我们发现,在每一行最多用一次 2 × 2 2 \times 2 2×2的操作,因为超过 1 1 1次,不如直接两次操作涂完两列。那么每一行最多被两个 2 × 2 2 \times 2 2×2的操作影响(前一行和本行),并且可以看出,这个操作要么用在第 1 , 2 1,2 1,2列,要么用在 3 , 4 3,4 3,4列。所以我们维护以下 3 3 3 d p dp dp值。

  • 前一行是涂一整行。
  • 前一行在第 1 , 2 1,2 1,2列使用了 2 × 2 2 \times 2 2×2操作。
  • 前一行在第 3 , 4 3,4 3,4列使用了 2 × 2 2 \times 2 2×2操作。

进行转移即可。

代码:

#include <bits/stdc++.h>

using namespace std;
const int INF = 1e9;

int main() {
    int t = 1;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++)
            cin >> a[i];
        int dp[3]{0, INF, INF}, tmp[3];
        for (int i = 0; i < n; i++) {
            memset(tmp, 0x3f, sizeof tmp);
            tmp[0] = *min_element(dp, dp + 3) + (a[i] > 0);
            if (a[i] <= 2) {
                tmp[0] = min(tmp[0], dp[1]);
                tmp[1] = min(tmp[1], dp[0] + 1);
            }
            if (a[i] <= 4) {
                tmp[2] = min(tmp[2], dp[1] + 1);
                tmp[1] = min(tmp[1], dp[2] + 1);
            }
            swap(dp, tmp);
        }
        cout << *min_element(dp, dp + 3) << endl;
    }
    return 0;
}

E2.Catch the Mole(Hard Version) (交互)

题意:

这是一个交互题。
给你一个节点数为 n n n 的树,节点 1 1 1 是它的根节点。
其中一个节点中隐藏着一只鼹鼠。要找到它的位置,你可以选择一个整数 x x x ( 1 ≤ x ≤ n 1 \le x \le n 1xn ) 来向陪审团询问。接下来,当鼹鼠在子树 x x x 中时,陪审团将返回 1 1 1 。否则,法官将返回 0 0 0 。如果法官返回 0 0 0 并且鼹鼠不在根节点 1 1 1 中,鼹鼠将移动到它当前所在节点的父节点。
最多使用 160 160 160 次操作来找到鼹鼠所在的当前节点。

分析:

我们每次找出当前询问点子树的重心,这样就能一次排除尽量多的点,但如果出现类似菊花图之类的数据,是难以找到一个较为平衡的点,但要卡掉上述过程的图恰好需要满足点的分布较为均衡,那么此时子树的深度一定不大,很容易将目标点直接跳到根节点。
所以我们可以先在子树内每次选择重心缩小范围,最后留出一部分询问在当前点到根的路径上确定点的位置即可,因为可能这个点之前还在我们确定的子树里,几次操作后又跑到外面去了,所以要最后确定一下位置。由于这部分是一条链,因此可以二分处理,实测可以在 160 160 160的限制内通过此题.

代码:

#include <bits/stdc++.h>

using namespace std;

inline bool qry(int x) {
    cout << "? " << x << endl;
    int s;
    cin >> s;
    return s;
}

vector<int> s[5005], e[5005];
int sz[5005], f[5005], le, rt;

void dfs(int x, int fa) {
    sz[x] = 1;
    f[x] = fa;
    for (auto u: e[x]) {
        if (u == fa)
            continue;
        s[x].push_back(u);
        dfs(u, x);
        sz[x] += sz[u];
    }
    if (e[x].size() == 1 && x != 1)
        le = x;
    if (sz[x] >= 71 && !rt) {
        if (qry(x)) {
            rt = x;
        }
        sz[x] = 0;
    }
}

void solve() {
    int n;
    cin >> n;
    rt = 0;
    for (int i = 1; i <= n; i++) {
        e[i].clear();
        s[i].clear();
    }
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(1, 0);
    if (rt == 0)
        rt = 1;
    for (int i = 1; i < 71; i++) {
        if (qry(le)) {
            cout << "! " << le << "\n";
            return;
        }
    }
    vector<int> v;
    while (rt)
        v.push_back(rt), rt = f[rt];
    int l = 0, r = v.size() - 1;
    reverse(v.begin(), v.end());
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (qry(v[mid]))
            l = mid;
        else {
            r = mid - 1;
            l--;
            r--;
        }
        if (l < 0)
            l = 0;
    }
    cout << "! " << v[l] << endl;
}

int main() {
    int t = 1;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

赛后交流

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

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

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

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

相关文章

常用控件之 QWidget

目录 一、控件概述 1.关于控件体系的发展&#xff1a; 二、QWidget 核心属性 1.核心属性概览 2.enabled 3.geometry &#x1f335;window frame&#xff08;窗口框架&#xff09; 的影响 4.windowTitle 5.windowIcon &#x1f335;使用 qrc 文件管理资源 6.windowOpa…

微信公众号上线12周年了,12年前的公众号历史文章怎么找?抓取了公众号历史文章同步到博客,找起来方便了

为了方便看看12年来这些号发过的文章 2023 批量下载公众号文章内容/话题/图片/封面/视频/音频&#xff0c;导出文章pdf和抓取文章数据包含阅读数/点赞数/在看数/留言数&#xff0c;我抓取了其中一些号的所有历史文章同步到博客 : 比如深圳卫健委从2014年更新&#xff0c;到2023…

Reqable:跨平台HTTP开发与调试工具

在当今快速发展的互联网时代&#xff0c;HTTP协议作为网络通信的基础&#xff0c;其开发和调试工具的选择对开发效率有着重要影响。本文将详细介绍一款新型的跨平台HTTP开发和调试工具——Reqable&#xff0c;它支持HTTP1、HTTP2以及最新的HTTP3(QUIC)协议&#xff0c;为开发、…

超秒集物:助力品牌商腾飞,共筑强国梦想

在当今竞争激烈的商业世界中&#xff0c;每一个小微企业都怀揣着成为世界 500 强的梦想。它们虽然微小&#xff0c;但都在努力绽放出属于自己的光芒。而超秒集物&#xff0c;以其独特的平台力量&#xff0c;为众多小微企业照亮了前行的道路&#xff0c;助力它们追逐梦想&#x…

贝叶斯之光:照亮机器学习领域的算法瑰宝

一、贝叶斯算法概述 贝叶斯算法起源于英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;在18世纪提出的贝叶斯定理。该定理是概率论中的一个重要定理&#xff0c;描述了条件概率之间的关系。其基本形式可以表示为&#xff1a; P(A∣B)P(B)P(B∣A)P(A)​ 其中&…

C++进阶:C++11新增语法(1)

文章目录 1. 统一的列表初始化1.1 &#xff5b;&#xff5d;初始化 1.2 std::initializer_list2. 声明2.1 auto2.2 decltype3.3 nullptr 4 范围for循环5 STL中一些变化6 右值引用和移动语义6.1 左值引用和右值引用6.2 左值引用与右值引用特性6.3 左值引用和右值引用使用场景和意…

图的应用--最小生成树

一. 前言 生成树的概念&#xff1a; 生成树是图的极小连通子图&#xff0c;也就是去掉一条边就非连通的图&#xff0c;并且这个图的所有顶点都由边连接在一起&#xff0c;但不存在回路。 生成树的特点&#xff1a;一个图可以有很多个不同的生成树。生成树的顶点个数和图的顶点个…

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…

即使是 Linux 用户也应该看看这篇文章。

关注公众号网络研究观获取更多内容。 安全启动至少从 Windows 8 开始就成为一项标准功能。 顾名思义&#xff0c;该功能可保护启动过程。 通过对启动过程中使用的任何软件&#xff08;“固件”&#xff09;进行数字签名&#xff0c;可确保启动过程的完整性。 与任何数字签名…

量产部落SM2258XT开卡软件,SM2258XT主控128G SSD固态卡死修复

故障现象&#xff1a;连接此固态硬盘后电脑就会卡死&#xff0c;拔掉重新连接概率性显示盘符&#xff0c;显示了之后也不能正常操作&#xff0c;一点击打开&#xff0c;电脑就立马卡死。 解决过程&#xff1a;下载了很多款量产工具&#xff0c;都不能开卡成功&#xff0c;点击…

【传知代码】受限前缀注意机制的事件关系识别(论文复现)

在自然语言处理的前沿&#xff0c;受限前缀注意机制正逐渐成为事件关系识别领域的关键技术。随着文本数据的不断增长和复杂性的提升&#xff0c;识别文本中事件之间的关系变得愈发重要和具有挑战性。受限前缀注意机制作为一种新兴的技术手段&#xff0c;通过有效地捕获文本中的…

不同太阳光波长定制设备太阳光模拟器

日光中不同波长的作用 太阳光不仅是地球上生命活动的能量来源&#xff0c;也对人类的生活产生了深刻的影响。了解太阳光的特性和对地球生态系统的贡献&#xff0c;对于我们保护环境、合理利用太阳能资源具有重要意义。科迎法电气作为太阳光模拟器的制造商可以根据不同的需求定制…

【Verilog-CBB】开发与验证(4)——RS前向打拍器

引言 我们知道时序路径的建立时间收敛依赖于触发器之间的组合逻辑延迟&#xff0c;以及时钟周期。对于一个确定的设计一般来说&#xff0c;时钟频率不会有太多的让步&#xff0c;因此修时序的时候主要发力点就是减小触发器之间组合逻辑延迟。一方面可以通过组合逻辑优化来降低…

Studying-代码随想录训练营day56| 108.冗余连接、109.冗余连接II

第56天&#xff0c;图论06&#xff0c;并查集题目类型冗余连接(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 108.冗余连接 109.冗余连接II 总结 108.冗余连接 文档讲解&#xff1a;手撕冗余连接 题目&#xff1a;108. 冗余连接 (kamacoder.com) 学习&…

SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…

跟《经济学人》学英文:2024年08月03日这期 How to make tourism work for locals and visitors alike

How to make tourism work for locals and visitors alike Holidays don’t have to be hell 原文&#xff1a; The dollar is hovering near a two-decade high. That has unleashed a multitude of American tourists keen to exercise their newfound spending power, m…

图的应用---最短路径

目录 一. 前言 二. Dijkstra算法 三. Floyd算法 一. 前言 所谓最短路径&#xff1a;就是在有向网当中&#xff0c;A点&#xff08;源点&#xff09;到达B点&#xff08;终点&#xff09;的多条路径中&#xff0c;寻找一条各边权值之和最小的路径&#xff0c;即最短路径。 如果…

Linux--TCP协议

传输层协议TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;会对数据的传输进行一个详细的控制。 TCP协议段格式 TCP协议段格式是TCP协议在网络传输数据时所使用的结构单…

Google paly开发者账号因恶意软件被封,也能申诉成功?怎么做?

想必在Google Play上摸爬滚打多年的各位开发者&#xff0c;在面对谷歌那似乎越来越严格的审核机制&#xff0c;都遭遇过应用被下架、账号被封的困境。 尤其是当你的应用被莫名其妙地判定为恶意软件&#xff0c;然后账号被封&#xff0c;更是让人头疼不已。 但别急&#xff0c;虽…