Codeforces Round 932(Div.2) A~E

A.Entertainment in MAC(字符串)

题意:

恭喜你,你被硕士援助中心录取了!但是,你在课堂上感到非常无聊,于是你给自己想了一个游戏。

给你一个字符串 s s s和一个偶数整数 n n n。你可以对它进行两种运算:

  1. 将字符串反向并 s s s添加到字符串 s s s的末尾(例如,如果 s = c p m s=cpm s=cpm,那么在执行操作之后字符串变为 s = c p m m p c s=cpmmpc s=cpmmpc)。
  2. 将当前字符串 s s s倒转(例如,如果 s = c p m s=cpm s=cpm,则在执行操作后变为 s = m p c s=mpc s=mpc)。

确定在应用了恰好 n n n次操作后可以得到的字典序最小的 † ^{\dagger} 字符串。请注意,可以按照任意顺序执行不同类型的操作,但必须总共执行恰好 n n n次操作。

† ^{\dagger} 当且仅当以下条件之一成立时,字符串 a a a在词法上小于字符串 b b b

  • a a a b b b的前缀,但是 a ≠ b a\ne b a=b
  • a a a b b b不同的第一个位置上,字符串 a a a的字母在字母表中出现的时间早于 b b b中的相应字母。

分析:

我们注意到当反转字符串后如果字典序减小了,那么就不会再执行反转操作,而是将反转后的字符串拼接(这样一定会构造出一个回文串),那么之后的操作就没有任何意义了,将 n n n次的操作化简为 2 2 2次。

代码:

#include<bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        string s, ans;
        cin >> s;
        ans = min(s, string(s.rbegin(), s.rend()) + s);
        cout << ans << endl;
    }
    return 0;
}

B.Informatics in MAC(区间)

题意:

在硕士援助中心, N y a m − N y a m Nyam-Nyam NyamNyam接受了一项信息学方面的家庭作业。

有一个长度为 n n n的数组 a a a,你想把它分成 k > 1 k \gt 1 k>1个子段 † ^{\dagger} ,使每个子段上的 MEX ⁡ ‡ \operatorname{MEX}^{\ddagger} MEX都等于相同的整数。

请帮助 N y a m − N y a m Nyam-Nyam NyamNyam找到合适的除法,或者确定不存在合适的除法。

† ^{\dagger} 将数组划分为 k k k个子数段的定义是 k k k对整数 ( l 1 , r 1 ) , ( l 2 , r 2 ) , … , ( l k , r k ) (l_1,r_1),(l_2,r_2),\ldots,(l_k,r_k) (l1,r1),(l2,r2),,(lk,rk),使得 l i ≤ r i l_i\le r_i liri和每个 1 ≤ j ≤ k − 1 1\le j\le k-1 1jk1 l j + 1 = r j + 1 l_{j+1}=r_j+1 lj+1=rj+1,以及 l 1 = 1 l_1=1 l1=1 r k = n r_k=n rk=n。这些数对表示子段本身。

数组中的 ‡ MEX ⁡ ^{\ddagger}\operatorname{MEX} MEX是不属于该数组的最小非负整数。

例如

  • 数组 [ 2 , 2 , 1 ] [2,2,1] [2,2,1] MEX ⁡ \operatorname{MEX} MEX 0 0 0,因为 0 0 0不属于该数组。
  • 数组 [ 3 , 1 , 0 , 1 ] [3,1,0,1] [3,1,0,1]中的 MEX ⁡ \operatorname{MEX} MEX 2 2 2,因为 0 0 0 1 1 1属于数组,而 2 2 2不属于数组。
  • 数组 [ 0 , 3 , 1 , 2 ] [0,3,1,2] [0,3,1,2]中的 MEX ⁡ \operatorname{MEX} MEX 4 4 4,因为 0 0 0 1 1 1 2 2 2 3 3 3属于数组,而 4 4 4不属于数组。

分析:

如果有解,一定能只划分为两个区间。如果两个区间的 MEX ⁡ \operatorname{MEX} MEX相同,那么合并了也是相同的。将问题转化为求前缀和后缀那个点的 MEX ⁡ \operatorname{MEX} MEX相同。遍历并维护 MEX ⁡ \operatorname{MEX} MEX即可。

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<int> a(n + 1), al(n + 1), ar(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        ar[a[i]]++;
    }
    int l, r;
    l = r = 0;
    while (ar[r] > 0) {
        r++;
    }
    for (int i = 1; i < n; i++) {
        al[a[i]]++;
        ar[a[i]]--;
        if (ar[a[i]] == 0) {
            if (r > a[i]) {
                r = a[i] + 1;
            }
        }
        while (al[l] > 0) {
            l++;
        }
        while (r > 0 && ar[r - 1] == 0) {
            r--;
        }
        if (l == r) {
            cout << 2 << endl;
            cout << 1 << ' ' << i << endl;
            cout << i + 1 << ' ' << n << endl;
            return;
        }
    }
    cout << -1 << endl;
}

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

C.Messenger in MAC(贪心)

题意:

一个APP计划进行更新,开发人员希望在更新中优化显示给用户的信息集。目前共有 n n n条信息。每条信息由两个整数 a i a_i ai b i b_i bi表示。阅读数字为 p 1 , p 2 , … , p k p_1,p_2,\ldots,p_k p1,p2,,pk 1 ≤ p i ≤ n 1\le p_i\le n 1pin,所有 p i p_i pi都是不同的)的信息所花费的时间由公式计算得出:

∑ i = 1 k a p i + ∑ i = 1 k − 1 ∣ b p i − b p i + 1 ∣ \Large\sum_{i=1}^{k}a_{p_i}+\sum_{i=1}^{k-1}|b_{p_i}-b_{p_{i+1}}| i=1kapi+i=1k1bpibpi+1

注意,读取由一条编号为 p 1 p_1 p1的报文组成的报文集所需的时间等于 a p 1 a_{p_1} ap1。此外,读取一组空信息的时间为 0 0 0

用户可以确定他愿意在APP上花费的时间 l l l。APP必须告知用户信息集的最大可能大小,其阅读时间不超过 l l l。请注意,信息集的最大大小可以等于 0 0 0

开发人员未能实现这一功能,帮助他们解决这一问题。

分析:

同样的元素集合,一定是按照 b b b升序排列花费最小。所以将 b b b进行升序排序,枚举左右两个端点, b b b的总和就确定了。取区间中尽量多的最小的 a a a,使得花费小于等于 l l l

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;

void solve() {
    LL n, m;
    cin >> n >> m;
    vector<pair<LL, LL>> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i].first >> a[i].second;
    }
    sort(a.begin(), a.end(), [&](auto a, auto b) { return a.second < b.second; });
    LL ans = 0;
    for (int i = 1; i <= n; i++) {
        LL cnt = -a[i].second;
        priority_queue<int> q;
        for (int j = i; j <= n; j++) {
            q.push(a[j].first);
            cnt += a[j].first;
            if (!q.empty() && cnt + a[j].second > m) {
                cnt -= q.top();
                q.pop();
            }
            ans = max(ans, (LL) q.size());
        }
    }
    cout << ans << endl;
}

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

D.Exam in MAC(容斥)

题意:

硕士生中心公布了入学考试,考试内容如下。

给考生一个大小为 n n n的集合 s s s和一个整数 c c c。对于这个集合,计算出有多少对整数 ( x , y ) (x,y) (x,y)使得 0 ≤ x ≤ y ≤ c 0\leq x\leq y\leq c 0xyc,满足 x + y x+y x+y包含在集合 s s s中,以及 y − x y-x yx包含在集合 s s s中。

分析:

本题考虑容斥原理:

  • 总数 − ( x + y ) -(x+y) (x+y)属于 a [ i ] a[i] a[i]的方案数 − ( x − y ) -(x-y) (xy)属于 a [ i ] a[i] a[i]的方案数 + ( x + y ) +(x+y) +(x+y) ( x − y ) (x-y) (xy)属于 a [ i ] a[i] a[i]的方案数;
  • 对于 x + y = a [ i ] x+y=a[i] x+y=a[i]的个数就是 a [ i ] / 2 + 1 a[i]/2+1 a[i]/2+1
  • 对于 y − x = a [ i ] y-x=a[i] yx=a[i]的个数就是 c − a [ i ] + 1 c-a[i]+1 ca[i]+1的个数
  • 对于重复的,发现如果 x + y x+y x+y x − y x-y xy确定,则 x , y x,y x,y就确定了,而有解条件是 x + y x+y x+y x − y x-y xy同奇偶,那么把 s s s中的元素的奇数和偶数分别统计一下即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        LL n, c;
        cin >> n >> c;
        LL t1, t2, t3, t4;
        t1 = t2 = t3 = t4 = 0;
        for (LL i = 1; i <= n; i++) {
            int x;
            cin >> x;
            t1 += (x / 2) + 1;
            t2 += (c - x + 1);
            if (x & 1)
                t3++;
            else
                t4++;
        }
        c++;
        cout << c * (c - 1) / 2 + c - t1 - t2 + t3 * (t3 - 1) / 2 + t4 * (t4 - 1) / 2 + t3 + t4 << endl;
    }
    return 0;
}

E.Distance Learning Courses in MAC(前缀和)

题意:

研究生中心的新年已经到来,是时候推出一项新功能了!

现在,学生可以选修远程学习课程,共有 n n n门课程可供选择。对于第 i i i门远程学习课程,学生可以获得从 x i x_i xi y i y_i yi不等的成绩。

但是,并不是所有的课程每个学生都可以选修。具体来说,第 j j j名学生只能选修 l j l_j lj r j r_j rj的课程,即 l j , l j + 1 , … , r j l_j,l_j+1,\ldots,r_j lj,lj+1,,rj的远程学习课程。

远程学习课程的创建者决定用一种特殊的方式来确定最终成绩。让第 j j j名学生在他们的远程学习课程中获得 c l j , c l j + 1 , … , c r j c_{l_j},c_{l_j+1},\ldots,c_{r_j} clj,clj+1,,crj 的成绩。那么他们的最终成绩将等于 c l j c_{l_j} clj ∣ | c l j + 1 c_{l_j+1} clj+1 ∣ | … \ldots ∣ | c r j c_{r_j} crj ∣ | 表示按位或。

由于解决远程学习课程的聊天机器人坏了,对于 q q q个学生中的每一个,请你告诉他们可以达到的最高期末成绩。

分析:

首先考虑 x = 0 x=0 x=0。我们从最高有效位遍历到最低有效位,并尝试将它们包含在答案中。假设我们遍历第 i i i位,那么如果这样的一位在 y y y个数字中出现了 c c c次,就会出现几种情况:

  • c = 0 c=0 c=0 - 答案中不能包含该位
  • c = 1 c=1 c=1 - 该位将包含在答案中,我们将其加上
  • c > 1 c\gt 1 c>1 - 一种特殊情况,因为对于一个有位x的数字,我们可以设置它,而对于另一个数字,我们可以设置所有位 j < i j\lt i j<i

因此,如果我们遇到某个位 i i i出现不止一次,那么答案中也会包含所有位 j ≤ i j\le i ji

然后考虑原问题,我们取一对数字 ( x i , y i ) (x_i,y_i) (xi,yi),并找到按位最大的公共前缀,称之为数 w w w。显然, w w w的所有位都将包含在答案中,然后我们再建立一对新的数对 ( x i ′ , y i ′ ) (x^{'}_{i},y^{'}_{i}) (xi,yi)= ( x i − w , y i − w ) (x_i-w,y_i-w) (xiw,yiw),并记住数字 w i w_i wi。注意数字 y i ′ − 1 ≥ x i ′ y^{'}_{i}-1\ge x^{'}_{i} yi1xi。在某些位出现不止一次的情况下,我们会把它和所有更小的位加到答案中。为此,我们将在这个位置上设置一个等于 2 i − 1 2^i-1 2i1的数字(而其他较大的比特位则设置为 i i i)。但如果是 y i − 1 ′ ≥ x i ′ y^{'}_{i-1}\ge x^{'}_{i} yi1xi ,那么我们总是可以将所有这些位相加。

因此,求 j j j的求解算法如下:

  • 取所有 w i w_i wi的按位或结果( l j ≤ i ≤ r j l_j\le i\le r_j ljirj),设为数字 W W W
  • 对位 i i i进行遍历,与 x = 0 x=0 x=0的情况类似,对数组 y ′ y^{'} y进行遍历。同时,考虑到该位出现在 W W W中。

这种解法可以使用每个位的前缀和来实现。时间复杂度为 O ( n ⋅ log ⁡ n ) O(n\cdot\log n) O(nlogn)

代码:

#include <bits/stdc++.h>

using namespace std;
template<class T>
using vc = vector<T>;

const int N = 2e5;
const int bit = 30;

struct segtree {
    vc<int> t;
    int n;

    segtree(int n) : n(n) {
        t.resize(n * 2);
    }

    void upd(int i, int x) {
        for (t[i += n] = x; i > 1; i >>= 1) {
            t[i >> 1] = t[i] | t[i ^ 1];
        }
    }

    int get(int l, int r) {
        int res = 0;
        for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
            if (l & 1)
                res |= t[l++];
            if (r & 1)
                res |= t[--r];
        }
        return res;
    }
};

int n;
int l[N], r[N];
int w[N];

void fix() {
    for (int i = 0; i < n; ++i) {
        if (l[i] == r[i]) {
            w[i] = l[i];
            l[i] = r[i] = 0;
            continue;
        }
        int pref = (1 << (__lg(l[i] ^ r[i]) + 1)) - 1;
        w[i] = r[i] - (r[i] & pref);
        r[i] &= pref;
        l[i] &= pref;
    }
}

void solve() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> l[i] >> r[i];
    }
    fix();
    segtree t(n);
    vc<vc<int>> bits(bit, vc<int>(n + 1));
    for (int i = 0; i < n; ++i) {
        t.upd(i, w[i]);
        for (int j = 0; j < bit; ++j) {
            bits[j][i + 1] = bits[j][i];
            if (r[i] >> j & 1) {
                bits[j][i + 1]++;
            }
        }
    }
    int q;
    cin >> q;
    while (q--) {
        int x, y;
        cin >> x >> y;
        --x;
        int ans = t.get(x, y);
        for (int j = bit - 1; j >= 0; --j) {
            int cnt = bits[j][y] - bits[j][x] + (ans >> j & 1);
            if (cnt > 1) {
                ans |= (2 << j) - 1;
                break;
            } else if (cnt == 1) {
                ans |= 1 << j;
            }
        }
        cout << ans << ' ';
    }
    cout << "\n";
}

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

赛后交流

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

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

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

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

相关文章

软件测试技术分享 | 测试环境搭建

被测系统的环境搭建&#xff0c;是我们作为软件测试人员需要掌握的技能。 被测系统AUT (Application Under Test) 常见的被测系统即需要被测试的 app&#xff0c;网页和后端服务。大致分为两个方面移动端测试和服务端测试&#xff0c;如下图所示&#xff1a; 常见的被测系统类…

javaSE-----继承和多态

目录 一.初识继承&#xff1a; 1.1什么是继承&#xff0c;为什么需要继承&#xff1a; 1.2继承的概念与语法&#xff1a; 二.成员的访问&#xff1a; 2.1super关键字 2.2this和super的区别&#xff1a; 三.再谈初始化: 小结&#xff1a; 四.初识多态&#xff1a; 4.1多…

RabbitMQ架构详解

文章目录 概述架构详解核心组件虚拟主机&#xff08;Virtual Host&#xff09;RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件&#xff0c;支持多种协议和集群扩展。并且支持消息持久化和镜像队列&#xff0c;适用于对消息可靠性较高的场合 官网https://www.…

ubuntu22.01安装及配置

前言 本次安装基于VMware Pro 16进行安装。 ubuntu版本&#xff1a;ubuntu-22.04.3-live-server-amd64.iso 1、下载 1.1官网下载 https://ubuntu.com/download 1.2、清华大学镜像网站下载 https://mirrors.tuna.tsinghua.edu.cn/ 进入网站后搜索ubuntu&#xff0c;选择ubu…

谷粒商城【成神路】-【10】——缓存

目录 &#x1f9c2;1.引入缓存的优势 &#x1f953;2.哪些数据适合放入缓存 &#x1f32d;3.使用redis作为缓存组件 &#x1f37f;4.redis存在的问题 &#x1f9c8;5.添加本地锁 &#x1f95e;6.添加分布式锁 &#x1f95a;7.整合redisson作为分布式锁 &#x1f697…

uniapp封装文字提示气泡框toolTip组件

uniapp封装文字提示气泡框toolTip组件 文字提示气泡框&#xff1a;toolTip 因为uniapp 中小程序中没有window对象&#xff0c;需手动调用 关闭 第一种办法关闭&#xff1a;this.$refs.tooltip.close() 第二种办法关闭&#xff1a;visible.sync false 移动端没有现成的toolTip组…

pytorch项目代码记录

目录 1.超过二维的张量写进csv 2.翻转矩阵与绘制热力图 3.切片 4.np按块复制 1.超过二维的张量写进csv #(20,204,273) -> (4080,273) ycsv []for i in range(20):ycsv.append(y[i, 8, :, :].reshape(204,273))with open(y.csv,w,encodingutf-8) as y_obj:writer csv.…

SpringCloud 服务的注册与发现

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第二篇&#xff0c;即使用服务注册和发现的组件&#xff0c;此篇文章会介绍 Eureka、Zookeeper 和 Consu…

C++初阶 类(上)

目录 1. 什么是类 2. 如何定义出一个类 3. 类的访问限定符 4. 类的作用域 5. 类的实例化 6. 类的大小 7. this指针 1.this指针的引出 2. this指针的特性 8. 面试题 1. 什么是类 在C语言中&#xff0c;不同类型的数据集合体是结构体。为了方便管理结构体&#xff0c;我…

CVHub | 万字长文带你全面解读视觉大模型(建议收藏!)

本文来源公众号“CVHub”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;万字长文带你全面解读视觉大模型 0 导读 众所周知&#xff0c;视觉系统对于理解和推理视觉场景的组成特性至关重要。这个领域的挑战在于对象之间的复杂关系…

centos7 python3.12.1 报错 No module named _ssl

https://blog.csdn.net/Amio_/article/details/126716818 安装python cd /usr/local/src wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz tar -zxvf Python-3.12.1.tgz cd Python-3.12.1/ ./configure -C --enable-shared --with-openssl/usr/local/opens…

Docker镜像及Dockerfile详解

1 Docker镜像用途 统一应用发布的标准格式支撑一个Docker容器的运行 2 Docker镜像的创建方法 基于已有镜像创建基于本地模板创建基于Dockerfile创建 &#xff08;实际环境中用的最多&#xff09; 2.1 基于已有镜像的创建 将容器里面运行的程序及运行环境打包生成新的镜像 …

网络工程师笔记10 ( RIP / OSPF协议 )

RIP 学习路由信息的时候需要配认证 RIP规定超过15跳认定网络不可达 链路状态路由协议-OSPF 1. 产生lsa 2. 生成LSDB数据库 3. 进行spf算法&#xff0c;生成最有最短路径 4. 得出路由表

IOS开发0基础入门UIkit-1cocoapod安装、更新和使用 , 安装中出现的错误及解决方案 M1或者M2安装cocoapods

cocoapod是ios开发时常用的包管理工具 1.M1或者是M2系统安装cocoapods先操作一下两个设置 1、打开访达->应用->实用工具->终端->右键点击终端->显示简介->勾选使用 Rosetta 打开&#xff0c;关闭终端&#xff0c;重新打开。 2、打开访达->应用->Xcod…

如何制作一个分销商城小程序_揭秘分销商城小程序的制作秘籍

打造赚钱神器&#xff01;揭秘分销商城小程序的制作秘籍 在这个数字化高速发展的时代&#xff0c;拥有一个属于自己的分销商城小程序&#xff0c;已成为众多商家和创业者的必备利器。它不仅能够快速搭建起自己的在线销售渠道&#xff0c;还能够利用分销模式&#xff0c;迅速裂…

处理error: remote origin already exists.及其Gitee文件上传保姆级教程

解决error: remote origin already exists.&#xff1a; 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin &#xff08;HTTPS&#xff09; 比如这样&#xff1a; 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…

spm用于颅骨去除和配准

1. 颅骨去除 出现这个界面就一直等待即可&#xff1a; segment的结果文件中会出现四个文件夹label、mri、report、surf 在mri文件中&#xff0c;mwp1是分割出来的灰质图像&#xff0c;mwp2是分割出来的白质图像&#xff0c;这两图像均是bias correction和空间配准后的。p0**…

log4j2 远程代码执行漏洞复现(CVE-2021-44228)

写在前面 log4j 对应的是 CVE-2017-5645&#xff0c;即 Apache Log4j Server 反序列化命令执行漏洞&#xff1b; log4j2 对应的是 CVE-2021-44228&#xff0c;即 log4j2 远程代码执行漏洞&#xff0c;通过 JNDI 注入实现&#xff1b; CVE-2017-5645 比较久远因此我们这里不做…

mysql的语法学习总结3(一些常见的问题)

执行后&#xff0c;MySQL 会重新加载授权表并更新权限。 FLUSH PRIVILEGES; 怎么检查自己的电脑端口3306有没有被占用&#xff1f; ESTABLISHED表示被占用&#xff0c;LISTENING表示端口正在被监听&#xff0c;22696是占用该端口的进程的PID&#xff08;进程标识符&#xff0…

羊大师揭秘,女性喝羊奶有什么好处

羊大师揭秘&#xff0c;女性喝羊奶有什么好处 女性喝羊奶有多种好处。首先&#xff0c;羊奶富含钙元素&#xff0c;有助于预防女性体内缺钙和老年女性骨质疏松&#xff0c;从而增强骨骼密度。其次&#xff0c;羊奶中的色氨酸和烟酸等成分有助于促进睡眠&#xff0c;改善睡眠质…